Oracle的SQL的中文排序

2021-09-01 21:47:51 字數 1138 閱讀 7228

在oracle 9i之前,對中文的排序,是預設按2進製編碼來進行排序的. 9i時增加了幾種新的選擇:

按中文拼音進行排序:schinese_pinyin_m

按中文部首進行排序:schinese_radical_m

按中文筆畫進行排序:schinese_stroke_m

而oracle 9i是對中文的排序是預設按拼音排序(並不是指nls_sort = schinese_pinyin_m,而是說sql中不指定nls_sort時對中文列排序時預設按拼音)的,跟之前的2進製編碼排序有所不同.具體用法如下:

直接寫在sql中,例如:

select * from team order by nlssort(排序欄位名,'nls_sort = schinese_pinyin_m');

select * from team order by nlssort(排序欄位名,'nls_sort = schinese_stroke_m');

select * from team order by nlssort(排序欄位名,'nls_sort = schinese_radical_m');

配置在初始化引數nls_sort中,這可以在資料庫建立時指定,也可以通過alter session來修改.如果是前者,則在所有session中生效.例如:

使用select * from nls_session_parameters;語句可以看到nls_sort的值.

更改配置檔案:alter system set nls_sort='schinese_pinyin_m' scope=spfile;

更改session:alter session set nls_sort = schinese_pinyin_m;

這裡要額外注意一下效能問題,按oracle官方文件的解釋,oracle在對中文列建立索引時,是按照2進製編碼進行排序的,所以如果nls_sort被設定為binary時,排序則可以利用索引.如果不是2進製排序,而是使用上面介紹的3種針對中文的特殊排序,則oracle無法使用索引,會進行全表掃瞄.這點一定要注意,多用plsql工具比較一下執行效率.解決方法是,在此列上建立linguistic index.例如:create index nls_index on my_table (nlssort(name, 'nls_sort = schinese_pinyin_m'));

ORACLE的order by中文排序

在使用order by排序的時候,出現如下情況 印象中中文排序應該預設是按照拼音排序的,為何 鑫 會排在 中 的後面呢?猜想order by是不是根據對應字元的ascii碼排的呢,因此列出了對應的ascii,如下 由此基本可以斷定,確實是通過ascii的大小來排序的,這也解釋了為什麼數字會排在字母之...

oracle的中文排序問題

mysql中文排序有convert name using gbk 這樣的函式,於是研究了一下oracle中文排序 使用拼音排序 sql select from chineseordertest order by nlssort name,nls sort schinese pinyin m name...

oracle中文排序

oracle中文排序 oracle9i之前,中文是按照二進位制編碼進行排序的。但oracle9以來,oracle的nlssort排序,可以用來進行語言排序,而不影響當前會話 例如按照拼音 部首 筆畫排序功能只需設定nls sort值 一 schinese radical m 按照部首 第一順序 筆劃...