处理文本数据的利器:MySQL 字符串函数
字符串函数在 MySQL 中主要用于字符串的拼接、截取、替换、查找和大小写转换等操作。以下是开发中最常用的几类字符串函数及其详细说明。
3. 字符串截取:SUBSTRING () / SUBSTR ()
核心作用:从字符串中提取指定部分。这两个函数在语法上完全一致,SUBSTR 是 SUBSTRING 的简写。
函数语法:
SUBSTRING(str, start, length)
str
: 目标字符串;
start
: 起始位置(正数从左开始,负数从右开始);
length
: 可选参数,截取长度(省略则截取到字符串末尾)。
实战示例:
-- 1. 从左侧截取(start 为正数)
SELECT SUBSTRING('13800138000', 1, 3) AS phone_prefix; -- 结果:138(截取前3位)
-- 2. 从右侧截取(start 为负数)
SELECT SUBSTRING('13800138000', -4) AS phone_suffix; -- 结果:8000(截取最后4位,省略length)
-- 场景:隐藏手机号中间4位
SELECT CONCAT(SUBSTR(phone,1,3), '****', SUBSTR(phone,-4)) AS hide_phone FROM user;
5. 大小写转换:UPPER () / LOWER ()
核心作用:将字符串转换为大写或小写。这在统一查询条件时非常有用,可以避免因大小写不同而产生的问题。
函数语法:
UPPER(str)
UCASE(str)
: 转换为大写;
LOWER(str)
LCASE(str)
: 转换为小写。
实战示例:
SELECT UPPER('mysql') AS upper_str; -- 结果:MYSQL
SELECT LOWER('MYSQL FUNCTION') AS lower_str; -- 结果:mysql function
-- 场景:不区分大小写查询用户名
SELECT * FROM user WHERE LOWER(username) = LOWER('ZhangSan');
1. 字符串拼接:CONCAT () / CONCAT_WS ()
核心作用:将多个字符串合并成一个字符串,适用于字段合并场景(如姓名 + 手机号、地址拼接)。
函数语法:
CONCAT(str1, str2, ...)
: 直接拼接多个字符串,
任意一个参数为 NULL 时,结果为 NULL
。
CONCAT_WS(separator, str1, str2, ...)
: 指定分隔符(separator)拼接,
自动忽略 NULL 值
(推荐日常使用)。
实战示例:
-- 1. CONCAT 拼接(注意 NULL 影响)
SELECT CONCAT('张三', '-', '13800138000') AS full_info; -- 结果:张三-13800138000
SELECT CONCAT('李四', '-', NULL) AS full_info; -- 结果:NULL(有 NULL 则整体为 NULL)
-- 2. CONCAT_WS 拼接(忽略 NULL,推荐)
SELECT CONCAT_WS('-', '北京市', '朝阳区', '建国路', NULL) AS full_address; -- 结果:北京市-朝阳区-建国路
4. 字符串替换:REPLACE ()
核心作用:将字符串中的指定子串替换成另一个子串。常用于数据清洗,例如去除特殊字符或统一格式。
函数语法:
REPLACE(str, old_str, new_str)
: 将 str 中的 old_str 替换为 new_str。
实战示例:
-- 1. 替换特殊字符
SELECT REPLACE('MySQL@2025#', '@#', '') AS clean_str; -- 结果:MySQL2025(去除@和#)
-- 2. 统一日期格式(将 / 替换为 -)
SELECT REPLACE('2025/11/20', '/', '-') AS standard_date; -- 结果:2025-11-20
-- 场景:清洗用户输入的空格
UPDATE user SET username = REPLACE(username, ' ', '') WHERE username LIKE '% %';
6. 去除空格:TRIM () / LTRIM () / RTRIM ()
核心作用:去除字符串前后的多余空格。这在处理用户输入时非常常见。
函数语法:
TRIM(str)
: 去除字符串前后两端的空格;
LTRIM(str)
: 仅去除左侧空格;
RTRIM(str)
: 仅去除右侧空格。
实战示例:
SELECT TRIM(' MySQL 函数 ') AS trim_str; -- 结果:MySQL 函数(前后空格去除)
SELECT LTRIM(' 左侧空格 ') AS ltrim_str; -- 结果:左侧空格 (仅左侧去除)
SELECT RTRIM(' 右侧空格 ') AS rtrim_str; -- 结果: 右侧空格(仅右侧去除)
-- 场景:清洗用户注册时的用户名空格
INSERT INTO user (username) VALUES (TRIM(' LiSi ')); -- 存储为:LiSi
2. 字符串长度:LENGTH () / CHAR_LENGTH ()
核心作用:获取字符串的字节长度或字符长度。在处理中文时,区分这两种长度非常重要。
函数语法:
LENGTH(str)
: 返回字符串的字节长度(UTF-8 编码下,1 个中文 = 3 个字节,1 个英文 = 1 个字节)。
CHAR_LENGTH(str)
: 返回字符串的字符长度(无论中英文,1 个字符 = 1 长度)。
实战示例:
-- 处理中文时的差异(UTF-8 编码)
SELECT
LENGTH('MySQL 字符串函数') AS byte_len, -- 结果:17(6个英文+1个空格+5个中文=6+1+5*3=17)
CHAR_LENGTH('MySQL 字符串函数') AS char_len; -- 结果:12(6+1+5=12)
-- 场景:校验用户名长度(要求 2-10 个字符)
SELECT username FROM user WHERE CHAR_LENGTH(username) BETWEEN 2 AND 10;
7. 字符串查找:LOCATE () / INSTR ()
核心作用:在目标字符串中查找子串的位置。如果找不到则返回 0。
函数语法:
LOCATE(substr, str, start)
: 从 start 位置开始查找 substr 在 str 中的位置(start 可选,默认从 1 开始);
INSTR(str, substr)
: 功能与 LOCATE 相同,但参数顺序相反(str 在前,substr 在后)。
实战示例:
SELECT LOCATE('函数', 'MySQL 字符串函数') AS pos; -- 结果:8(子串从第8个字符开始)
SELECT INSTR('MySQL 字符串函数', '字符串') AS pos; -- 结果:7
SELECT LOCATE('abc', 'MySQL') AS pos; -- 结果:0(未找到)
-- 场景:筛选包含特定关键词的内容
SELECT * FROM article WHERE LOCATE('MySQL', tit