首页/数据/数据库速查/字符串函数:CONCAT / SUBSTRING / REPLACE / TRIM / LENGTH
SQL 语法52 条

字符串函数:CONCAT / SUBSTRING / REPLACE / TRIM / LENGTH

拼接、截取、替换、去空白与长度;函数作用于列会让索引失效,能用前缀匹配替代就不要包函数。

数据库速查数据更新于 2026-10-13

字符串函数是什么

字符串函数用于拼接、截取、替换、去空白与取长度。用哪个、写在哪,会直接影响能否走索引:函数作用在列上会让索引失效,例如 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 的通配符与字符串函数的转义规则不同:用户输入里同时含 % 或 _ 时必须单独转义,否则匹配范围会意外扩大,甚至触发全表扫描。

易错点

  • CONCAT 某一参数为 NULL 导致整体为 NULL:拼接结果静默消失
  • 用 LENGTH 做字符数校验:多字节字符集下长度判断直接出错
  • 在 WHERE 里对索引列使用字符串函数:索引失效退化为全表扫描
  • 把用户输入直接拼进 LIKE 模式:通配符未转义,匹配范围失控
  • 在索引列上包 LOWER 做大小写无关查询:索引失效,应改用不区分大小写的排序规则

数据来源与参考

  • MySQL 8.0 Reference Manual: String Functions

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