字符串函数是什么
字符串函数用于拼接、截取、替换、去空白与取长度。用哪个、写在哪,会直接影响能否走索引:函数作用在列上会让索引失效,例如 WHERE LEFT(sku,6)='ABC123' 用不上索引,改写成 sku LIKE 'ABC123%' 就可以。另一个常见陷阱是长度按字节还是按字符——在多字节字符集下两者差别很大。
基本信息
| 常用函数 | CONCAT、CONCAT_WS、SUBSTRING、REPLACE、TRIM、UPPER、LOWER |
|---|---|
| 长度函数 | LENGTH 按字节,CHAR_LENGTH 按字符 |
| 字符集影响 | utf8mb4 下 1 个汉字占 3 字节 |
| 索引影响 | 函数作用在索引列上会导致索引失效 |
| 空值处理 | CONCAT 任一参数为 NULL,结果整体为 NULL |
典型使用场景
- 拼接姓名、地址等展示字段
- 截取订单号或编码前缀做分组统计
- 清洗手机号、身份证号里的分隔符
- 校验字符串长度是否符合业务约束
- 排查「加了字符串函数之后查询变慢」
常用示例
常用示例
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
SELECT CONCAT_WS('-', 'A', NULL, 'B') AS joined; -- 忽略 NULL,得到 A-B
SELECT SUBSTRING(sku, 1, 6) AS prefix FROM orders LIMIT 3;
SELECT REPLACE(phone, '-', '') AS phone_raw FROM users;
SELECT CHAR_LENGTH('中文abc') AS chars, LENGTH('中文abc') AS bytes;
-- 上面结果分别是 5 和 9
SELECT IFNULL(NULLIF(nickname, ''), '匿名') AS shown FROM users;函数与易错点
| 函数 | 作用 | 易错点 |
|---|---|---|
| CONCAT | 拼接字符串 | 任一参数为 NULL 则整体为 NULL |
| SUBSTRING | 按位置和长度截取 | 起始位置从 1 开始,不是 0 |
| REPLACE | 替换全部匹配内容 | 是否区分大小写取决于排序规则 |
| TRIM | 去掉首尾空白 | 无法去掉字符串中间的空白 |
| LENGTH | 按字节计算长度 | utf8mb4 下汉字算 3 个字节 |
| CHAR_LENGTH | 按字符计算长度 | 业务校验字符数应该用它 |
utf8mb4 下一个汉字占 3 字节,判断「不能超过 20 个字符」这类约束必须用 CHAR_LENGTH;用 LENGTH 校验会把中文限制成 6 个多字,业务侧会先炸。入库前的应用层校验口径也要和数据库保持一致,否则两边规则不同。
函数作用在列上基本等于放弃索引:能用前缀匹配就别包函数,例如把 LEFT(col,6)='ABC123' 改写成 col LIKE 'ABC123%',执行计划会完全不同。改写完成后用 EXPLAIN 确认索引确实被用上了,再收工。
LIKE 的通配符与字符串函数的转义规则不同:用户输入里同时含 % 或 _ 时必须单独转义,否则匹配范围会意外扩大,甚至触发全表扫描。