sql 漢字按照首字母排序部落格分類

2021-06-22 12:08:49 字數 1368 閱讀 5560

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再查表的方法得到字段內容首字的聲母的方法。

這個方法我也試了,太麻煩,而且針對我的資料庫,也不能正確排序。

後來,我查詢了漢字編碼的一些資料,發現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語句 按照漢字拼音首字母排序

在oracle9i之後就新增了按照拼音 部首 筆畫排序功能。設定nls sort值可以對相關資料進行排序。schinese radical m 按照部首 第一順序 筆劃 第二順序 排序 schinese stroke m 按照筆劃 第一順序 部首 第二順序 排序 schinese pinyin m ...

sql語句按照漢字拼音首字母排序

oracle 在oracle9i中新增了按照拼音 部首 筆畫排序功能。設定nls sort值 schinese radical m 按照部首 第一順序 筆劃 第二順序 排序 schinese stroke m 按照筆劃 第一順序 部首 第二順序 排序 schinese pinyin m 按照拼音排序...

MySQL按照漢字拼音首字母排序

mysql資料庫中,若需要按照漢字的拼音排序,用的比較多是在人名的排序中,按照姓氏的拼音字母,從a到z排序 mysql對其排序分兩種情況 一 儲存姓名的字段採用 gbk字符集 gbk內碼編碼時,其本身就採用了拼音排序的方法,查詢語句 order by name asc 查詢結果按照姓氏的公升序排序 ...