MySQL存储秘密揭示:CHAR vs.VARCHAR,解锁定长神器的终极选择指南!( 二 )

结果是都可以显示 。
不过,如果做了concat操作 , 结果如下:
mysql> select c_char,c_varchar,concat(c_char,'concat'),concat(c_varchar,'concat') from tb_char;+--------+-----------+-------------------------+----------------------------+| c_char | c_varchar | concat(c_char,'concat') | concat(c_varchar,'concat') |+--------+-----------+-------------------------+----------------------------+| a| a| aconcat| aconcat|| 张三| 张三| 张三concat| 张三concat|| tc一| tc一| tc一concat| tc一concat|| abc| abc| abcconcat| abc concat|+--------+-----------+-------------------------+----------------------------+

MySQL存储秘密揭示:CHAR vs.VARCHAR,解锁定长神器的终极选择指南!

文章插图
2、PAD_CHAR_TO_FULL_LENGTH 模式将SQL模式改为PAD_CHAR_TO_FULL_LENGTH后 , 再对比看一下 。
mysql>set sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';Query OK, 0 rows affected (0.00 sec)mysql> select * fromtb_char;+----+----------------+-----------+| id | c_char| c_varchar |+----+----------------+-----------+|1 | a| a||2 | 张三| 张三||3 | tc一| tc一||4 | abc| abc|+----+----------------+-----------+4 rows in set (0.00 sec)mysql> select c_char,c_varchar, length(c_char)len_char,length(c_varchar)len_varchar,char_length(c_char),char_length(c_varchar) from tb_char;+----------------+-----------+----------+-------------+---------------------+------------------------+| c_char| c_varchar | len_char | len_varchar | char_length(c_char) | char_length(c_varchar) |+----------------+-----------+----------+-------------+---------------------+------------------------+| a| a|10 |1 |10 |1 || 张三| 张三|14 |6 |10 |2 || tc一| tc一|12 |5 |10 |3 || abc| abc|10 |4 |10 |4 |+----------------+-----------+----------+-------------+---------------------+------------------------+4 rows in set (0.00 sec)
MySQL存储秘密揭示:CHAR vs.VARCHAR,解锁定长神器的终极选择指南!

文章插图
此时使用concat,结果如下:
mysql> select c_char,c_varchar,concat(c_char,'concat'),concat(c_varchar,'concat') from tb_char;+----------------+-----------+-------------------------+----------------------------+| c_char| c_varchar | concat(c_char,'concat') | concat(c_varchar,'concat') |+----------------+-----------+-------------------------+----------------------------+| a| a| aconcat| aconcat|| 张三| 张三| 张三concat| 张三concat|| tc一| tc一| tc一concat| tc一concat|| abc| abc| abcconcat| abc concat|+----------------+-----------+-------------------------+----------------------------+4 rows in set (0.00 sec)
MySQL存储秘密揭示:CHAR vs.VARCHAR,解锁定长神器的终极选择指南!

文章插图
可见,此时char类型每一行的末尾都已经填充了空格 。
使用‘abc’及‘abc ’查看结果:
mysql> select * fromtb_char where c_char ='abc';+----+------------+-----------+| id | c_char| c_varchar |+----+------------+-----------+|4 | abc| abc|+----+------------+-----------+1 row in set (0.00 sec)mysql> select * fromtb_char where c_varchar ='abc';+----+------------+-----------+| id | c_char| c_varchar |+----+------------+-----------+|4 | abc| abc|+----+------------+-----------+1 row in set (0.00 sec)mysql> select * fromtb_char where c_char ='abc ';+----+------------+-----------+| id | c_char| c_varchar |+----+------------+-----------+|4 | abc| abc|+----+------------+-----------+1 row in set (0.00 sec)mysql> select * fromtb_char where c_varchar ='abc ';+----+------------+-----------+| id | c_char| c_varchar |+----+------------+-----------+|4 | abc| abc|+----+------------+-----------+1 row in set (0.00 sec)mysql> select * fromtb_char where c_char ='abc';+----+------------+-----------+| id | c_char| c_varchar |+----+------------+-----------+|4 | abc| abc|+----+------------+-----------+1 row in set (0.00 sec)
MySQL存储秘密揭示:CHAR vs.VARCHAR,解锁定长神器的终极选择指南!

文章插图
该结果是没有区别的 。
三、字符串长度查看函数在MySQL中,字符串计算函数有如下几种,在使用是注意区分 。
1、LENGTH 函数用于返回字符串的字节数 。对于英文字符,一个字符占用一个字节;而对于一些多字节字符(如UTF-8编码的中文字符),一个字符可能占用多个字节 。
SELECT LENGTH('Hello'); -- 返回 5SELECT LENGTH('你好');-- 返回 6(UTF-8编码中文字符占用3个字节)
MySQL存储秘密揭示:CHAR vs.VARCHAR,解锁定长神器的终极选择指南!

文章插图
2、CHAR_LENGTH 函数用于返回字符串的字符数,而不是字节数 。这意味着它会考虑字符的多字节性,确保正确地计算字符的数量 。
SELECT CHAR_LENGTH('Hello'); -- 返回 5SELECT CHAR_LENGTH('你好');-- 返回 2(两个中文字符)


推荐阅读