背景
項目開發中免不了數據的排序問題,排序中又免不了對中文的處理。今天分享一下如何在mysql中對中文進行排序。
正事兒
現有mysql數據表一個,默認的數據是這個樣子的(省略了其它字段):
數據查詢的時候不管是按添加時間還是按修改時間排序,領導都不滿意,領導說:應該按照名字排序嘛,這樣用戶就可以預見他想要的數據在什麼地方了。我說好,那就改吧。
發現還不是想要的效果,這也不能怪mysql,畢竟中文博大精深,而我們的目標實際是中文的拼音排序,默認情況下mysql是不認識的(雖然我的數據庫所有編碼都已經設置為了utf-8)。
用'強大'的百度查了下,mysql要想實現中文拼音排序有兩種常用的辦法:
第一種
不修改表結構,只修改查詢語句:
明確的告訴mysql我這個字段要以gbk編碼處理(用gb2312也可以的)
第二種
修改表結構不修改查詢語句:
重點在紅框位置,告訴mysql這個字段按照gbk編碼處理(也可以是gb2312_chinese_ci)
效果和第一種方法一樣
還有一種我沒有驗證的方法,網友提供的,大家可以參考下:
如果你使用源碼編譯MySQL,可以編譯MySQL時使用 –with–charset=gbk 參數,這樣MySQL就會直接支持中文查找和排序了(默認的是latin1)。也可以用 extra-charsets=gb2312,gbk 來加入多個字符集。
其實看到這裡大家都已經明白了,說來說去還是編碼的問題在作怪。只要是做開發的,肯定少不了遇到編碼的問題,都被編碼坑過。特別是數據庫,編碼問題更重要,上線之前編碼如果處理不好,後續可能造成致命的傷。
補充一個我收集的處理mysql編碼的資料。
通過 show variables like '%character_set%' 查看已有編碼:
修改mysql的編碼方式可以有以下幾個:
1.通過配置文件修改my.ini(windows下)或/etc/my.cnf(linux下)
分別添加如下內容
[mysqld]
character_server_set=utf8
[mysql]
default-character-set=utf8
[mysql.server]
default-character-set=utf8
[mysql_safe]
default-character-set=utf8
[client]
default-character-set=utf8
2.創建數據庫時設置編碼
create database test character set utf8;
3.創建表時設置編碼
create table test(id int primary key)DEFAULT charset=utf8;
4.修改數據庫編碼
alter database test character set utf8;
5.修改表默認編碼
alter table test character set utf8;
6.修改字段編碼
alter table test modify col_name varchar(50) CHARACTER SET utf8;
好了,今天就分享到這裡。
閱讀更多 JAVA周老師 的文章