MySQL字符串截取的核心要点和注意事项

 更新时间:2025年08月19日 09:24:30   作者:步行cgn  
这篇文章主要介绍了MySQL字符串截取的核心要点和注意事项,substr函数在数据处理中有着广泛的应用,从日志分析、数据报告生成到复杂的数据清洗和处理流程中,substr都能大显身手,需要的朋友可以参考下

我将全面讲解 MySQL 中字符串截取的核心要点和注意事项:

核心截取函数

1.SUBSTRING()/SUBSTR()

-- 基本语法
SELECT SUBSTRING('MySQL Tutorial', 7, 5); -- 'Tutor'

-- 负起始位置(从右向左)
SELECT SUBSTRING('Database', -4, 4); -- 'base'

2.LEFT()&RIGHT()

SELECT LEFT('Hello World', 5); -- 'Hello'
SELECT RIGHT('Hello World', 5); -- 'World'

3.SUBSTRING_INDEX()

-- 按分隔符截取
SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2); -- 'www.mysql'

八大关键注意事项

1.索引从1开始(不是0)

SELECT SUBSTRING('ABCDE', 1, 1); -- 'A' ✅
SELECT SUBSTRING('ABCDE', 0, 1); -- '' ❌

2.多字节字符问题(中文/emoji)

-- UTF8中文字符(每个占3字节)
SELECT SUBSTRING('中国', 2, 1); -- 乱码('�')

-- 解决方案:按字符截取
SELECT SUBSTRING('中国' FROM 2 FOR 1); -- '国' ✅

3.长度超限自动修正

-- 实际截取长度 = min(指定长度, 剩余长度)
SELECT SUBSTRING('Short', 2, 10); -- 'hort'

4.NULL处理规则

SELECT SUBSTRING(NULL, 1, 3); -- NULL
SELECT SUBSTRING('Text', NULL, 3); -- NULL

5.负起始位置计算

-- 公式:实际位置 = 字符串长度 + 负起始值 + 1
SELECT SUBSTRING('Database', -3, 3); -- 'ase'(位置6开始)

6.性能陷阱(大数据量)

-- 避免在WHERE中直接截取(无法使用索引)
SELECT * FROM users WHERE SUBSTRING(email, 5, 10) = 'example';

-- 优化方案:使用前缀索引
ALTER TABLE users ADD INDEX idx_email_prefix (email(15));
SELECT * FROM users WHERE email LIKE 'exam%';

7.与CHAR_LENGTH的区别

SELECT 
  LENGTH('中国'), -- 6字节(UTF8)
  CHAR_LENGTH('中国'), -- 2字符
  SUBSTRING('中国', 2, 1); -- 截取第2字节(乱码)

8.日期/数字转换问题

-- 数字需先转为字符串
SELECT SUBSTRING(20230815, 5, 2); -- 错误(数字截取)
SELECT SUBSTRING(CAST(20230815 AS CHAR), 5, 2); -- '08' ✅

实用截取技巧

1. 提取文件名

SELECT 
  SUBSTRING_INDEX('/path/to/file.txt', '/', -1); -- 'file.txt'

2. 邮箱域名提取

SELECT 
  SUBSTRING_INDEX('user@example.com', '@', -1); -- 'example.com'

3. 安全截取URL参数

SET @url = 'https://example.com/page?param=value#section';
SELECT
  SUBSTRING_INDEX(SUBSTRING_INDEX(@url, '?', -1), '#', 1); -- 'param=value'

4. 中文字符安全截取

-- 创建多字节安全函数
DELIMITER $$
CREATE FUNCTION mb_substr(str VARCHAR(255), start INT, len INT)
RETURNS VARCHAR(255) DETERMINISTIC
BEGIN
  RETURN CONVERT(SUBSTRING(str FROM start FOR len) USING utf8mb4);
END$$
DELIMITER ;

SELECT mb_substr('中国加油', 3, 2); -- '加油' ✅

性能优化方案

1.索引使用原则

-- 前缀索引创建
ALTER TABLE products ADD INDEX idx_name_prefix (product_name(10));

-- 有效查询
SELECT * FROM products WHERE product_name LIKE 'Apple%';

-- 无效查询(索引失效)
SELECT * FROM products WHERE SUBSTRING(product_name, 1, 5) = 'Apple';

2.避免全表扫描

