最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何在SQL中实现按拼音首字母对中文字段分组统计?
时间:2026-07-09 10:15:03 编辑:袖梨 来源:一聚教程网
中文字段排序分组需显式转拼音首字母:MySQL 8.0+用CONVERT+gbk_chinese_ci提取,PostgreSQL用unaccent+citext+映射表,通用方案是应用层预存拼音首字母冗余字段。
直接用 ORDER BY 或 GROUP BY 对中文字段排序/分组,默认按 Unicode 码点,不是拼音首字母——必须显式转换拼音才能正确分组。
MySQL 8.0+:用 CONVERT() + COLLATE 提取拼音首字母
MySQL 本身不提供拼音函数,但可通过字符集转换间接实现:将中文转为 gb2312 或 gbk 编码后,用 COLLATE 触发拼音排序规则(如 gbk_chinese_ci),再结合 LEFT() 和 CONVERT() 获取首字母。注意该方法依赖系统是否安装对应 collation。
- 确保字段字符集为
gbk或gb2312(utf8mb4不支持拼音 collation) - 执行前检查可用 collation:
SHOW COLLATION LIKE 'gbk%'; - 示例分组统计:
SELECT UPPER(LEFT(CONVERT(name USING gbk) COLLATE gbk_chinese_ci, 1)) AS first_letter, COUNT(*) AS cntFROM users WHERE name REGEXP '^[u4e00-u9fa5]'GROUP BY first_letterORDER BY first_letter;
⚠️ 坑:若字段含英文、数字或空格,REGEXP 过滤不严会导致首字母为乱码或空;gbk_chinese_ci 在部分 MySQL 版本中不可用,需确认。
PostgreSQL:用 unaccent + citext 配合自定义映射表
PostgreSQL 没有内置拼音函数,但可借助扩展 unaccent 去音调,再用 citext 忽略大小写,最后靠一张简化的汉字→首字母映射表做 JOIN 分组。
- 先启用扩展:
CREATE EXTENSION IF NOT EXISTS unaccent; - 建映射表
hz_pinyin_first,含两列:hz CHAR(1)(汉字)、first_letter CHAR(1)(对应拼音首字母) - 关键技巧:用
LEFT(unaccent('zh-CN', name), 1)对纯汉字无效,必须走映射表 JOIN
SELECT f.first_letter, COUNT(*) AS cntFROM users uJOIN hz_pinyin_first f ON SUBSTRING(u.name FROM 1 FOR 1) = f.hzWHERE u.name ~ '^[u4e00-u9fa5]'GROUP BY f.first_letterORDER BY f.first_letter;
⚠️ 坑:映射表需覆盖所有可能首字,生僻字易漏;unaccent 对中文无作用,不能替代映射;SUBSTRING 取首字符时要注意 UTF-8 多字节安全(PostgreSQL 通常没问题)。
通用稳妥方案:应用层预计算拼音首字母并存入冗余字段
数据库层面做拼音分组,稳定性和性能都不如在写入时就计算好首字母,存到单独字段(如 name_pinyin_first),再对该字段建索引。
- Python 示例(用
pypinyin):lazy_pinyin('张三', style=Style.FIRST_LETTER)[0]→'z' - Java 可用
pinyin4j,注意设置HanyuPinyinOutputFormat的caseType为UPPERCASE - 该字段设为
GENERATED ALWAYS AS (...)(MySQL 5.7+/PG 12+ 支持)或由应用/触发器维护 - 查询直接
GROUP BY name_pinyin_first,快且确定
⚠️ 坑:多音字无法全自动处理(如「重庆」的「重」读 chong 还是 zhong),需业务约定或人工校验;字段变更时要同步更新冗余值。
真正难的不是“怎么写 SQL”,而是“谁来保证每个汉字都映射对了首字母”——尤其当数据来自不同地区、含方言用字或新造人名时,拼音库版本、多音字策略、甚至输入法导致的异体字,都会让纯 SQL 方案在边界 case 上突然失效。
相关文章
- hbase 可视化的典型应用场景有哪些 07-29
- hbase 可视化的成本究竟多高 07-29
- hbase 可视化存在哪些难点 07-29
- hbase 可视化的安全性怎样保障 07-29
- hbase 可视化的更新速度有多快 07-29
- hbase zookeeper 怎样处理节点加入 07-29