In php/mysql, flash, flex December 19, 2005 - 1:23 pm
I promise this is gonna be the last time on it
自從寫完下面兩篇文章:
wordpress 1.5升級注意事項 - 中文亂碼篇
mysql 4.1中文亂碼第二擊
過去幾個月就不斷有來信詢問各種 mysql 中文相容的問題,所以有機會看到許多玩家們用的各式連接法與程式,實在太開眼界。
最近因為轉換到 flex 2做為開發平台並重寫一些產品,許多去年寫的 framework 就無法使用,而其中有部份專門處理多國語系的library也隨之失效,導致我得重新面對這個問題,所以正好籍此機會將一些新心得整理出來。
*mysql中文亂碼的原因
mysql 會出現中文亂碼的原因不外乎下列幾點:
-mysql server本身設定問題,例如還停留在 latin1
-mysql table 的語系設定問題(包含 character 與 collation)
-客戶端程式(例如 php) 的連線語系設定問題
在之前的兩篇文章中已介紹過如何設定 mysql server/table 的 character/collation。
接下來只需要補充幾點注意事:
*mysql中文亂碼必勝解決法
1、mysql 啟動時會讀取一個預設的 config 檔,一般名稱為 my.ini,而它會到下列兩位置去尋找這個檔案:
C:\windows\my.ini 也就是作業系統的安裝目錄,也有可能是 C:\winnt\my.ini
C:\:my.cnf 也就是 C disk 的根目錄
注意不同位置裏的檔案suffix不一樣,這點在之前的文章中沒有特別強調,因此那時我是用更複雜的方法直接重新將mysql 註冊到 service裏面,並在那裏指定 my.ini的位置。
2、my.ini 裏的內容為:
[mysqld]
default-character-set=utf8
[client]
default-character-set=utf8
init_connect='SET NAMES utf8'
其中 mysqld 是指定 server啟動時要用的語系,但如果這裏設定為 utf8可能會讓許多英文軟體不開心,例如 osCommerce/mediaWiki,所以這裏建議設成 latin1。
下面的 client 則是設定當 client 連線時要使用什麼語系,但可惜的是這個設定不是每個client都會鳥它,基本上只有 mysql 自已家的程式,例如 mysql.exe, mysqld.exe, mysqladmin.exe 或是 MySQL Control Center這種程式會去讀取這個設定檔然後改用 utf8 連線。
note: 感謝 b6s 桑熱情相助提供第二行指令,據說比一支支php程式去設定connection setting更快,這樣應該也可以順便解決phpmyadmin無法正確顯示 unicode 中文的問題(不過 amfphp 到是不吃這套,一定要乖乖的自已設定語系才行)
但大部份工程師應該都是自已寫 php/jsp 程式去連線,此時自然不會讀取這個設定而繼續使用預設的語系 - latin1。
這也正是八成來信朋友陣亡的地方。
通常我會用一個獨立的檔案來處理 mysql connection的設定,例如:
PLAIN TEXT<?
//database connection details.
$host = "localhost";
$link = mysql_connect($host, "xxx", "xxx");
mysql_query("SET NAMES 'utf8'");
mysql_select_db("your_table_name_here", $link);
?>
請注意在 mysql_connect後第五行的地方有加上一個 "set names 'utf8' "的指令,告訴mysql 這個 connection 之後的連線內容都要使用utf8,經過這樣設定後,通常就可以解決大部份問題。
從這裏也可以推想得知,如果你有用某種custom connection pooling機制,就要記得在每次建立新的connection後立即設定為 utf8。
這組設定經過幾天的反覆測試(使用中文繁、簡、日文、韓文)後已經証實完全不會有亂碼或是某些字變成 "口"。
例子:試者輸入這幾個字「不道可否囉」如果它們能正確進入mysql再被讀出來,那就是中文沒問題了,如果讀出來後變成『口』字那就是革命還未成功同志仍需努力...orz
當然我也順便驗証了 flex2 - amfphp - php - mysql 來回傳resultset 也不再會有中文亂碼問題,可以安心使用囉。
by admin
36 Comments Add your own
1. b6s&hellip | January 2nd, 2006 at 10:58 pm
根據強者我同事的親身體驗,把 SET NAMES=utf8 設在 my.cnf 裡比較直接--除非你還有別的 big5 或 latin1 的程式要跑。
2. b6s&hellip | January 2nd, 2006 at 11:00 pm
init_connect='SET NAMES utf8′
3. axis&hellip | February 17th, 2006 at 9:39 pm
網路上查詢到的相關文章,只要從mysql4.0升到mysql4.1的,都有一個共通的、很奇怪的現象~~那就是:永遠假設大家轉到4.1後用的會是UTF8,可是,現在台灣和香港,中文碼使用率佔90%的,好像是BIG5,而不是UTF8喔,就連許多大型站,也是以BIG5佔90%喔
那麼,如果在MYSQL4.1上不想改用UTF8,想要照4.0用LATIN1的話,OK,將4.0匯出的資料以LATIN1匯入4.1,成功!!實既用PHP連進去,中文顯示正常!!
如果在mysql 4.1上面把資料表dump出來,想說既然和4.0一樣都是用latin1編碼,那應該也可以restore回4.1吧?? 錯!! 用phpmyadmin匯出.sql檔,打開一看,中文字全是亂碼,匯回去果然失敗!!!奇怪?? 都已經用latin1了,為何第一次匯進去ok...但再匯出來,再匯回去就不行呢??
(4.0也是用latin1, 匯出來的.sql中文字正常,匯回去也沒問題)
在mysql4.1上,如果我一定要用latin1,那要如何匯出備份的資料表才是正確,並可
成功再匯回去呢??
4. dennys&hellip | March 5th, 2006 at 8:21 am
請問如何在把mysql註冊到service時更改my.ini的位置呢?
5. dennys&hellip | March 5th, 2006 at 9:03 am
我查到了, 是這樣的
mysqld-nt.exe --install MySQL --defaults-file="D:\Database\MySQL\Server\bin\my.ini"
原來只有 --install 參數時, MySQL 可以省略. 但若加上了 --defaults-file, 則 MySQL 不能省略.
6. jeremy&hellip | March 5th, 2006 at 11:18 am
yap, you got it,
如果沒記錯,MySQL 是就是指你要註冊到 service裏的名稱。
以前我喜歡用 mysql4, mysql5 來區分版本。
btw, Tiger2, 好熟悉的名稱啊!突然回到大學的歡樂時光...
7. 大頭貓&hellip | March 15th, 2006 at 12:21 am
在mac上被中文亂碼的問題所擾,看到這篇文章解決掉我的問題. 謝謝~!!
ps: 順便提一下自己的2 cents: 有些IDE把"UTF-8"和"UTF8"都列在encoding的選項中, 要設成utf8才能正常work.
8. jeremy&hellip | March 15th, 2006 at 9:41 am
呵 那這個 IDE 作者該打屁股啊...
9. yespie&hellip | June 16th, 2006 at 11:07 am
感谢楼主,我的C#就是因为汉字问题,看了你的方法,就解决了!!!
10. Hiso&hellip | August 24th, 2006 at 3:48 am
我netfirms上的代理空間內
以mysql+php+amfphp出來的中文亂碼
是用mysql_query("SET NAMES 'utf-8'"); 解決的
用mysql_query("SET NAMES 'utf8'"); 就會亂碼... @@
11. 囈語二三,, ::PIXN&hellip | December 13th, 2006 at 6:45 pm
惱人的 mysql 4.1 之後的連線編碼問題...
mysql 自從 v4.1 開始近乎歇斯底里的在所有能加上語系設定的地方都加上了語系設定選項,\r\n大至全系統設定,小至單一欄位,\r\n全部的地方都可以個別設置不同的語系設定。\r\n而且除了...
12. 釋德念&hellip | December 24th, 2006 at 6:04 pm
大感謝~我的亂碼問題也解決了
採用的方法是在mysql_select_db();前面
放這一行:mysql_query("SET NAMES 'utf8'");
13. Blog of Roy Chan » &hellip | January 23rd, 2007 at 9:22 pm
[...] 【保証成功】的 mysql 中文亂碼解決方案 [...]
14. zscmeditate&hellip | January 24th, 2007 at 9:02 pm
我的乱码问题也解决了,是用set names搞定的,非常非常感谢,查了一个多小时的资料啊!!
15. laipi&hellip | January 26th, 2007 at 4:02 pm
大感謝~我的亂碼問題也解決了
我使用下列的方式可以
mysql_query(”SET NAMES ‘utf8′”);
下列的方式不行
mysql_query(”SET NAMES ‘utf-8′”);
16. Dataheart&hellip | January 28th, 2007 at 7:55 pm
真的非常谢谢!
按照文章所说在在my.ini中加入init_connect='SET NAMES utf8'
果然解决中文乱码问题.
17. kai&hellip | February 13th, 2007 at 1:21 pm
您好
我最近因換 wordpress hosting的關係,mysql data 從原本的4.121 匯進4.027, 結果中文也都是亂碼.
我發現我從4.121 export 出來的檔案. 只要是中文就已變成亂碼.
這是我在4.121上的setting
character set client utf8
Global value) latin1
character set connection utf8
(Global value) latin1
character set database latin1
character set results utf8
(Global value) latin1
character set server latin1
character set system utf8
character sets dir usr/share/mysql/charsets/
collation connection utf8_unicode_ci
(Global value) latin1_swedish_ci
collation database latin1_swedish_ci
collation server latin1_swedish_ci
在4.027上
show variables like '%character%'
得到
character_set german1
character_sets latin1 big5 czech euc_kr gb2312 gbk latin1_de sjis...
convert_character_set
因為我對DB實在不熟,不知那邊須要注意一下,謝謝.
18. kai&hellip | February 14th, 2007 at 5:01 am
我用另外一個方式解決了.
1.我發現用wordpress內建的backup plugin 備出來的中文沒有問題.
2.然後在新的wordpress 安裝 WP-DBManager plugin, restore回去就OK了.
謝謝
19. KIM&hellip | March 12th, 2007 at 12:45 am
你好..我在網上申請了一個php mysql 的free hosting 出現中文亂碼問題....
但裡面 改不到my.ini, 加了mysql_query(”SET NAMES ‘utf8′”); 在select db 前還是不行...
究竟有甚麼辨法可以顯示中文呢?
mysql table 的 collation, character 要set 做甚麼?
每個field 的 collation 又要set 甚麼?
還有..需要在php 的header 加一些東西嗎?
可以幫我一下嗎?
msn:
[email protected]
email:
[email protected]
20. KIM&hellip | March 12th, 2007 at 11:41 pm
mysql_query("SET NAMES 'utf8'");
mysql_select_db($dbname,$conn)or die('no selectdb');
$values = "'$title'" .","."'$_POST[category]'".","."'$a'".","."'$today'".","."'$photoName1'".","."'$photoName2'".",". "'$photoName3'" .","."'0'";
$table = "blog_content";
$query ="INSERT INTO blog_content ( blog_title,category,blog, publish_date,photo1,photo2,photo3,reply)Values
('$title','$_POST[category]','$_POST[description]','$today','$photoName1','$photoName2','$photoName3','0')";
$result = mysql_query($query);
以上如果輸入的資料全是英文的便没問題
中文例如 $_POST[description]="中文字" 會輸入不到,(那欄位没有輸入任何資料...但英文正常輸入)
如果拿走 mysql_query("SET NAMES 'utf8'"); 即輸入到中文但變了亂碼..
怎辨呀...
21. GaryAu&hellip | March 14th, 2007 at 3:29 am
我使用 Fedora Core 5 , 夾PHP 及MySQL , 發覺在PHP 要加多一句以確定server 連線
mysqli_query($mysqli_link,"SET NAMES 'utf8'");
mysqli_query($mysqli_link,"SET CHARACTER SET UTF8");
再輸入sql query , 中文輸入到mysql 的問題才解決
22. bb&hellip | March 23rd, 2007 at 1:23 pm
由於是申請的主機,所以也改不到my.ini
主機的資訊:MySQL4.1.x
MySQL文字編碼:CP1250 WEST EUROPEAN(Latin1)
MySQL連線校對:Latin1_swedish_ci
php都有加addslashes()。
==================
我可以做的:
create table default charset = utf8
collate = utf8_unicode_ci
我的舊web是big5
mysql_client_encoding = latin1
1)不用SET NAMES:不處理中文反斜線,正常。
2)SET NAMES 'big5':亂碼
3)SET NAMES 'latin1':不處理中文反斜線,正常。
================================
我可以做的之二:
create table use default
這樣應該和MySQL預設的一樣都是latin1
我的舊web是big5
mysql_client_encoding = latin1
1)不用SET NAMES:要處理中文反斜線。
2)SET NAMES 'big5':亂碼
3)SET NAMES 'latin1':不處理中文反斜線,正常。
==================================
請問,這樣是怎麼回事呢?
謝謝。
23. abc&hellip | April 3rd, 2007 at 2:50 pm
請問收到這些亂碼字可以怎樣才能看到
你真是? 窀医袒岵钆衫吹摹O麓文憧梢窗 F渲杏懈鲦⒚茫惨壹甘榍宜担何也灰宜瞪翊透业暮芊岣坏模阍儆哺遥揖鸵恕K且恢卑盐宜偷匠嫡尽N揖龆ㄏ麓稳ィ透遣榫炔樾略迹庋晕易约阂彩歉鲅昂痛俳T俑谴ピ廾朗陀耙糇柿系取?/FONT>
24. A-Do&hellip | April 20th, 2007 at 5:37 am
真的很感謝你~簡單明瞭
解決了我痛苦很久的問題^^
25. carrie&hellip | May 16th, 2007 at 11:48 am
版主你好
下面是我在yahoo的留言備份, 存證用的
可是後來打開後卻出現亂碼
請問有辦法 讓我看到原來的留言嗎?
可以用e-mail將正常的文字 回覆給我嗎?? 感恩!
拜肈12
iwant_0955007900 (13) 纯ネ 硂琌и程Ω痙ē倒 硂妓磷ぃ莱 眔ㄏи蹦猭硚畖тそ笵 笵 ê碞ぃ琌10窾じ碞秆∕ㄆ薄 稱睲贰 或暗碞 Ω叫眤盢璹蹲и眀腹 玥ちㄌ猭矪瞶 2007-05-10 1121
26. carrie&hellip | May 16th, 2007 at 1:55 pm
Jeremy
謝謝你的熱心幫忙
解決了我的困擾
感恩
Carrie
27. ychzhu&hellip | May 22nd, 2007 at 7:46 am
Name of the sole proprietor: 盤志雄個人ä¼æ¥ä¸»
Name of the shop: æ–°è¯åœ°ç”¢å»ºç¯‰è²¿æ˜“è¡Œ (Chinese only)
Company registration number: 3948 (CO)
Date of establishment: 01/02/2000
Address: æ¾³é–€å·´æ³¢æ²™é¦¬è·¯ç¿ è¼é–£ï¼åº§äºŒæ¨“
Statue: Active
请问有办法看到上面的乱码吗?
可以用e-mail將正常的文字 回复给給我嗎? 感谢您!
28. jeremy&hellip | May 22nd, 2007 at 2:39 pm
呃,你這段文字已經完全亂掉,用軟體也救不回來了,抱歉...
29. Brain&hellip | May 27th, 2007 at 5:44 pm
我也是用 mysql_query("SET NAMES 'utf8'"); 就解決問題了.
感謝分享~
30. Charles&hellip | June 29th, 2007 at 2:34 pm
還是沒辦法解決吶!
在PHP code裡,直接下一串有中文的SQL Command進MYSQL,沒有問題。(Update TableName Set FieldName=’中文的’)
但是同樣的SQL Command,如果是從txt文字檔讀出來,直接寫進MYSQL資料庫的話,phpadmin中顯示亂碼。
(從文字檔讀出來的SQL Command,直接顯示在網頁上是正常的,但是寫進資料庫後,phpadmin顯示亂碼)。各位有遇過這種問題嗎?
31. phpandmysql小朋友&hellip | July 6th, 2007 at 3:39 pm
mysql_db_query(DBNAME,"SET NAMES 'big5'",$link);
我本來也是亂碼問號
在PHP中加入以上指令就成功了
你神!
感謝各位大大解答!
32. jaxx&hellip | August 20th, 2007 at 2:58 pm
謝謝你幫我解決問題
SET NAMES果然有用!
33. 小雞亦&hellip | August 21st, 2007 at 5:14 pm
大好啦!!! set names 好野!!
多謝大大!XDDDD
34. cinje&hellip | September 29th, 2007 at 1:13 pm
非常感謝分享~~
讓我把亂碼問題解決了@_@
35. Linus&hellip | October 11th, 2007 at 11:59 am
windows2003 英文版
mysql 5.0数据库用utf8字符集
用odbc做连接,odbc里面连接字符集用utf8
在my.ini里
[client]
default-character-set=utf8
init_connect='SET NAMES utf8'
开发语言:asp.net
在web.config里设encoding="utf-8"
可是汉字还是不能正常显示,请帮忙,多谢!
附:
在windows2003简体版里,同样设置可以正确显示简繁体
36. darkmoon&hellip | October 23rd, 2007 at 12:56 pm
经测试,在my.ini中设定没用的!