MySQL 中文拼音排序问题
作者:互联网
2025-09-10
问题
在做通讯录、人员列表等功能时,经常会碰到按照中文拼音排序的问题。
我们在这里可以用一个简单的例子进行说明
先创建测试数据
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
INSERT INTO user (name) VALUES
('张三'),('李四'),('王五'),('赵六'),('钱七'),('孙八'),('周九'),('吴十');
下面,我们希望查出数据,并且按照中文拼音顺序排序
很简单,这样就行了
SELECT * FROM user ORDER BY name;
可是,执行后却发现,结果似乎并不符合预期
这其实是因为,MySQL 默认字符集排序:
utf8mb4_general_ciutf8mb4_unicode_ci
这些排序是 按 Unicode 编码点排序,而不是拼音顺序。
那么,我怎么实现中文拼音排序呢?
解决办法
方法一
默认字符集排序不支持,那我不用默认字符集不就行了,看我的
SELECT * FROM user ORDER BY CONVERT(NAME USING gbk);
<select id="listUsers" resultType="User">
SELECT id, name
FROM user
ORDER BY
select>
可行是可行,但是每次查询都要做编码转化,有没有更简单粗暴的方法?
方法二
有的兄弟,有的
我们可以跳过编码转化这一个步骤,添加一个冗余字段,在数据变更时写入拼音不就行了(空间换时间打法还是太强了)
我们先添加字段
ALTER TABLE user
ADD COLUMN pinyin VARCHAR(100) AFTER name;
再导入这样一个依赖
<dependency>
<groupId>com.belerwebgroupId>
<artifactId>pinyin4jartifactId>
<version>2.5.1version>
dependency>
再建立对应工具类
public class PinyinUtil {
/**
* @param chinaStr 中文字符串
* @return 中文字符串转拼音 其它字符不变
*/
public static String getPinyin(String chinaStr){
HanyuPinyinOutputFormat formart = new HanyuPinyinOutputFormat();
formart.setCaseType(HanyuPinyinCaseType.LOWERCASE);
formart.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
formart.setVCharType(HanyuPinyinVCharType.WITH_V);
char[] arrays = chinaStr.trim().toCharArray();
String result = "";
try {
for (int i=0;ichar ti = arrays[i];
if(Character.toString(ti).matches("[u4e00-u9fa5]")){ //匹配是否是中文
String[] temp = PinyinHelper.toHanyuPinyinStringArray(ti,formart);
result += temp[0];
}else{
result += ti;
}
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
return result;
}
}
PinyinUtil.getPinyin()会根据中文字符串返回对应的拼音字符串
在涉及到数据变更(新增、修改、导入等场景)时,写入冗余字段就行
String pinyin = PinyinUtil.getPinyin(name);
user.setPinyin(pinyin);
我们的测试数据表在经过处理后,就变成了这样
查询时,对冗余字段排序即可
SELECT * FROM user ORDER BY pinyin;
相关推荐
专题
+ 收藏
+ 收藏
+ 收藏
+ 收藏
+ 收藏
+ 收藏
最新数据
相关文章
【从0到1构建一个ClaudeAgent】并发-后台任务
MyBatis、MyBatis-Plus、JPA、MyBatisGX 写法比较:同一个需求,四种解法
java2AI系列:SpringAI 通过 Function Calling 接入外部系统
Java 通用树形结构构建与解析工具类解析
深度剖析:Java 并发三大量难题 —— 死锁、活锁、饥饿全解
别再重复造轮子了!SpringBoot对接第三方系统模板,拿来即用
Spring AI 核心原理解析:基于 1.1.4 版本拆解底层架构
华为 IODT 设备接入
自定义跨字段校验必填注解
别再System.out了!这份SpringBoot日志优雅指南,让你告别日志混乱
AI精选
