程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 解決MySQL中文亂碼的方法歸納

解決MySQL中文亂碼的方法歸納

編輯:MySQL綜合教程

本文主要是介紹解決MySQL中文亂碼的方法歸納,如果你在解決MySQL中文亂碼的實際操作中存在不解之處時,你不妨浏覽下面的文章,希望你能從中獲得自己想要的東西。自從寫完下面兩篇文章:

wordpress 1.5升級注意事項MySQL 中文亂碼篇

MySQL(和PHP搭配之最佳組合) 4.1中文亂碼第二擊

過去幾個月就不斷有來信詢問各種MySQL(和PHP搭配之最佳組合)中文相容的問題,所以有機會看到許多玩家們用的各式連接法與程式,實在太開眼界。

最近因為轉換到flex 2做為開發平台並重寫一些產品,許多去年寫的framework就無法使用,而其中有部份專門處理多國語系的library也隨之失效,導致我得重新面對這個問題,所以正好籍此機會將一些新心得整理出來。

MySQL(和PHP搭配之最佳組合)中文亂碼的原因

MySQL(和PHP搭配之最佳組合)會出現MySQL 中文亂碼的原因不外乎下列幾點:

MySQL(和PHP搭配之最佳組合) server本身設定問題,例如還停留在latin1

MySQL(和PHP搭配之最佳組合) table的語系設定問題(包含character與collation)

客戶端程式(例如php)的連線語系設定問題

在之前的兩篇文章中已介紹過如何設定MySQL(和PHP搭配之最佳組合) server/table的character/collation。

接下來只需要補充幾點注意事:

MySQL(和PHP搭配之最佳組合)MySQL 中文亂碼必勝解決法

1、MySQL(和PHP搭配之最佳組合)啟動時會讀取一個預設的config檔,一般名稱為my.ini,而它會到下列兩位置去尋找這個檔案:

C:\windows\my.ini也就是作業系統的安裝目錄,也有可能是C:\winnt\my.ini

C:\:my.cnf也就是C disk的根目錄

注意不同位置裡的檔案suffix不一樣,這點在之前的文章中沒有特別強調,因此那時我是用更復雜的方法直接重新將MySQL(和PHP搭配之最佳組合)注冊到service裡面,並在那裡指定my.ini的位置。

2、my.ini裡的內容為:

  1. [MySQL(和PHP搭配之最佳組合)d]  
  2. defaultcharacterset=utf8 
  3. [client]  
  4. defaultcharacterset=utf8 
  5. init_connect='SET NAMES utf8' 

其中MySQL(和PHP搭配之最佳組合)d是指定server啟動時要用的語系,但如果這裡設定為utf8可能會讓許多英文軟體不開心,例如osCommerce/mediaWiki,所以這裡建議設成latin1。

下面的client則是設定當client連線時要使用什麼語系,但可惜的是這個設定不是每個client都會鳥它,基本上只有MySQL(和PHP搭配之最佳組合)自已家的程式,例如MySQL(和PHP搭配之最佳組合).exe, MySQL(和PHP搭配之最佳組合)d.exe, MySQL(和PHP搭配之最佳組合)admin.exe或是MySQL(和PHP搭配之最佳組合) Control Center這種程式會去讀取這個設定檔然後改用utf8連線。

note:感謝b6s桑熱情相助提供第二行指令,據說比一支支php程式去設定connection setting更快,這樣應該也可以順便解決phpmyadmin無法正確顯示unicode中文的問題(不過amfphp到是不吃這套,一定要乖乖的自已設定語系才行)

但大部份工程師應該都是自已寫php/jsp(SUN企業級應用的首選)程式去連線,此時自然不會讀取這個設定而繼續使用預設的語系 latin1。

這也正是八成來信朋友陣亡的地方。

通常我會用一個獨立的檔案來處理MySQL(和PHP搭配之最佳組合) connection的設定,例如:

  1. PLAIN TEXT  
  2. <? 
  3. //database connection details.  
  4. $host = "localhost";  
  5. $link = MySQL(和PHP搭配之最佳組合)_connect($host, "xxx", "xxx");  
  6. MySQL(和PHP搭配之最佳組合)_query("SET NAMES 'utf8'");  
  7. MySQL(和PHP搭配之最佳組合)_select_db("your_table_name_here", $link);  
  8. ?>  

請注意在MySQL(和PHP搭配之最佳組合)_connect後第五行的地方有加上一個"set names 'utf8' "的指令,告訴MySQL(和PHP搭配之最佳組合)這個connection之後的連線內容都要使用utf8,經過這樣設定後,通常就可以解決大部份問題。

從這裡也可以推想得知,如果你有用某種custom connection pooling機制,就要記得在每次建立新的connection後立即設定為utf8。

這組設定經過幾天的反覆測試(使用中文繁、簡、日文、韓文)後已經證實完全不會有亂碼或是某些字變成"口"。

例子:試者輸入這幾個字「不道可否啰」如果它們能正確進入MySQL(和PHP搭配之最佳組合)再被讀出來,那就是中文沒問題了,如果讀出來後變成『口』字那就是革命還未成功同志仍需努力...orz

當然我也順便驗證了flex2 amfphp php MySQL(和PHP搭配之最佳組合)來回傳resultset也不再會有MySQL 中文亂碼問題,可以安心使用啰。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved