淺談Java、MySQL的中文排序問題

來源:互聯網
上載者:User

  首先要聲明的是Java和MySQL中的中文排序是完全不同的兩回事,之所以把他們放到一塊,僅僅是巧合。

  眾所周知,Java中使用Unicode來表示字元(char是兩個位元組的),很好地解決了C/C++一直頭疼的多國語言問題(這樣甚至可以用中文當變數名來編程了:))。但因為Unicode裡的中文是按部首+筆畫排序的,如果習慣地想用:

String s1="中國",s2="其它";

System.out.println(s1.compareTo(s2));

來比較中文或進行習以為常的按拼音排序,結果肯定是錯誤的(這裡的結果是-841,即“中國”<“其它”,與拼音順序不符)。幸好,Java裡還提供了地區敏感(locale-sensitive)的字串比較:java.text.Collator。因為地區不定,所以Collator類本身是抽象類別,要這樣使用:

Collator myCollator=Collator.getInstance();

System.out.println(myCollator.compare(s1, s2));

  這樣,雖然結果只是簡單的1,但總算是正確的拼音順序。把該方法用於Comparator.compare()方法中,即可實現正確的排序。

  而MySQL中也經常會碰到這樣的問題,order by某個欄位時,如果以該欄位的中文(GB2312編碼)排序時,會比較混亂,不知以何種順序進行排序。這是因為預設狀態下,MySQL的排序不區別英文字母的大小寫,而碰到GB2312編碼的中文時按兩個位元組的ASCII碼來處理,這樣便使得排序出來的結果雜亂無章。解決方案也很簡單(zz from 網上):

  方法一、

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

  方法二、

  如果你使用源碼編譯MySQL,可以編譯MySQL時使用--with--charset=gbk 參數,這樣MySQL就會直接支援中文尋找和排序了。--with--charset=gbk比--with--charset=gb2312好。預設的是latin1,編譯時間用extra-charsets=gb2312,gbk,其中,用來加入多個字元集。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.