MySQL - length()vs char_length()

Yad*_*ada 210 mysql string

length()和之间的主要区别是char_length()什么?

我相信它与二进制和非二进制字符串有关.将字符串存储为二进制文件是否有任何实际原因?

mysql> select length('MySQL'), char_length('MySQL');
+-----------------+----------------------+
| length('MySQL') | char_length('MySQL') |
+-----------------+----------------------+
|               5 |                    5 |
+-----------------+----------------------+
1 row in set (0.01 sec)
Run Code Online (Sandbox Code Playgroud)

And*_*mar 345

LENGTH()返回以字节为单位测量字符串长度.
CHAR_LENGTH()返回以字符为单位的字符串长度.

这与Unicode特别相关,其中大多数字符以两个字节编码.或UTF-8,其中字节数变化.例如:

select length(_utf8 '€'), char_length(_utf8 '€')
--> 3, 1
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,欧元符号占用3个字节(它0xE282AC以UTF-8 编码),即使它只有一个字符.

  • 每个字符只有两个字节编码UCS-2.这种编码(或更准确地说是UTF-16LE)是Windows误导性地称之为"Unicode"的.MySQL不支持UTF-16; 相反,将Unicode字符串放入其中的通常方法是使用UTF-8. (6认同)
  • 在确定如何调整VARCHAR列的大小时,我应该使用哪些函数?创建表时,假设一列是VARCHAR(10).这将允许最多10个字符,或最多10个字节? (6认同)
  • 例如:select length('日本语'),char_length('日本语'); (2认同)
  • 实际上,通过Unicode术语,它仍然是2个字符,即使像所有组合标记一样,如果有合适的字体,它也可以呈现为单个字形.由于代理人,UTF-16LE仍然可以有4个字节的字符. (2认同)

小智 18

varchar(10)将存储10个字符,可能超过10个字节.在索引中,它将分配字段的最大长度 - 因此,如果您使用UTF8-mb4,它将为10个字符字段分配40个字节.