SQL中统计字符串长度需区分字节数与字符数:MySQL/PostgreSQL用LENGTH()返回字节数(如'你好'为6),MySQL 5.5+和业务判断推荐CHAR_LENGTH()得字符数('你好'为2);SQL Server用LEN()返回字符数(忽略尾空格),DATALENGTH()得字节数。

SQL中统计字符串长度主要用LENGTH()(MySQL、PostgreSQL)或LEN()(SQL Server),不同数据库写法和细节有差异,用错容易返回NULL或截断结果。
LENGTH()函数基础用法
在MySQL和PostgreSQL中,LENGTH(str)返回字符串的字节数。例如中文字符在UTF8下占3字节,所以LENGTH('你好')返回6;而英文、数字、字母通常1字节一个。
注意:不是字符个数,是字节数。若需统计字符数,PostgreSQL可用CHAR_LENGTH()或LENGTH() OVER ()配合Unicode处理,MySQL 5.5+推荐用CHAR_LENGTH()更准确。
不同数据库的写法对照
MySQL:
– 字节数:LENGTH('abc') → 3
– 字符数:CHAR_LENGTH('你好') → 2(推荐用于业务逻辑判断)
PostgreSQL:
– 默认LENGTH()即字符长度,等价于CHAR_LENGTH()
– 若需字节数,用OCTET_LENGTH()
SQL Server:
– 用LEN(),忽略末尾空格,返回字符数
– 要包含空格用DATALENGTH()
实战常见问题与避坑建议
• 字段为NULL时,LENGTH(NULL)一律返回NULL,参与计算前务必用COALESCE(str, '')或IFNULL()兜底
• 比较字符串是否为空,别只用LENGTH(str) = 0,还要考虑空格——建议组合TRIM(str) = ''
• 在WHERE条件中慎用LENGTH()做索引字段过滤,可能导致全表扫描(无函数索引支持时)
• 导出数据校验长度限制(如用户名≤20字符),优先用CHAR_LENGTH()而非LENGTH(),避免UTF8多字节误判
结合业务场景的小技巧
• 截取固定字节但保留完整汉字:先用CHAR_LENGTH()判断,再用SUBSTRING()
• 统计用户昵称平均长度:AVG(CHAR_LENGTH(nickname))
• 查找超长昵称:WHERE CHAR_LENGTH(nickname) > 20
• 区分中英文混合长度:MySQL可搭配REGEXP粗略识别,但精确统计建议应用层处理










