sql 汉字按照首字母排序博客分类:
2014-06-17 17:23
323 查看
SQLmysql
我们的MySQL使用latin1的默认字符集,也就是说,对汉字字段直接使用GBK内码的编码进行存储,当需要对一些有汉字的字段进行拼音排序时(特别涉及到类似于名字这样的字段时),默认无法通过order by关键字正确排序。
经过网上查找,网上的办法大多是针对使用utf8字符集的数据库,主要的方法有:
1)直接转换字段为gbk,数据表某字段client_name的字符编码是utf8_general_ci; 比如:
SELECT * FROM `client_info_msg` ORDER BY CONVERT( client_name USING gbk ) COLLATE gbk_chinese_ci ASC; SELECT * FROM `client_info_msg` ORDER BY CONVERT( client_name USING gbk ) COLLATE gbk_chinese_ci ASC;
或者干脆将相应字段改为gbk字符集。
某字段name的字符编码是latin1_swedish_ci;
select * from `tbl` order by birary(name) asc select * from `tbl` order by birary(name) asc
我在我的数据库测试了上面的方法,或者直接按字段排序,都不行,主要是排序结果不理想。
2)查表法
创建一个新表,用来存储拼音声母和使用该声母的汉字首字的对应关系。然后写一个函数,每次排序时通过转换为gbk再查表的方法得到字段内容首字的声母的方法。http://hudeyong926.iteye.com/blog/1127094
这个方法我也试了,太麻烦,而且针对我的数据库,也不能正确排序。
后来,我查询了汉字编码的一些资料,发现GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字3755个采用拼音排序,二级汉字就不是了,但考虑到人名等都是常用汉字,因此只是针对一级汉字能正确排序也够用了)。根据这个原理,直接按字段排序就应该可以的(我的数据库使用Latin1 字符集,存的汉字本来就是GBK内码),但我试了以后发现不行。参考上面方法2的查表法,我把字段内容转换为16进制编码,再排,就OK了!
这就是最终的办法:
SELECT * FROM table ORDER BY hex( chinese_field ) SELECT * FROM table ORDER BY hex( chinese_field )
简单吧!
我现在想查询table表。要求name字段的名字按照英文大写字母A-Z的顺序排列
sqlserver
select id,name from table order by upper(name) --按照字母排序
ORDER BY name COLLATE Chinese_PRC_CS_AS_WS --大陆简体字UNICODE的排序规则,按拼音排序
我们的MySQL使用latin1的默认字符集,也就是说,对汉字字段直接使用GBK内码的编码进行存储,当需要对一些有汉字的字段进行拼音排序时(特别涉及到类似于名字这样的字段时),默认无法通过order by关键字正确排序。
经过网上查找,网上的办法大多是针对使用utf8字符集的数据库,主要的方法有:
1)直接转换字段为gbk,数据表某字段client_name的字符编码是utf8_general_ci; 比如:
SELECT * FROM `client_info_msg` ORDER BY CONVERT( client_name USING gbk ) COLLATE gbk_chinese_ci ASC; SELECT * FROM `client_info_msg` ORDER BY CONVERT( client_name USING gbk ) COLLATE gbk_chinese_ci ASC;
或者干脆将相应字段改为gbk字符集。
某字段name的字符编码是latin1_swedish_ci;
select * from `tbl` order by birary(name) asc select * from `tbl` order by birary(name) asc
我在我的数据库测试了上面的方法,或者直接按字段排序,都不行,主要是排序结果不理想。
2)查表法
创建一个新表,用来存储拼音声母和使用该声母的汉字首字的对应关系。然后写一个函数,每次排序时通过转换为gbk再查表的方法得到字段内容首字的声母的方法。http://hudeyong926.iteye.com/blog/1127094
这个方法我也试了,太麻烦,而且针对我的数据库,也不能正确排序。
后来,我查询了汉字编码的一些资料,发现GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字3755个采用拼音排序,二级汉字就不是了,但考虑到人名等都是常用汉字,因此只是针对一级汉字能正确排序也够用了)。根据这个原理,直接按字段排序就应该可以的(我的数据库使用Latin1 字符集,存的汉字本来就是GBK内码),但我试了以后发现不行。参考上面方法2的查表法,我把字段内容转换为16进制编码,再排,就OK了!
这就是最终的办法:
SELECT * FROM table ORDER BY hex( chinese_field ) SELECT * FROM table ORDER BY hex( chinese_field )
简单吧!
我现在想查询table表。要求name字段的名字按照英文大写字母A-Z的顺序排列
sqlserver
select id,name from table order by upper(name) --按照字母排序
ORDER BY name COLLATE Chinese_PRC_CS_AS_WS --大陆简体字UNICODE的排序规则,按拼音排序
相关文章推荐
- MySQL之——SQL按照汉字首字母进行搜索排序
- sql语句按照汉字拼音首字母排序
- MYsql sql 按照汉字首字母进行搜索排序
- MySQL之——SQL按照汉字首字母进行搜索排序
- sql语句按照汉字拼音首字母排序
- sql语句-按照汉字拼音首字母排序
- sql语句按照汉字拼音首字母排序
- MySQL按照汉字的拼音排序、按照首字母分类
- sql语句-按照汉字拼音首字母排序
- java将汉字转成拼音并按照首字母排序的有效方法。
- 数据库按照汉字拼音首字母排序
- MySQL下使用SQL按照汉字拼音排序
- php 对二维数组按照汉字首字母排序
- mysql 查询的时候处理中文汉字按照字母排序问题
- 汉字按照字母排序
- sql中文字段按照汉语拼音首字母排序
- Sqlserver 按汉字首字母排序(sql语句)
- MySQL按照汉字拼音首字母排序
- mysql如何给汉字按照首字母顺序排序
- 实现按照字母分类分组排序