TShopping

 找回密碼
 註冊
搜索
查看: 586|回復: 0

[教學] mysql中文亂碼的原因

  [複製鏈接]
發表於 2012-9-14 23:30:10 | 顯示全部樓層 |閱讀模式
 
Push to Facebook Push to Plurk Push to Twitter 
mysql中文亂碼的原因*mysql中文亂碼的原因
mysql 會出現中文亂碼的原因不外乎下列幾點:
→ mysql server本身設定問題,例如還停留在 latin1
→ mysql table 的語系設定問題(包含 character 與 collation)
→ 客戶端程式(例如 php) 的連線語系設定問題


mysql 4.1 及之後的版本在語系方面增加了許多功能,它可以設定語系的層次從最底層的 server, database 到單一 table, column, connection 都可以設定,而除了語系之外,還可以指定搭配不同的 collation(校對),所以組合百百種,只要一個錯了就難逃亂碼的命運。

進phpmyadmin找到可輸入 sql query的畫面,然後鍵入:
show variables like '%character%';
這句話會顯示目前資料庫使用的語系設定,一般國外的網站或剛裝好的 mysql 4.1預設都是 latin-1。

[新增資料庫]
如果你熟悉 phpmyadmin 的操作,在畫面上就可以選擇建立新 database 要用的語系,
charset 請選擇 UTF-8 Unicode (utf8)
collation 請選擇 utf8_general_ci (ci 代表 case insensitve 大小寫沒差)

[修改資料庫]
改 database語系,同樣在 phpmyadmin 的query畫面鍵入下面兩行:
alter database myblog
character set utf8;


前面曾經提過,mysql的語系設定是多層次的,前面我們把database與table的語系都設定正確,但程式與mysql連線時的語系則是由 connection 來決定,這部份就要使用程式碼
mysql_query("SET NAMES 'utf8'");
這句話會同時設定 client, results, connection三者使用的語系為 utf-8。

最後檢查是否全部改成 utf-8
show variables like '%character%';

此時你應該會看到大部份欄位都是utf-8了,除了 server 這項之外,如果是用別人的 hosting 主機,就沒法兒改這部份,但平常做案子時大部份都可以直接控管mysql,此時就可以用 my.ini 設定:

[mysqld]
default-character-set=utf8
告訴mysql server啟動時要用 utf-8即可。



*mysql中文亂碼必勝解決法
1、mysql 啟動時會讀取一個預設的 config 檔,一般名稱為 my.ini,而它會到下列兩位置去尋找這個檔案:
C:\windows\my.ini 也就是作業系統的安裝目錄,也有可能是 C:\winnt\my.ini
C:\:my.cnf 也就是 C disk 的根目錄


2、my.ini 裏的內容為:
[mysqld]
default-character-set=utf8

[client]
default-character-set=utf8
init_c

其中 mysqld 是指定 server 啟動時要用的語系,但如果這裏設定為 utf8 可能會讓許多英文軟體不開心,例如 osCommerce/mediaWiki/wordpress/drupal/gregarius,所以這裏建議設成 latin1。要使用utf8中文的人,只要記得建資料庫時將它設成utf8,讓中文程式正確的使用 utf8 與它溝通即可。


下面的 client 則是設定當 client 連線時要使用什麼語系,但可惜的是這個設定不是每個 client 都會鳥它,基本上只有 mysql 自已家的程式,例如 mysql.exe, mysqld.exe, mysqladmin.exe 或是 MySQL Control Center 這種程式會去讀取這個設定檔然後改用 utf8 連線。

所以通常會用一個獨立的檔案來處理 mysql connection的設定,例如:

PHP:

  1. <?
  2. //database connection details.
  3. $host = "localhost";
  4. $link = mysql_connect($host, "xxx", "xxx");
  5. mysql_query("SET NAMES 'utf8'");
  6. mysql_select_db("your_table_name_here", $link);
  7. ?>
複製代碼

請注意在 mysql_connect後第五行的地方有加上一個 "set names 'utf8' "的指令,告訴mysql 這個 connection 之後的連線內容都要使用utf8,經過這樣設定後,通常就可以解決大部份問題。

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


 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2016-12-9 18:06 , Processed in 0.055151 second(s), 18 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表