mysql字符串拼接必须用concat()函数,不可用+号;substring()与substr()完全等价;推荐left()/right()替代substring()取前后n位;注意字符集与索引失效风险。

MySQL字符串拼接用CONCAT(),不是+
MySQL不支持用+号拼接字符串(那会触发隐式类型转换,常导致意外结果,比如'abc' + 'def'变成0)。必须用CONCAT()函数,它接受任意数量参数,遇NULL直接返回NULL。
常见错误:拼接字段时某列含NULL,整条结果变NULL。解决方法是用CONCAT_WS()(带分隔符)或提前用IFNULL()/COALESCE()兜底:
SELECT CONCAT('ID:', id, ', Name:', name) FROM users;
-- 若name为NULL,整结果为NULL
<p>SELECT CONCAT('ID:', id, ', Name:', IFNULL(name, '')) FROM users;
SELECT CONCAT_WS(' | ', 'ID:', id, 'Name:', name) FROM users; -- 自动跳过NULL</p>
SUBSTRING()和SUBSTR()用法完全一样
这两个函数是同义词,都支持三种调用形式:SUBSTRING(str, pos)、SUBSTRING(str, pos, len)、SUBSTRING(str FROM pos FOR len)。注意pos从1开始(不是0),len可省略表示取到末尾。
容易踩的坑:
- pos为负数时,从字符串末尾倒数(
SUBSTRING('abcde', -2)→'de') - len为负数会报错,不能用
- pos超出长度返回空字符串,不会报错但可能掩盖逻辑问题
SELECT SUBSTRING('hello world', 7, 5); -- 'world'
SELECT SUBSTRING('hello world' FROM 7 FOR 5); -- 同上,等价写法
截取前N位或后N位的快捷写法
不需要硬算位置,MySQL提供了LEFT()和RIGHT()函数,语义更清晰、不易出错:
-
LEFT(str, n):取左边n个字符 -
RIGHT(str, n):取右边n个字符
比SUBSTRING(str, 1, n)和SUBSTRING(str, -n)更直观,且对中文、emoji等多字节字符行为一致(底层按字符计数,不是字节)。
SELECT LEFT('数据库', 2); -- '数据'
SELECT RIGHT('✅ABC', 3); -- 'ABC'(✅算1个字符)
性能与字符集要注意的地方
字符串函数本身开销不大,但若在WHERE或ORDER BY里大量使用(比如WHERE LEFT(name, 3) = '张'),会导致索引失效——MySQL无法用前缀索引加速这种计算。
另外,如果字段是utf8mb4,所有函数都按Unicode字符处理;但若表字符集是latin1,遇到中文会截断或乱码。务必确认字段实际字符集:
SHOW CREATE TABLE users;
拼接或截取前,先用CHAR_LENGTH()而非LENGTH()获取字符数——后者返回字节数,对中文不适用。











