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数据库中使用触发器禁止修改特定列,以保护数据的一致性和完整性,下面就来介绍一下,感兴趣的可以了解一下
    2024-12-12
  • MySQL中导出用户权限设置的脚本分享

    MySQL中导出用户权限设置的脚本分享

    这篇文章主要介绍了MySQL中导出用户权限设置的脚本分享,本文通过导出mysql.user表中数据实现导出权限设置,需要的朋友可以参考下
    2014-10-10
  • MYSQL的日志文件详解

    MYSQL的日志文件详解

    MySQL的日志系统包括错误日志、二进制日志、慢查询日志、通用查询日志、重做日志和回滚日志,它们各自有不同的作用和性能影响,本文给大家介绍MYSQL的日志文件知识,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • mysql中复制表结构的方法小结

    mysql中复制表结构的方法小结

    这篇文章主要介绍了mysql中复制表结构的方法,需要的朋友可以参考下
    2014-07-07
  • mysql压缩包版zip安装配置方法

    mysql压缩包版zip安装配置方法

    这篇文章主要为大家详细介绍了mysql压缩包版zip安装配置方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • MySQL高可用解决方案MMM(mysql多主复制管理器)

    MySQL高可用解决方案MMM(mysql多主复制管理器)

    MySQL本身没有提供replication failover的解决方案,通过MMM方案能实现服务器的故障转移,从而实现mysql的高可用。MMM不仅能提供浮动IP的功能,如果当前的主服务器挂掉后,会将你后端的从服务器自动转向新的主服务器进行同步复制,不用手工更改同步配置
    2017-09-09
  • 关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)

    关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)

    这篇文章给大家介绍关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)的相关资料,还给大家收集些关于MySQL会出现中文乱码原因常见的几点,小伙伴快来看看吧
    2015-11-11
  • MySQL查询优化的三种处理阶段(Index Key、Index Filter和Table Filter)详解

    MySQL查询优化的三种处理阶段(Index Key、Index Filter和Table 

    在 MySQL 中,索引主要用于优化查询,在 MySQL 查询优化中涉及到三种处理阶段,Index Key、Index Filter 和 Table Filter,下面小编就为大家详细介绍一下这三个阶段吧
    2025-09-09
  • 基于mysql 默认排序规则的坑

    基于mysql 默认排序规则的坑

    这篇文章主要介绍了解决mysql 默认排序规则的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看不看
    2021-02-02
  • MySQL如何选择合适的索引

    MySQL如何选择合适的索引

    这篇文章主要介绍了MySQL如何选择合适的索引,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09

最新评论