浅谈Java、MySQL的中文排序问题

  首先要声明的是Java和MySQL中的中文排序是完全不同的两回事,之所以把他们放到一块,仅仅是巧合。
  众所周知,Java中使用Unicode来表示字符(char是两个字节的),很好地解决了C/C++一直头疼的多国语言问题(这样甚至可以用中文当变量名来编程了:))。但因为Unicode里的中文是按部首+笔画排序的,如果习惯地想用:
String s1="中国",s2="其它";
System.out.println(s1.compareTo(s2));
来比较中文或进行习以为常的按拼音排序,结果肯定是错误的(这里的结果是-841,即“中国”<“其它”,与拼音顺序不符)。幸好,Java里还提供了区域敏感(locale-sensitive)的字符串比较:java.text.Collator。因为区域不定,所以Collator类本身是抽象类,要这样使用:
Collator myCollator=Collator.getInstance();
System.out.println(myCollator.compare(s1, s2));
  这样,虽然结果只是简单的1,但总算是正确的拼音顺序。把该方法用于Comparator.compare()方法中,即可实现正确的排序。

  而MySQL中也经常会碰到这样的问题,order by某个字段时,如果以该字段的中文(GB2312编码)排序时,会比较混乱,不知以何种顺序进行排序。这是因为默认状态下,MySQL的排序不区别英文字母的大小写,而碰到GB2312编码的中文时按两个字节的ASCII码来处理,这样便使得排序出来的结果杂乱无章。解决方法也很简单(zz from 网上):
  方法一、
  一种解决方法是对于包含中文的字段加上"binary"属性,使之作为二进制比较,例如将"name char(10)"改成"name char(10)binary"。
  方法二、
  如果你使用源码编译MySQL,可以编译MySQL时使用--with--charset=gbk 参数,这样MySQL就会直接支持中文查找和排序了。--with--charset=gbk比--with--charset=gb2312好。默认的是latin1,编译时用extra-charsets=gb2312,gbk,其中,用来加入多个字符集。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值