mysql字符串处理函数是刚需工具:concat遇null返回null,concat_ws自动跳过null并支持分隔符;substring等按字符数截取,非字节数;trim不支持正则,replace全量替换;length返字节长度,char_length返字符长度。

MySQL 字符串处理函数不是“选配”,而是日常查询和清洗数据的刚需工具——不用它们,很多简单任务就得写冗长子查询或靠应用层拼接。
CONCAT 和 CONCAT_WS:拼接字符串时该选哪个?
两者都用于连接字符串,但行为差异直接影响可读性和健壮性:
-
CONCAT遇到NULL直接返回NULL,比如CONCAT('a', NULL, 'c')→NULL,容易意外中断整个字段输出 -
CONCAT_WS(WS = With Separator)自动跳过NULL参数,且第一个参数是分隔符,比如CONCAT_WS('-', '2026', '07', NULL, '01')→'2026-07-01' - 日期拼接推荐用
CONCAT_WS,避免因某字段为空导致整条记录失效;而固定格式拼接(如用户名+ID)可用CONCAT,但务必配合IFNULL或COALESCE
SUBSTRING、LEFT、RIGHT:截取字符串怎么不丢字符?
中文、emoji 等多字节字符容易踩坑,关键在长度单位理解:
-
SUBSTRING(str, pos, len)和LEFT(str, len)中的len是**字符数**,不是字节数。UTF8 下一个中文算 1 个字符,不是 3 个字节 - 想安全截取前 10 个汉字?直接用
LEFT(name, 10)即可;若用LENGTH判断字节长度,可能切在中文中间造成乱码 -
RIGHT同理,适合提取后缀(如文件扩展名),但注意RIGHT('测试.txt', 3)返回'.txt',不是'txt'
TRIM、REPLACE、LOWER/UPPER:空格、大小写、替换怎么一次到位?
这些函数常被连用,顺序和边界条件决定效果:
-
TRIM默认只去空格,要去掉其他字符得显式指定,比如TRIM(BOTH '_' FROM '__hello__')→'hello';TRIM不支持正则,别指望它删掉所有标点 -
REPLACE是全量替换,不区分位置,REPLACE('abcabc', 'ab', 'x')→'xcxc';想只替换开头或结尾,得结合SUBSTRING+CONCAT -
LOWER/UPPER对中文、数字无影响,但对带重音符号的字母(如 é)可能因 collation 不同表现不一致,生产环境建议统一用utf8mb4_0900_as_cs排序规则
LENGTH vs CHAR_LENGTH:查长度为什么有时结果不对?
这是最隐蔽也最容易出错的地方:
-
LENGTH返回**字节长度**,CHAR_LENGTH返回**字符长度** -
LENGTH('你好')返回6(UTF8 下每个汉字占 3 字节),CHAR_LENGTH('你好')返回2 - 做字段长度校验(如限制昵称最多 10 个汉字)必须用
CHAR_LENGTH;而判断二进制 blob 大小才用LENGTH - 建表时定义
VARCHAR(20)的 20 指的是字符数,不是字节数,所以CHAR_LENGTH才是与 schema 对齐的度量标准
真正麻烦的不是记不住函数名,而是忘记它们对 NULL、多字节字符、collation 的响应方式——写完 SQL 最好用真实数据(尤其是含中文、emoji、空值的样本)跑一遍,别只看单测里的 'abc'。











