证明char是定长的?
大部分博客都在讲解char和varchar区别的时候都谈到char为定长,varchar为变长。
但是怎么证明char为定长呢?
下面是我证明的过程。
-
创建CHAR列:首先,创建一个CHAR列,指定其长度。例如:
CREATE TABLE char_test ( id INT, name CHAR(10) );
在上面的示例中,name列被定义为CHAR(10),表示它将始终占用10个字符的空间。
-
插入不同长度的数据:接下来,插入不同长度的数据,并检查存储占用的空间。例如:
INSERT INTO char_test (id, name) VALUES (1, 'John'); INSERT INTO char_test (id, name) VALUES (2, 'Alice');
-
查看存储空间:使用以下SQL语句来查看存储空间的使用情况:
SELECT id, name, LENGTH(name) AS actual_length FROM char_test;
上述查询将返回:
+----+----------+---------------+ | id | name | actual_length | +----+----------+---------------+ | 1 | John | 4 | | 2 | Alice | 5 | +----+----------+---------------+
证明翻车!!!
为什么呢?为什么查询出来的长度不是10呢?
有点出乎笔者的意料。
这个时候我想到的是chatgpt。
我差点就相信它了!!但是我问它出处的时候?它又“人工智障”了。
这个时候我想到了MySQL官网找寻答案。
下面链接有详细char的介绍。
MySQL :: MySQL 8.0 Reference Manual :: 11.3.2 The CHAR and VARCHAR Types
重点来了。。。
当char的值在检索(查询)的时候,右边的填充空格被移除了。
那怎么办呢?后面不是给了一个SQL mode吗?修改SQL mode干一把。
mysql> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)
设置PAD_CHAR_TO_FULL_LENGTH模式。
mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
Query OK, 0 rows affected, 1 warning (0.00 sec)
在查询char类型字段的长度。
mysql> SELECT id, name, CHAR_LENGTH(name) AS character_length, LENGTH(name) AS byte_length FROM char_test;
+------+------------+------------------+-------------+
| id | name | character_length | byte_length |
+------+------------+------------------+-------------+
| 1 | John | 10 | 10 |
| 2 | Alice | 10 | 10 |
+------+------------+------------------+-------------+
2 rows in set (0.00 sec)
至此,终于是把char为定长证明出来了。
最后得出结论:
CHAR确实是定长的。
CHAR 在存储时会在右边填充空格以达到指定的长度,检索(查询)时会去掉空格。在PAD_CHAR_TO_FULL_LENGTH模式下会显示出空格。