mysql中字符串操作函数的使用与常见技巧

来源:这里教程网 时间:2026-02-28 20:44:02 作者:

字符串截取:SUBSTR 和 SUBSTRING 用法完全一致,但参数顺序容易错

SUBSTR(

str
,
pos
,
len
) 和 SUBSTRING(
str
,
pos
,
len
) 是同一个函数的两个别名,MySQL 中完全等价。关键陷阱在
pos
:它从 1 开始计数,不是 0 —— 这和大多数编程语言相反。

常见错误是写成

SUBSTR('abc', 0, 2)
想取前两个字符,结果返回空;正确写法是
SUBSTR('abc', 1, 2)
得到
'ab'

如果省略

len
,会从
pos
截到末尾:
SUBSTR('hello world', 7)
'world'

负数

pos
表示从末尾倒数(-1 是最后一个字符):
SUBSTR('abcde', -3, 2)
'cd'

字符串拼接:CONCAT 处理 NULL 会直接让整条结果变 NULL

CONCAT
不做空值容错,只要任意一个参数是
NULL
,整个结果就是
NULL
。这在拼接用户字段(如
first_name
last_name
)时极易出问题。

解决方法是用

CONCAT_WS
(带分隔符拼接)或显式用
IFNULL
/
COALESCE
替换:

SELECT CONCAT(IFNULL(first_name, ''), ' ', IFNULL(last_name, '')) AS full_name FROM users;

更简洁的写法是

CONCAT_WS(' ', first_name, last_name)
—— 它自动跳过
NULL
值,只用非空部分拼接,且不会在开头/结尾多加分隔符。

注意:

CONCAT_WS
的第一个参数必须是分隔符(字符串),不能是列名或表达式。

大小写转换与模糊匹配:LOWER/UPPER 配合 LIKE 才能真正忽略大小写

MySQL 的

LIKE
是否区分大小写,取决于字段的排序规则(collation)。但依赖排序规则不可靠,尤其当表结构不统一时。稳妥做法是显式转换:

想查邮箱以

gmail
结尾(不区分大小写):

SELECT * FROM users WHERE LOWER(email) LIKE '%@gmail.com';

但要注意性能:对列使用函数(如

LOWER(email)
)会使该列无法走索引。如果查询频繁,应确保字段本身用的是
_ci
(case-insensitive)排序规则,例如
utf8mb4_unicode_ci
,此时直接
email LIKE '%@gmail.com'
就够了。

临时需要大小写转换又不想改表?可以用生成列(generated column)加索引,但 MySQL 5.7+ 才支持。

查找与替换:REPLACE 不支持正则,复杂需求得用 REGEXP_REPLACE(MySQL 8.0+)

REPLACE(<code>str
,
from_str
,
to_str
) 是最常用替换函数,但它只做**全字面匹配替换**,不支持通配符或模式。比如
REPLACE('a1b2c3', '[0-9]', '*')
不会把数字全换成星号,而是字面匹配
'[0-9]'
这个字符串。

MySQL 8.0 引入了

REGEXP_REPLACE
,支持 PCRE 风格正则:

SELECT REGEXP_REPLACE('a1b2c3', '[0-9]', '*') AS result; -- 返回 'a*b*c*'

注意三点:

旧版本(
REGEXP_REPLACE
默认区分大小写,需加标志
'i'
实现忽略大小写
正则表达式中的反斜杠要写两个:
'\\d'
才表示 d

实际中,简单替换用

REPLACE
,带模式、范围、条件的替换,务必确认 MySQL 版本是否支持
REGEXP_REPLACE
,否则逻辑可能静默失效。

相关推荐