You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:32:10