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 查詢結果按照姓氏的公升序排序 ...