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

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

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

当前回答

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

其他回答

LENGTH()返回以字节为单位的字符串长度。 CHAR_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个字节。

虽然@Andomar提供的答案是正确的,但我想提供一个更详细的答案。

英文名字-

假设我创建了一个变量@name来存储我的名字-

SET @name = "Payel Senapati";

现在,我创建了一个变量total_characters来存储我的名字占用的字符数-

SET @total_characters =  CHAR_LENGTH(@name);
SELECT @total_characters;
+-------------------+
| @total_characters |
+-------------------+
|                14 |
+-------------------+

案例1:

我创建了一个变量@test来存储@name转换为latin1字符集-

SET @test = CONVERT(@name USING latin1);

我创建了一个变量@total_bytes,并以字节-的形式存储@test的长度

SET @total_bytes = LENGTH(@test);
SELECT @total_bytes;
+--------------+
| @total_bytes |
+--------------+
|           14 |
+--------------+

现在,latin1字符集为每个字符分配1个字节。

因此,@total_characters = @total_bytes


案例2:

现在,在变量@test中,我存储@name转换为ucs2字符集-

SET @test = CONVERT(@name USING ucs2);

现在,在变量@total_bytes中,我以字节-的形式存储@test的长度

SET @total_bytes = LENGTH(@test);
SELECT @total_bytes;
+--------------+
| @total_bytes |
+--------------+
|           28 |
+--------------+

现在,ucs2字符集为每个字符分配2个字节。

因此,2 * @total_characters = @total_bytes


印度语名字

现在,我将我的名字存储在变量@name in Hindi -中

SET @name = "पायल सेनापति";

现在,在变量total_characters中,我存储了我的名字在印地语中占据的字符数

SET @total_characters =  CHAR_LENGTH(@name);
SELECT @total_characters;
+-------------------+
| @total_characters |
+-------------------+
|                14 |
+-------------------+

案例1:

现在,在变量@test中,我存储@name转换为ucs2字符集-

SET @test = CONVERT(@name USING ucs2);

现在,在变量@total_bytes中,我以字节-的形式存储@test的长度

SET @total_bytes = LENGTH(@test);
SELECT @total_bytes;
+--------------+
| @total_bytes |
+--------------+
|           28 |
+--------------+

现在,ucs2字符集为每个字符分配2个字节。

因此,2 * @total_characters = @total_bytes


案例2:

现在,在变量@test中,我存储的@name转换为utf32字符集-

SET @test = CONVERT(@name USING utf32);

现在,在变量@total_bytes中,我以字节-的形式存储@test的长度

SET @total_bytes = LENGTH(@test);
SELECT @total_bytes;
+--------------+
| @total_bytes |
+--------------+
|           56 |
+--------------+

现在,utf32字符集为每个字符分配4个字节。

因此,4 * @total_characters = @total_bytes


要查看MySQL支持的所有字符集,请使用-

SHOW CHARACTER SET;