MySQL-length()与char_length()的比较

MySQL-length()与char_length()的比较,mysql,string,Mysql,String,length()和char\u length()之间的主要区别是什么 我相信它与二进制和非二进制字符串有关。是否有实际的理由将字符串存储为二进制 mysql> select length('MySQL'), char_length('MySQL'); +-----------------+----------------------+ | length('MySQL') | char_length('MySQL') | +-----------------+----------------

length()
char\u length()
之间的主要区别是什么

我相信它与二进制和非二进制字符串有关。是否有实际的理由将字符串存储为二进制

mysql> select length('MySQL'), char_length('MySQL');
+-----------------+----------------------+
| length('MySQL') | char_length('MySQL') |
+-----------------+----------------------+
|               5 |                    5 |
+-----------------+----------------------+
1 row in set (0.01 sec)
LENGTH()
返回以字节为单位的字符串长度
CHAR\u LENGTH()
返回以字符度量的字符串长度

这与Unicode特别相关,在Unicode中,大多数字符编码为两个字节。或UTF-8,其中字节数不同。例如:

select length(_utf8 '€'), char_length(_utf8 '€')
--> 3, 1
正如您所见,欧元符号占用3个字节(在UTF-8中编码为
0xE282AC
),即使它只是一个字符。

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

每个字符只有UCS-2编码为两个字节。这种编码(或者更准确地说是UTF-16LE)就是Windows误导性地称之为“Unicode”的编码。MySQL不支持UTF-16;相反,通常将Unicode字符串放入其中的方法是使用UTF-8。例如:select length('日本語'), 字符长度('日本語');@bobince:即使是UCS-2也会将一些字符编码为2个以上的字节,例如
0313上面的逗号组合
。由于a=61,0x00610313显示为̓,占用4个字节。实际上,按照Unicode术语,这仍然是2个字符,尽管与所有组合标记一样,它可以 — 如果有合适的字体可用 — 被呈现为单个glyph。UTF-16LE仍然可以有一个4字节字符,但这要感谢代理。那么,在确定如何调整VARCHAR列的大小时,我应该使用这些函数中的哪一个呢?在创建表时,让我们假设一列是VARCHAR(10)。这将允许最多10个字符,或最多10个字节?是的,当二进制字符串实际上是二进制字符串(例如压缩字符串)时,存储二进制字符串是有实际原因的。