怎么在MySQL中根据中文拼音首字母进行字段排序?

风芳同学_9885

风芳同学_9885

2026-08-16

861人浏览

原创

纯原生mysql(8.0及以下)无法直接按拼音首字母排序,必须用变通方案:如convert(name using gbk)配合gbk_chinese_ci近似实现分组,或在应用层生成first_letter字段后排序。

怎么在mysql中根据中文拼音首字母进行字段排序?

MySQL 中文拼音首字母排序依赖字符集和排序规则

MySQL 本身不内置拼音转换函数,ORDER BY 直接对中文字段排序时,实际按字符编码(如 UTF8MB4 的 Unicode 码点)进行,结果是部首或笔画顺序,不是拼音。要实现“按拼音首字母排序”,必须让数据库能识别每个汉字对应的拼音首字母——这通常靠 CONVERT() + 合适的 collation,或借助自定义映射表/函数。

关键前提是:字段字符集必须是 utf8mb4,且排序规则需支持拼音等效(如 utf8mb4_unicode_ci 不行,它按 Unicode 排;utf8mb4_pinyin_ci 是第三方扩展,原生 MySQL 不带)。

所以,**纯原生 MySQL(8.0 及以下)无法直接按拼音首字母排序,必须用变通方案**。

用 CONVERT() + utf8mb4_general_ci 实现近似拼音首字母排序

utf8mb4_general_ci(已弃用但仍可用)和 utf8mb4_unicode_520_ci 在某些版本中对常用汉字的排序接近拼音顺序,但不可靠。更可控的做法是用 CONVERT() 将中文转为 GBK 编码再取首字节——因为 GBK 中汉字按拼音顺序排列,首字节范围可大致区分首字母。

SELECT name FROM users 
ORDER BY CONVERT(name USING gbk) COLLATE gbk_chinese_ci;

这个写法在 MySQL 5.7+、字段为 utf8mb4 时有效,但要注意:

  • CONVERT(name USING gbk) 可能失败(含 emoji 或超出现代 GBK 范围的字),会转成 ?,导致排序错乱
  • gbk_chinese_ci 是 MySQL 内置 collation,保证 GBK 字符按拼音分组,但「分组」不等于「首字母提取」,它只是让「啊、阿、哎」挨在一起,不是按 A/B/C 拉出完整字母序列
  • 若只要分组显示(比如前端做 A-Z 分类导航),这个方案够用;若要 WHERE first_letter = 'W' 精确过滤,则不适用

真正按拼音首字母筛选或排序:加辅助列 + 触发器或应用层处理

最稳定的方式是把拼音首字母存在额外字段里,由应用或数据库维护:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 应用层(Python/Java)用 pypinyin 或 hanyu-pinyin 库生成首字母,插入/更新时一并写入 first_letter 字段
  • 数据库层可用触发器(MySQL 5.7+ 支持),但需自行实现拼音逻辑(无内置函数),实际极少这么做

建表示例:

ALTER TABLE users ADD COLUMN first_letter CHAR(1) GENERATED ALWAYS AS (
  UPPER(LEFT(
    CASE LEFT(name, 1)
      WHEN '吖' THEN 'A' WHEN '八' THEN 'B' WHEN '擦' THEN 'C'
      -- …… 手动映射前 100 个高频字(不现实)
    END, 1))
) STORED;

手动映射不可维护。因此生产环境强烈建议在写入时由业务代码计算 first_letter 并存入普通字段,然后直接 ORDER BY first_letter, name。

MySQL 8.0+ 用户注意 collation 变更与潜在陷阱

MySQL 8.0 默认 collation 改为 utf8mb4_0900_as_cs,它严格区分大小写和重音,但完全不考虑拼音。哪怕你执行:

SELECT * FROM users ORDER BY name COLLATE utf8mb4_0900_as_cs;

结果仍是 Unicode 码位顺序,和拼音无关。

另外两个常见误区:

  • 误以为 utf8mb4_unicode_ci 支持拼音:它只对拉丁扩展字符(如 é, ñ)有重音感知,对中文就是逐码点比较
  • 用 SUBSTRING(name, 1, 1) 提取首字再试图排序:没用,因为单个汉字还是按码点排,不是按拼音

真正需要首字母能力的场景,别在 SQL 层硬扛。复杂点在于:拼音存在多音字(如「重庆」的「重」读 chóng 不读 zhòng),而数据库无法上下文感知——这事只能由业务逻辑决定。

相关文章

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

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

下载

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

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2193

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1339

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

775

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2992

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

5048

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1139

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5311

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4662

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

6154

11

热门下载

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

精品课程

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

共1课时 | 184人学习