MySQL字元集不一致的解決辦法總結

來源:互聯網
上載者:User

這陣子忙著把資料庫從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 即可。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.