length返回字节长度,char_length返回字符数,处理多字节字符时需注意区别;2. concat用于拼接字符串,concat_ws可指定分隔符并忽略null值;3. substring用于截取子串,支持正负位置参数;4. replace全局替换子串,instr/locate查找子串位置;5. trim/ltrim/rtrim去除空格或指定字符;6. upper/lower转换大小写;7. lpad/rpad用于左右填充;8. find_in_set在逗号分隔列表中查找值,但性能差且不推荐用于规范化设计;9. 数据清洗中常组合使用trim、lower、replace等函数统一格式;10. 在索引列上使用函数会导致索引失效,应通过预处理数据或创建生成列索引优化;11. like 'prefix%'可走索引,而'%abc'或'%abc%'不能;12. 多字节字符集下应使用char_length和substring按字符操作;13. regexp/rlike支持正则匹配但性能较低且无法使用索引;14. find_in_set适用于简单场景,但应优先采用关联表实现多值属性;15. convert和cast可用于字符集转换,适用于数据迁移或同步场景;熟练掌握这些函数及其性能影响,能有效提升数据处理效率与查询性能,是mysql文本处理的核心技能。

MySQL中常用的字符串函数,它们是处理文本数据的瑞士军刀,能帮我们完成拼接、截取、查找、替换、格式化等一系列操作。理解并熟练运用这些函数,对于数据清洗、报表生成乃至日常的SQL查询效率都有着不可小觑的影响。说实话,很多时候数据源并不那么“干净”,字符串函数就是我们去“打磨”它们的利器。
谈到MySQL的字符串函数,我个人觉得它们可以大致分为几类,这样理解起来会更有条理。
1. 基础操作:长度与连接
LENGTH(str)
CHAR_LENGTH(str)
LENGTH
CHAR_LENGTH
LENGTH('你好')CHAR_LENGTH('你好')SELECT LENGTH('Hello World'), CHAR_LENGTH('Hello World');
-- 结果:11, 11
SELECT LENGTH('你好世界'), CHAR_LENGTH('你好世界');
-- 结果:12, 4 (假设UTF-8编码)CONCAT(str1, str2, ...)
CONCAT_WS(separator, str1, str2, ...)
CONCAT
CONCAT_WS
SELECT CONCAT('Hello', ' ', 'World');
-- 结果:Hello World
SELECT CONCAT_WS('-', '2023', '10', '26');
-- 结果:2023-10-26
SELECT CONCAT_WS('-', 'First', NULL, 'Last');
-- 结果:First-Last2. 内容处理:查找与替换
SUBSTRING(str, pos, len)
SUBSTR(str, pos, len)
pos
len
pos
SELECT SUBSTRING('MySQL Functions', 5, 9);
-- 结果:L Function
SELECT SUBSTRING('MySQL Functions', -9); -- 从倒数第9个字符开始到结束
-- 结果:FunctionsREPLACE(str, from_str, to_str)
SELECT REPLACE('Hello World', 'World', 'MySQL');
-- 结果:Hello MySQLINSTR(str, substr)
LOCATE(substr, str)
INSTR
str
substr
LOCATE
substr
str
SELECT INSTR('MySQL Functions', 'Func');
-- 结果:7
SELECT LOCATE('Func', 'MySQL Functions');
-- 结果:7LEFT(str, len)
RIGHT(str, len)
SELECT LEFT('MySQL Functions', 5);
-- 结果:MySQL
SELECT RIGHT('MySQL Functions', 9);
-- 结果:Functions3. 格式化与清理
TRIM([BOTH | LEADING | TRAILING] [remstr FROM] str)
LTRIM
RTRIM
SELECT TRIM(' Hello World ');
-- 结果:Hello World
SELECT LTRIM(' Hello World ');
-- 结果:Hello World
SELECT TRIM(LEADING 'x' FROM 'xxxHello Worldxxx');
-- 结果:Hello WorldxxxUPPER(str)
LOWER(str)
SELECT UPPER('hello world');
-- 结果:HELLO WORLD
SELECT LOWER('HELLO WORLD');
-- 结果:hello worldLPAD(str, len, padstr)
RPAD(str, len, padstr)
SELECT LPAD('123', 5, '0');
-- 结果:00123FIND_IN_SET(str, strlist)
FIND_IN_SET
SELECT FIND_IN_SET('apple', 'apple,banana,orange');
-- 结果:1在实际工作中,数据往往不会像教科书里那么规整。字符串函数在数据清洗和格式化方面,简直是我们的救星。我举几个常见的例子:
想象一下,你从不同系统导入的用户数据,有的姓名是“张三”,有的是“zhang san”,还有的是“ 张三 ”。这时候,我们可能需要统一格式:
-- 去除多余空格并统一大小写
UPDATE users
SET user_name = TRIM(user_name),
email = LOWER(TRIM(email));再比如,你有一列电话号码,格式五花八门,有的是“13812345678”,有的是“+86-138-1234-5678”,你只想提取纯数字:
-- 假设我们需要移除所有非数字字符 -- 这是一个比较复杂的场景,可能需要多次REPLACE或配合正则表达式 -- MySQL 8.0+ 支持 REGEXP_REPLACE,更强大 -- 假设我们只移除连字符和空格 UPDATE contacts SET phone_number = REPLACE(REPLACE(phone_number, '-', ''), ' ', '');
还有一种情况,商品描述里混入了HTML标签,或者需要截取前N个字符作为简介:
-- 截取前100个字符作为简介,并确保多字节字符不被截断一半 -- 这里CHAR_LENGTH就派上用场了 SELECT SUBSTRING(description, 1, 100) FROM products;
在我看来,这些看似简单的函数,组合起来就能解决大部分数据“脏”的问题。关键在于你对数据的理解,以及如何巧妙地运用这些工具。
说到字符串函数,就不得不提它们对查询性能的影响,尤其是和索引的关系。这块儿我踩过不少坑,也总结了一些经验。
核心思想是:对索引列使用函数,通常会导致索引失效。
举个例子,如果你在
user_name
SELECT * FROM users WHERE LOWER(user_name) = 'john doe';
很遗憾,即使
user_name
user_name
LOWER()
那么,有没有办法既使用函数又利用索引呢?
WHERE user_name = 'john doe'
ALTER TABLE users ADD COLUMN user_name_lower VARCHAR(255) GENERATED ALWAYS AS (LOWER(user_name)) STORED; CREATE INDEX idx_user_name_lower ON users (user_name_lower); -- 这样查询就能走索引了 SELECT * FROM users WHERE user_name_lower = 'john doe';
STORED
VIRTUAL
STORED
WHERE
-- 慢:LOWER(user_name) = 'john'
-- 优:user_name = UPPER('john') -- 假设user_name存的是大写LIKE 'prefix%'
WHERE column LIKE 'abc%'
LIKE '%abc'
LIKE '%abc%'
FULLTEXT
总之,在使用字符串函数时,多想一步:它会不会让我的索引失效?如果会,有没有其他办法来优化?这才是我们作为开发者需要深入思考的地方。
除了前面提到的基本操作,MySQL的字符串函数在处理更复杂文本和多语言字符集时,还有一些值得深入探讨的地方。
1. 多字节字符集(UTF-8等)的陷阱与应对
前面提到了
LENGTH
CHAR_LENGTH
utf8
utf8mb4
utf8mb4
SUBSTRING
len
COLLATE utf8mb4_unicode_ci
2. 正则表达式:REGEXP
RLIKE
MySQL提供了
REGEXP
RLIKE
LIKE
-- 查找所有包含数字的用户名 SELECT user_name FROM users WHERE user_name REGEXP '[0-9]'; -- 查找以字母开头,后面跟着任意数量数字的字符串 SELECT data FROM my_table WHERE data REGEXP '^[a-zA-Z][0-9]*$';
虽然正则表达式功能强大,但它的性能开销通常比简单的字符串匹配要大得多,并且无法利用索引。所以,只有在标准函数无法满足需求时,才考虑使用它。
3. FIND_IN_SET
FIND_IN_SET
-- 查找爱好列表中包含“阅读”的用户
SELECT user_name FROM users WHERE FIND_IN_SET('阅读', hobbies);它的优点是方便,但缺点也明显:
我个人强烈建议,如果可以,尽量将这种多值属性进行规范化,拆分成独立的关联表。比如,
users
user_hobbies
user_hobbies
user_id
hobby_id
4. 字符集转换函数:CONVERT
CAST
在不同字符集之间进行转换时,
CONVERT
CAST
-- 将字符串从一种字符集转换为另一种
SELECT CONVERT('你好' USING utf8mb4);这在处理跨系统数据同步,或者旧数据迁移到新字符集时会用到。
总的来说,MySQL的字符串函数提供了非常丰富的功能,能够应对各种文本处理挑战。但就像任何工具一样,理解其工作原理、性能影响和适用场景,才能真正发挥它们的威力。尤其是在处理大量数据或高并发场景下,对函数选择和索引策略的权衡,往往决定了你的应用性能上限。
以上就是MySQL中常用的字符串函数有哪些 MySQL字符串函数全解析与应用技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号