MySQL中的utf8中文排序的解決方案

以下內容是擷取自http://www.ge.net.tw/?q=node/407 

因為很有用,特別記錄下來,以供參考。

----------------------------------------------------------------------------------------------------

在MySQL中使用默認字元集為utf8,結果想要把中文按拼音排序出現了問題,排出來的順序亂七八糟,不是我們想要的結果。

解決方案如下:
1、不想改變表定義及默認編碼的情況,將欄位先轉換成gbk或big5編碼再排序:

SELECT * FROM table ORDER BY CONVERT( chinese_field USING gbk ) ;

前提是在安裝MySQL時安裝了gbk字元集,不然會報錯:
#1115 - Unknown character set: 'gbk'
在編譯源碼時加上gbk編碼即可,如果已經安裝好了,重新編譯再安裝,重新編譯安裝一般不會影響MySQL的已有設置,包括資料都不會受到影響。

 

2、直接將欄位的字元集改成gbk,然後直接使用order by 排序即可。
MySQL 5.x支援某列單獨定義字元集。

3、網上也有人說將欄位定義加上binary屬性也能達到效果,未作測試,不敢評論。
MySQL的文檔中也提到字元集校對規則:

SELECT * FROM t1 ORDER BY a COLLATE utf8_bin;

但此僅僅只影響校對規則,並不影響字元的字元集本身。

 

4、mysql 中文排序的做法

SELECT mid(欄位名稱, 1, 2 )
FROM `資料表明稱`
ORDER BY hex( mid( 欄位名稱, 1, 2 ) )
LIMIT 0 , 30

 

5、

SELECT id,blog,convert(blog using big5) as sortkey FROM lt_blogs ORDER BY sortkey
SELECT * FROM lt_blogs ORDER BY title ASC
改成
SELECT *,convert(blog using big5) as sortkey FROM lt_blogs ORDER BY sortkey
SELECT id,blog,convert(blog using big5) as sortkey FROM lt_blogs ORDER BY sortkey

http://plog.read.org.tw/bmx/search/search_all_plog_inc.php
6、
select * from class_1027 where showing_512 = 'Y' order by convert(trim(comp_name),binary),dept_name,cust_name ASC
select * from class_1027 where showing_512 = 'Y' order by convert(trim(comp_name) using binary),dept_name,cust_name ASC

//=============================
問答
Q:
我在寫一個查詢條件時的問題如下:
如我想寫一個欄位中包含“李”字的所有記錄
$str="李";
select * from table where field like '%$str%' ;

顯示的記錄中除了包含”李”字的記錄,還有不包含“李”字的記錄。為什麼?

 

A:
在MySQL中,進行中文排序和查找的時候,對漢字的排序和查找結果是錯誤的。這種情況在MySQL的很多版本中都存在。如果這個問題不解決,那麼MySQL將無法實際處理中文。
  出現這個問題的原因是:MySQL在查詢字串時是大小寫不敏感的,在編繹MySQL時一般以ISO-8859字元集作為默認的字元集,因此在比較過程中中文編碼字元大小寫轉換造成了這種現象。

方法一:
解決方法是對於包含中文的欄位加上"binary"屬性,使之作為二進位比較,例如將
"name char(10)"改成"name char(10)binary"

方法二:
  如果你使用源碼編譯MySQL,可以編譯MySQL時使用--with--charset=gbk 參數,這樣MySQL就會直接支援中文查找和排序了。

方法三:
  可以使用 Mysql 的 locate 函數來判斷。以上述問題為例,使用方法為:
SELECT * FROM table WHERE locate(field,'李') > 0;
本站使用的就是這種方法,感覺還不錯。

方法四:
把您的Select語句改成這樣,
SELECT * FROM TABLE WHERE FIELDS LIKE BINARY '%FIND%'
即可!

//=============================

javascript中文排序
原文來自:風微柳細
原來的方法是用個大中文字陣列,一個個比較

以下為引用內容:
--------------------------------------------------------------------------------
更新[2005.10.06]:
JavaScript提供了一種更簡便的方法用於比較兩個字串——localeCompare(),localeCompare()使用本地特定的順序來比較兩個字串,語法如下:
string.localeCompare(target)
參數target是要與string進行比較的字串。
如果string小於target,則localeCompare()返回小於0的數;
如果string大於target,返回大於0的數;
如果相等(或按照本地順序的約定兩者順序相當),則返回0。
利用該方法替換上面冗長的作法後,除了代碼減少了之外,運行速度也快了不少,而且還支援其他字元庫的本地排序。
修改後代碼如下:

該方法目前已作為ECMAScript v3標準,在支持JavaScript 1.5(Mozilla、Netscape 6+)以及JScript 5.5(IE 5.5+)的流覽器中均得到了支持。

代碼如下:

<script type="text/javascript">
<!--
     function startSort(){
          var a=document.getElementById('s').value;
          a=a.split(',')
          a.sort();
          document.getElementById('r1').value=a;
          a.sort(function(a,b){return a.localeCompare(b)});
          document.getElementById('r2').value=a;
     }
         
//-->
</script>
<p>包含漢字的字串陣列(用逗號","隔開):<br />
<textarea id="s" style="width: 100%; overflow: scroll; word-wrap: normal;" rows="10">張韶涵,b土,abort,張學友,something,蘋果,五月天,劉德華,香蕉,apple,範瑋琪,阿桑</textarea></p>
<p style="text-align: center"><input type="button" value="排序測試" onclick="startSort()" style="width: 300px" /></p>
<p>默認排序結果:<br />
<textarea id="r1" style="width: 100%; overflow: scroll; word-wrap: normal;" rows="10"></textarea></p>
<p>漢字拼音順序排序結果:<br />
<textarea id="r2" style="width: 100%; overflow: scroll; word-wrap: normal;" rows="10"></textarea></p>

//=============================
讓資料按照中文筆劃排序
January 3, 2007 by Ate

 

如何將中文字依照筆劃來排序? 透過中文處理函式,我們就可以計算出筆劃後把陣列中的中文資料進行排列,試試看吧!

 

<?php
 
include 'big5_func/big5_func.inc';
  function
compare($s1, $s2){
   
$n1 = big5_stroke($s1);
   
$n2 = big5_stroke($s2);
    if(
$n1 == $n2) return 0;
    return (
$n1 < $n2) ? -1 : 1;
  }

 
$string = array('驢子','史瑞克','白雪公主','長靴貓','小木偶','薑餅人','三隻小豬',
                      
'睡美人','壞皇后','七個小矮人','小美人魚','神仙教母');
 
usort($string, 'compare');
  while (list(
$key, $value) = each($string)) {
    echo
"$key: $value<br>";
  }
?>
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 kkonline 的頭像
    kkonline

    Fay's Journal of Life

    kkonline 發表在 痞客邦 留言(0) 人氣()