sql 汉字按照首字母排序

mysql

我们的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的排序规则,按拼音排序

sql 汉字按照首字母排序

时间: 2024-08-04 00:52:41

sql 汉字按照首字母排序的相关文章

mysql 中将汉字按照首字母排序

因为数据库中可以设定表的编码格式,不同编码格式下,中文的排序有区别,下面分别介绍常用编码下的排序方法. 1.如果数据表的某字段的字符编码是 utf8_general_ci,排序写法: ORDER BY CONVERT(表别名.字段名 USING gbk) COLLATE gbk_chinese_ci ASC; 例子 SELECT * FROM mg_clinic mc ORDER BY CONVERT(mc.`CLNAME` USING gbk) COLLATE gbk_chinese_ci A

sql语句按照汉字拼音首字母排序

oracle : 在oracle9i中新增了按照拼音.部首.笔画排序功能.设置NLS_SORT值SCHINESE_RADICAL_M 按照部首(第一顺序).笔划(第二顺序)排序SCHINESE_STROKE_M 按照笔划(第一顺序).部首(第二顺序)排序SCHINESE_PINYIN_M 按照拼音排序,系统的默认排序方式为拼音排序 举例如下:表名为 dept ,其中name字段是中文,下面分别实现按照单位名称的笔划.部首和拼音排序.//按照笔划排序select * from dept order

vue中将汉字按照首字母排序,也适用于其他地方,但不适用多音字

1,.定义数组,可以是从后台传回的数据,也可以是自己写的数据(要json格式) 2.定义一个计算属性,用于将汉字排序(多音字的排序不推荐用这个) 3.在页面渲染

java汉字中首字母排序

最近博主做的项目中需要做一个wap版的手机通讯录,下午整理了下思路,发现这个用户名怎么排序啊?产品经理说就做成和手机通讯录类似的就行(心中一万头神兽飘过),好吧,既然提出来了那就要想办法做,作为一个程序员就应该百折不挠!! 首先博主想到的是从前端解决这个问题,所以索性找找资料,看看有没有现成的代码,找了一小会,没发现什么好的js能处理好这件事,哎...博主前端渣啊,好吧,转向后台来处理,前端你就等着专心的展示数据吧! 查阅相关api发现Comparator这个接口竟然有这个功能,真是省了好大一部

mysql 汉字根据首字母排序

1:如果数据库表字段的字符编码是latin1_swedish_ci select * from tablename order by birary(name) asc ;tablename:数据库表名name:排序字段名birary不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解为在字符串比较的时候区分大小写 2:如果数据库表字段的字符编码是utf8_general_ci(常用) select * from tablename WHERE 1=1 order by

localeCompare按首字母排序汉字

sort() 方法用于对数组的元素进行排序. 如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字.比较函数应该具有两个参数 a 和 b,其返回值如下: 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值. 若 a 等于 b,则返回 0. 若 a 大于 b,则返回一个大于 0 的值. <script type="text/javascript"> function sortNum

react-native按照汉字首字母排序

问题讨论详情:https://github.com/facebook/react-native/issues/12597 问题描述: JS中有一个String的内置函数:String.prototype.localeCompare(),返回一个数字来指示一个参考字符串是否在排序顺序前面或之后或与给定字符串相同. 1 a.nickName.localeCompare(b.nickName, 'zh-Hans-CN', {sensitivity: 'accent'}) 在react-native环境

按首字母排序汉字

项目中需要一个选择城市名的功能,具体的数据可以到国家统计局的网站上查,直接搜索也有很多,比如http://blog.jjonline.cn/phptech/172.html. 数据是有了,可是汉字怎么按照字母排序呢? 一.前端 js 处理 var a = ["上海","大连","北京","拉萨","天津"]; //返回["北京", "大连", "拉萨&quo

C# 获取汉字拼音首字母

最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精   本节探讨C#获取汉字拼音首字母的方法: 代码类东西,直接上代码: /// <summary> /// 在指定的字符串列表CnStr中检索符合拼音索引字符串 /// </summary> /// <param name="CnStr">汉字字符串</param> /// <returns&