方法1
----
"mysql在查詢字符串時是大小寫不敏感的,在編繹mysql時一般以ISO-8859字符集作為默認的字符集,因此在比較過程中
中文編碼字符大小寫轉換造成了這種現象,比較應急的方法是對於包含中文的字段加上"binary"屬性,使之作二進制比較,
例如將"name char(10)"改成"name char(10)binary"."
(已試驗成功)
方法2
-----
編譯mysql時使用--with--charset=gbk
utf8中文排序的
解決辦法如下:
1、不想改變表定義及默認編碼的情況,將字段先轉換成gbk編碼再排序:
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;
但此僅僅只影響校對規則,並不影響字符的字符集本身
對於包含中文的字段加上"binary"屬性,使之作為二進制比較,例如將"name char(10)"改成"name char(10)binary"。
如果你使用源碼編譯MySQL,可以編譯MySQL時使用 --with--charset=gbk 參數,這樣MySQL就會直接支持中文查找和排序了(默認的是latin1)。也可以用 extra-charsets=gb2312,gbk 來加入多個字符集。
如果不想對表結構進行修改或者重新編譯MySQL,也可以在查詢語句的 order by 部分使用 CONVERT 函數。
比如
代碼如下 復制代碼 select * from mytable order by CONVERT(chineseColumnName USING gbk);
UTF8 默認校對集是 utf8_general_ci , 它不是按照中文來的。你需要強制讓MySQL按中文來排序。
代碼如下 復制代碼
1、對於包含中文的字段加上"binary"屬性,使之作為二進制比較。
CREATE TABLE testtable (
Id int(11) NOT NULL auto_increment,
Name varchar(60) binary default NULL,
PRIMARY KEY (Id)
) TYPE=MyISAM;
2、在編譯MySql源代碼的時使用--with--charset=gbk參數,這樣MySQL就會直接支持中文查找和排序了。--with--charset=gbk比--with--charset=gb2312好。默認的是latin1,編譯時用extra-charsets=gb2312,gbk,其中,用來加入多個字符集。
解決辦法代碼
代碼如下 復制代碼select name from test1 order by convert(name using gb2312) asc;