证明char是定长的?

证明char是定长的?

大部分博客都在讲解char和varchar区别的时候都谈到char为定长,varchar为变长。

但是怎么证明char为定长呢?

下面是我证明的过程。

  1. 创建CHAR列:首先,创建一个CHAR列,指定其长度。例如:

    CREATE TABLE char_test (
        id INT,
        name CHAR(10)
    );
    

    在上面的示例中,name列被定义为CHAR(10),表示它将始终占用10个字符的空间。

  2. 插入不同长度的数据:接下来,插入不同长度的数据,并检查存储占用的空间。例如:

    INSERT INTO char_test (id, name) VALUES (1, 'John');
    INSERT INTO char_test (id, name) VALUES (2, 'Alice');
    
  3. 查看存储空间:使用以下SQL语句来查看存储空间的使用情况:

    SELECT id, name, LENGTH(name) AS actual_length FROM char_test;
    

    上述查询将返回:

    +----+----------+---------------+
    | id | name     | actual_length |
    +----+----------+---------------+
    | 1  | John     | 4            |
    | 2  | Alice    | 5            |
    +----+----------+---------------+
    

证明翻车!!!

为什么呢?为什么查询出来的长度不是10呢?

有点出乎笔者的意料。

这个时候我想到的是chatgpt。

证明char是定长的?_第1张图片

我差点就相信它了!!但是我问它出处的时候?它又“人工智障”了。

证明char是定长的?_第2张图片

这个时候我想到了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模式下会显示出空格。

你可能感兴趣的:(数据库,mysql,数据库)