-- 优化前(全表扫描)
SELECT * FROM logs WHERE SUBSTRING(message, 10, 5) = 'ERROR';

-- 优化后(使用虚拟列+索引)
ALTER TABLE logs ADD COLUMN error_code VARCHAR(5) 
  AS (SUBSTRING(message, 10, 5)) VIRTUAL;
ALTER TABLE logs ADD INDEX idx_error_code (error_code);

3.内存使用监控

-- 监控临时表大小
SHOW VARIABLES LIKE 'tmp_table_size'; -- 默认16MB
SET tmp_table_size = 64*1024*1024; -- 增大临时表内存

函数对比表

函数特点适用场景
SUBSTRING()灵活定位任意位置截取
LEFT()/RIGHT()高效简单首尾固定长度截取
SUBSTRING_INDEX()分隔符处理路径/域名解析
MID()SUBSTRING别名兼容旧代码

最佳实践总结

  1. 始终验证字符编码:处理多语言数据前执行 SHOW VARIABLES LIKE 'character_set%'
  2. 避免负位置与超长参数:明确业务需求边界
  3. 大文本处理优先考虑应用层:减少数据库压力
  4. 创建计算列+索引:对频繁截取字段优化
  5. 重要数据先备份:执行UPDATE前备份原字段
-- 安全更新示例
CREATE TABLE users_backup AS SELECT * FROM users;
UPDATE users 
SET phone_area = SUBSTRING(phone, 1, 3);

总结 

到此这篇关于MySQL字符串截取的核心要点和注意事项的文章就介绍到这了,更多相关MySQL字符串截取内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL数据库的一次死锁实例分析

    MySQL数据库的一次死锁实例分析

    本文主要给大家通过一个实例来具体介绍MySQL死锁问题的相关知识,接下来我们就来一一介绍这部分内容,希望能够对您有所帮助。
    2016-11-11
  • MySQL数据库之事务简析

    MySQL数据库之事务简析

    这篇文章主要介绍了MySQL数据库之事务简析,MySQL数据库中的事务是一组数据库操作,它们被视为一个整体,要么全部执行成功,要么全部失败回滚,MySQL支持四种事务隔离级别,其中默认的事务隔离级别是REPEATABLE READ,需要的朋友可以参考下
    2023-09-09
  • MYSQL日志与备份还原问题详解

    MYSQL日志与备份还原问题详解

    这篇文章主要为大家详细介绍了MYSQL日志与备份还原问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • MySQL中根据出生日期计算年龄两种方法

    MySQL中根据出生日期计算年龄两种方法

    使用SQL语句计算年龄,在事务处理和日期计算中,较为常见,下面这篇文章主要给大家介绍了关于MySQL中根据出生日期计算年龄的两种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • MySQL中的alter table命令的基本使用方法及提速优化

    MySQL中的alter table命令的基本使用方法及提速优化

    这篇文章主要介绍了MySQL中的alter table命令的基本使用方法及提速优化的方法,包括ALTER COLUMN的使用等等,需要的朋友可以参考下
    2015-11-11
  • 安装Mysql5.7.10 winx64出现的几个问题汇总

    安装Mysql5.7.10 winx64出现的几个问题汇总

    这篇文章主要介绍了安装Mysql5.7.10 winx64出现的几个问题汇总及解决方案,非常不错,需要的朋友可以参考下
    2016-08-08
  • MySQL中空值Null和空字符‘‘的具体使用

    MySQL中空值Null和空字符‘‘的具体使用

    本文主要介绍了MySQL中空值Null和空字符''的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • MySQL中ESCAPE关键字的用法详解

    MySQL中ESCAPE关键字的用法详解

    这篇文章主要介绍了MySQL中ESCAPE关键字的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • MySQL中order by排序时数据存在null则排序在最前面的方法

    MySQL中order by排序时数据存在null则排序在最前面的方法

    order by排序是最常用的功能,但是排序有时会遇到数据为空null的情况,这样排序就会乱了,这篇文章主要给大家介绍了关于MySQL中order by排序时数据存在null则排序在最前面的相关资料,需要的朋友可以参考下
    2024-06-06
  • MySQL InnoDB锁类型及锁原理实例解析

    MySQL InnoDB锁类型及锁原理实例解析

    这篇文章主要为大家介绍了MySQL InnoDB锁类型及锁原理实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11

最新评论