今天在用java與mysql數(shù)據(jù)庫時(shí)發(fā)現(xiàn)Illegal mix of collations (latin1_swedish_ci,IMPLICIT)and (utf8_general_ci,COER錯(cuò)誤提示,下面我們來看解決方法吧.
部署完項(xiàng)目,測試一下,誒,數(shù)據(jù)出來了沒有多大問題,暗舒一口氣,繼續(xù)測吧,一點(diǎn)新建完了,報(bào)錯(cuò)了,看看什么錯(cuò)誤.
一看完了:java.sql.SQLException: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=' 是這個(gè)錯(cuò)誤,什么原因呢,第一次遇到.
頭大了,去查文檔說是:結(jié)果集中有兩種字符集,我暈了,怎么會(huì)這樣呢,看看表結(jié)構(gòu),一種啊, 繼續(xù)查吧,代碼如下:
- SHOW VARIABLES LIKE 'character_set_%'; --查看一下 顯示
- +--------------------------+----------------------------+
- | Variable_name | Value |
- +--------------------------+----------------------------+
- | character_set_client | utf8|
- | character_set_connection | utf8|
- | character_set_database | latin1 |
- | character_set_results | utf8|
- | character_set_server | latin1 |
- | character_set_system | utf8 |
- | character_sets_dir | /home/jh/mysql/share/mysql/charsets |
- --Vevb.com
- +--------------------------+----------------------------+
再用 SHOW VARIABLES LIKE 'collation_%';查看一下,顯示如下代碼:
- +----------------------+-------------------+
- | Variable_name | Value |
- +----------------------+-------------------+
- | collation_connection | utf8_swedish_ci |
- | collation_database | latin1_swedish_ci |
- | collation_server | latin1_swedish_ci |
- +----------------------+-------------------+
原來如此啊,哈哈,知道錯(cuò)在哪里,剩下的就好辦了.
解決方法,依次執(zhí)行:
- set character_set_database =utf8;
- set character_set_results =utf8;
- set character_set_server =utf8;
- set character_set_system =utf8; --此處utf-8也可以
然后執(zhí)行:
- SET collation_server = utf8_general_ci
- SET collation_database = utf8_general_ci
執(zhí)行完之后,請(qǐng)檢查mysql下每個(gè)數(shù)據(jù)庫,表,字段是否都是utf8,不是則改過來,這樣子就不會(huì)出現(xiàn).
最笨的方法是重裝一下數(shù)據(jù)庫,一般不要用這種方法呀.
最終解決方法:
1.1 如果是windows版本的mysql,那么在安裝的時(shí)候,系統(tǒng)就會(huì)提示用哪種編碼,如果安裝的時(shí)候設(shè)置錯(cuò)誤了,修改mysql安裝目錄下的my.ini文件,代碼如下:
- [mysql]
- default-character-set=utf8
- ...
- # The default character set that will be used when a new schema or table is
- # created and no character set is defined
- default-character-set=utf8
配置好后,重啟mysql.
1.2 如果是linux版本的mysql
修改mysql的配置文件,使數(shù)據(jù)庫與服務(wù)器操作系統(tǒng)的字符集設(shè)置一致,vi /etc/my.cnf 設(shè)置,如果沒有發(fā)現(xiàn)這個(gè)文件,就新建1個(gè),代碼如下:
- [mysqld]
- datadir=/var/lib/mysql
- socket=/var/lib/mysql/mysql.sock
- default-character-set=utf8
增加的關(guān)鍵一句,使得數(shù)據(jù)庫缺省以u(píng)tf8存儲(chǔ),當(dāng)然,修改后,要重啟數(shù)據(jù)庫,這樣設(shè)置后對(duì)新建的數(shù)據(jù)庫表才起作用,代碼如下.
用SHOW VARIABLES LIKE 'character_set_%';命令查看到如下內(nèi)容:
- +--------------------------+-----------------------------------------------------------------------+
- | Variable_name | Value |
- +--------------------------+-----------------------------------------------------------------------+
- | character_set_client | utf8|
- | character_set_connection | utf8|
- | |character_set_database |utf8 |
- | character_set_filesystem | binary |
- | character_set_results | utf8|
- | character_set_server | utf8 |
- | character_set_system | utf8 |
- | character_sets_dir | /home/jh/mysql/share/mysql/charsets |
- +--------------------------+-----------------------------------------------------------------------+
發(fā)現(xiàn)關(guān)鍵項(xiàng)目已經(jīng)用了utf8,但這樣還不夠,還要保證客戶端也是用utf8的字符集來操作的,登錄的時(shí)候,要用以下命令:mysql --default-character-set=utf8 -u root -p,再次用SHOW VARIABLES LIKE 'character_set_%';命令查看,結(jié)果變成了,代碼如下:
- +--------------------------+-----------------------------------------------------------------------+
- | Variable_name | Value |
- +--------------------------+-----------------------------------------------------------------------+
- | character_set_client | utf8 |
- | character_set_connection | utf8 |
- | character_set_database | utf8 |
- | character_set_filesystem | binary |
- | character_set_results | utf8 |
- | character_set_server | utf8 |
- | character_set_system | utf8 |
- | character_sets_dir | /home/jh/mysql/share/mysql/charsets/ |
- +--------------------------+-----------------------------------------------------------------------+
這樣才能保證客戶端所發(fā)命令都是基于utf8格式的,比如說建立數(shù)據(jù)庫和表,默認(rèn)就會(huì)以u(píng)tf8編碼,而無須再次指定,再次說一句對(duì)新建的數(shù)據(jù)庫和表起作用.
另外:第三種方法,網(wǎng)上看到的,先記錄一下.
1.如果安裝mysql的編碼已不能更改,很多朋友是購買虛擬主機(jī)建立網(wǎng)站,無權(quán)更改MYSQL的安裝編碼,這一關(guān)我們可以跳過,因?yàn)橹灰竺娴牟骄壅_,一樣能解決亂碼問題
2.修改數(shù)據(jù)庫編碼,如果是數(shù)據(jù)庫編碼不正確: 可以在phpmyadmin 執(zhí)行如下命令: ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
以上命令就是將test數(shù)據(jù)庫的編碼設(shè)為utf8.
3.修改表的編碼,代碼如下:
ALTER TABLE `category` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
以上命令就是將一個(gè)表category的編碼改為utf8.
4.修改字段的編碼,代碼如下:
ALTER TABLE `test` CHANGE `dd` `dd` VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
以上命令就是將test表中 dd的字段編碼改為utf8.
5.如果是這種情況容易解決,只需檢查下頁面,修改源文件的charset即可,這個(gè)正確就無問題了.
6.這種情況也是修改頁面charset即可.
新聞熱點(diǎn)
疑難解答
圖片精選