为何MySQL中BIT_LENGTH函数返回中文字符占2字节?
问题分析:MySQL中BIT_LENGTH对中文字符的计算差异
环境信息
MySQL版本:Ver 8.0.34 for Win64 on x86_64 (MySQL Community Server - GPL)
函数定义
BIT_LENGTH(str):返回字符串str的比特长度。若str为NULL则返回NULL。
测试过程
直接执行字符串计算
执行SQL语句:
select BIT_LENGTH('你好')/8;
得到结果:
+----------------------+ | BIT_LENGTH('你好')/8 | +----------------------+ | 4.0000 | +----------------------+
表中字段计算
创建表并添加名为Hello的列,插入你好后,执行:
select Hello from chinese_test;
得到结果:
+-------+ | Hello | +-------+ | NULL | | NULL | | NULL | | 你好 | +-------+
执行:
select LENGTH(Hello) from chinese_test;
得到结果:
+---------------+ | LENGTH(Hello) | +---------------+ | NULL | | NULL | | NULL | | 6 | +---------------+
问题解答
核心差异来自字符串字面量和表字段的字符集/编码规则不同:
- 直接使用字符串字面量时,你的MySQL会话大概率采用了
gbk或gb2312这类双字节中文编码,这类编码下一个中文字符占用2字节,你好共2个字符,总字节数为4,因此BIT_LENGTH('你好')/8返回4.0000。 - 表中
Hello字段的字符集应为utf8mb4(MySQL默认UTF-8编码),这类编码下一个中文字符占用3字节,你好总字节数为6,所以LENGTH(Hello)返回6。
BIT_LENGTH的计算完全依赖字符串实际存储的字节数,而字节数由当前上下文的字符集决定:会话字符集控制字面量的编码,表字段的字符集控制存储时的编码。你可以执行show variables like '%character_set%';查看当前会话和数据库的字符集配置,验证这一结论。
内容的提问来源于stack exchange,提问作者Berg Pss
相关产品推荐
相关产品推荐

