XuGang

记录一个程序员的成长

 

MySQL字符集不一致的解决办法总结

这阵子忙着把数据库从MS SQL数据库改成MySQL数据库,简直过着非人的生活!
再怎么忙,还是想做做笔记,绝不允许自己把一个错误重犯二次。OK,言归正传。。。
SQL:
                SELECT faqname, faqparent, phrase.text AS title
                FROM faq AS faq
                INNER JOIN phrase AS phrase ON
                (phrase.phrasetypeid = 7000 AND phrase.varname = faq.faqname)
                WHERE phrase.languageid IN(-1, 0, 1)
                AND (
                        faqparent IN('vb_custom_status', 'vb_update_profile',
                                     'vb_calendar_how', 'vb_referrals_explain',
                                     'vb_sig_explain', 'vb_user_maintain')
                OR
                        faqname IN('vb_custom_status', 'vb_update_profile',
                                   'vb_calendar_how', 'vb_referrals_explain',
                                   'vb_sig_explain', 'vb_user_maintain')
                     )
 
mysql 错误: Illegal mix of collations (latin1_bin,IMPLICIT) and (latin1_swedish_
ci,IMPLICIT) for operation '='
 
mysql 错误号: 1267

从我自己的cnblogs(http://www.cnblogs.com/xugang/articles/882943.html)中看了看错误提示:)
1267:不合法的混合字符集。

总结:
错误是在你的结果集中有两种字符集。   
 比如说你在两个表联合查询,一个表的字符集是latin1,另一个是utf8,
这样在你的结果集中有两种字符集,mysql会报上面的错误。  
  一个表中不同的字段使用不同的字符集,也是一个道理。  
  用SHOW   CREATE   TABLE   table_name;可以看出具体的字符集设置。 
  
  查了帮助手册,说是user的字符集没有设,默认为utf8,将其转为latin1或gb2312等字符集
 
  解决方法:   
  将不同的字符集,转化成统一的字符集。 

After   an   upgrade   to   MySQL   4.1,   the   statement   fails:    
   
  mysql>   SELECT   SUBSTRING_INDEX(USER(),'@',1);  
  ERROR   1267   (HY000):   Illegal   mix   of   collations  
  (utf8_general_ci,IMPLICIT)   and   (latin1_swedish_ci,COERCIBLE)  
  for   operation   'substr_index'  
   
  The   reason   this   occurs   is   that   usernames   are   stored   using   UTF8   (see   section   11.6   UTF8   for   Metadata).   As   a   result,   the   USER()   function   and   the   literal   string   '@'   have   different   character   sets   (and   thus   different   collations):    
   
  mysql>   SELECT   COLLATION(USER()),   COLLATION('@');  
  +-------------------+-------------------+  
  |   COLLATION(USER())   |   COLLATION('@')         |  
  +-------------------+-------------------+  
  |   utf8_general_ci       |   latin1_swedish_ci   |  
  +-------------------+-------------------+  
   
  One   way   to   deal   with   this   is   to   tell   MySQL   to   interpret   the   literal   string   as   utf8:    
   
  mysql>   SELECT   SUBSTRING_INDEX(USER(),_utf8'@',1);  
  +------------------------------------+  
  |   SUBSTRING_INDEX(USER(),_utf8'@',1)   |  
  +------------------------------------+  
  |   root                                                               |  
  +------------------------------------+  
   
  Another   way   is   to   change   the   connection   character   set   and   collation   to   utf8.   You   can   do   that   with   SET   NAMES   'utf8'   or   by   setting   the   character_set_connection   and   collation_connection   system   variables   directly.    

表的编码转换可以用:(MySQL   Version   >   4.12)  
  ALTER   TABLE   tbl_name   CONVERT   TO   CHARACTER   SET   charset_name;   
    
  之前的版本可以用:   
  ALTER   TABLE   tbl_name   CHARACTER   SET   charset_name;

MySQL官方解释:
http://dev.mysql.com/doc/refman/5.0/en/charset-collation-charset.html


附加:

修改字段类型的方法:(经过 google 搜索)
登录MYSQL后执行这个语句就可以了:
ALTER TABLE `phrase` CHANGE `varname` `varname` VARCHAR( 250 ) NOT NULL;

修改字段字符集的方法:

  mysql〉show   full   columns   from   table就會發現兩個字段的字符集是不一樣的。  
  通過用  
  ALTER   TABLE   `tname`     CHANGE   `column`   `column`   VARCHAR(   15   )   CHARACTER   SET   latin1   NOT   NULL。  
  (假設變更為字符型,並且字符集類別為latin1   latin1   )


修改.ini文件的方法:(不建议使用)
在mysql 的安装目录下有一个my.ini文件,
打开找到[mysql]下的default-character-set=*****,改成default-character-set=gb2312,重启mysql 即可。

posted on 2007-09-06 17:16  钢钢  阅读(18003)  评论(0编辑  收藏  举报

导航