怎么在SQL中使用SUBSTRING函数按字节截取中文字符

风丽小哥_8917

风丽小哥_8917

2026-10-25

732人浏览

原创

根本原因是SUBSTRING按字符计数而非字节,UTF-8/utf8mb4中中文占3–4字节,跨字节截断导致非法编码;需用CONVERT(... USING binary)转为字节串再截取,并注意转回时的合法性。

怎么在sql中使用substring函数按字节截取中文字符

SUBSTRING 按字节截取中文会乱码,根本原因是什么

MySQL 的 SUBSTRING(或 SUBSTR)默认按「字符」计数,但底层存储和截取行为受字符集和排序规则影响。如果你用的是 utf8mb4 字符集,一个中文字符占 3–4 字节;而 SUBSTRING(str, pos, len) 的 len 参数是「字符个数」,不是字节数。强行按字节理解会导致截断在某个中文字符中间,出现乱码(如 某 或 )。

关键点:SQL 标准里没有「按字节截取字符串」的内置函数,SUBSTRING 从不接受字节长度参数。

想按字节截取中文,必须先转成二进制再操作

MySQL 提供了 CONVERT(... USING binary) 和 SUBSTRING 配合的方式,把字符串临时转为字节序列,再按字节位置切:

  • 先用 CONVERT(str USING binary) 得到字节串
  • 再对这个二进制串用 SUBSTRING,此时 len 就是字节数
  • 最后如果需要显示,得转回字符集(但注意:若字节截断在 UTF-8 中间,转回会失败或变成 ?)
SELECT CONVERT(SUBSTRING(CONVERT('你好世界' USING binary), 1, 6) USING utf8mb4);

上面这句取前 6 字节 —— ‘你好’共 6 字节(每个 3 字节),结果是 你好;但如果取 SUBSTRING(..., 1, 5),就卡在第二个‘好’字的第 2 字节上,转回时会丢弃非法 UTF-8 序列,结果可能是 你? 或空。

AiBiao.cn
AiBiao.cn

一款AI数据处理工具,主要用于一句话自动生成图表,适合需要提升相关任务效率的用户。

下载

更安全的做法:用 LENGTH() 判断字节长度,避免跨字符截断

直接按字节截容易出错,实际中更推荐:

  • 用 LENGTH(str) 获取原始字节数(不是 CHAR_LENGTH())
  • 结合 CHAR_LENGTH(str) 算出平均字节/字符比,辅助估算
  • 如果业务真要「最多 N 字节且不破坏字符」,得用存储过程或应用层处理(SQL 不擅长 UTF-8 边界检测)

常见错误场景:

  • 把 SUBSTRING(col, 1, 10) 当作“取前 10 字节”,结果中文被砍半
  • 在 utf8mb4 下用 CHAR_LENGTH() 判断后直接截,仍可能因 emoji(4 字节)或生僻字出问题
  • 忘记 CONVERT(... USING binary) 后没转回,结果返回二进制 blob,客户端报错

PostgreSQL 和 SQL Server 怎么办
  • PostgreSQL 没有原生字节 SUBSTRING,但可用 substring(convert_to(str, 'UTF8'), 1, n) + convert_from(..., 'UTF8') 组合,原理类似 MySQL 的 binary 转换
  • SQL Server 的 SUBSTRING 默认按字符,但可以用 CAST/CONVERT 转 VARBINARY 后操作,同样面临 UTF-16 编码下中文占 2 字节、emoji 占 4 字节的问题

真正难的不是语法,是搞清你字段的字符集、客户端连接的编码、以及目标字节数是否落在合法 Unicode 码点边界上。多数时候,与其硬截字节,不如在应用层用 Python 的 text.encode('utf8')[:n].decode('utf8', 'ignore') 更可控。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

字节

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4523

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

931

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1189

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6481

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3263

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6460

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8841

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1190

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1052

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程