MYSQL字符集錯誤:ERROR 1267 (HY000): Illegal mix of...解決 老生常談,MYSQL 字符集問題: 1、mysql字符集 mysql字段、表以及數據庫、數據庫連接、數據庫返回結果、等都有著默認字符集。 默認字符集基本上都是可以在建表建庫之初進行設定的,有的也可以默認設置。但是,很多時候可能忘了設置字符集,另外連接數據庫和返回結果、存儲的時候,字符集往往可能不一樣,所以就容易出現字符集問題。比如,存進去是中文,讀出來是亂碼,這寫都是常有的事情。 如何查看數據庫的字符集:
01 mysql> show VARIABLES LIKE 'character_set_%' ; 02 +--------------------------+--------------------------------------+ 03 | Variable_name | Value | 04 +--------------------------+--------------------------------------+ 05 | character_set_client | latin1 | 06 | character_set_connection | latin1 | 07 | character_set_database | utf8 | 08 | character_set_filesystem | binary | 09 | character_set_results | latin1 | 10 | character_set_server | latin1 | 11 | character_set_system | utf8 | 12 | character_sets_dir | /Apps/mysql5.1/share/mysql/charsets/ | 13 +--------------------------+--------------------------------------+ 1 <span></span> mysql> SHOW VARIABLES LIKE 'collation_%'; 2 +----------------------+-------------------+ 3 | Variable_name | Value | 4 +----------------------+-------------------+ 5 | collation_connection | latin1_swedish_ci | 6 | collation_database | utf8_general_ci | 7 | collation_server | latin1_swedish_ci | 8 +----------------------+-------------------+ 9 3 rows in set (0.00 sec)
2、問題: 如果建表默認是latin字符集,那麼表內字段默認就是latin的,PHP 如果是utf8方式連接,mysql也會自動存成latin字符集,如果查詢的話,按照utf8連接來查詢latin字段中包含中文字符的話,則會返回如類似如下的錯誤: 先看看表字段的字符集:
1 mysql> show create table t_search_str \G 2 *************************** 1. row *************************** 3 Table: t_search_str 4 Create Table: CREATE TABLE `t_foo` ( 5 `str` varchar(100) CHARACTER SET latin1 NOT NULL DEFAULT '', 6 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 7 1 row in set (0.00 sec)
很明顯,數據庫字符集和字段字符集不一致,這是根本原因,比如,在utf8模式下,就會返回如下錯誤:
mysql> set names utf8; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM t_foo WHERE `str`='測試' ; ERROR 1267 (HY000): Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
3、解決辦法 解決辦法很簡單:將該字段的字符集和連接字符作左匹配做修改即可(總之,要一致就行):
1 alter table t_foo change `str` `str` varchar(100) character set utf8 not null ;
再查詢試試:
1 mysql> SELECT COUNT(*) AS ct FROM t_foo WHERE `str`='測試' ; 2 +----+ 3 | ct | 4 +----+ 5 | 0 | 6 +----+ 7 1 row in set (0.00 sec)
這樣,字段和數據庫的字符集就一致了。