【保証成功】的 mysql 中文亂碼解決方案

news/2024/5/19 19:54:33 标签: MySQL, PHP, WordPress, SQL Server, Flex
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: km8335@hotmail.com
email: feel8335@yahoo.com.hk

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 , 夾PHPMySQL , 發覺在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中设定没用的!

http://www.niftyadmin.cn/n/670581.html

相关文章

speedoffice(Word)怎么将文字设置成倾斜的

我们有时在制作Word文件时&#xff0c;需要将里面的文字弄成倾斜的。那么这种怎么操作了 首先&#xff0c;选择需要设置成倾斜的文字&#xff0c;如图&#xff1a; 然后在“主页”菜单栏里面找到“斜体”工具 最后&#xff0c;点击“斜体”工具&#xff0c;我们就可以看到文字…

window平台下 实时高效打印其他窗口,并作为D3D纹理使用

工作需要&#xff0c;需要实现一功能&#xff0c;能实时后台更新并输出其他窗口图形作为D3D纹理使用。目前已经实现一个较为高效版本&#xff0c;并实现Unity3D插件&#xff0c;在U3D中使用。 下面是截图(用任务管理器窗口为例)&#xff0c;后面会贴出部分代码&#xff0c;小弟…

网页 跳转_微信h5网页跳转小程序方案

接入要求 主体要求: 仅开放给已认证的服务号系统要求&#xff1a;微信版本要求为&#xff1a;7.0.12及以上。系统版本要求为&#xff1a;iOS 10.3及以上、Android 5.0及以上接入微信JS-SDK 安装包&#xff0c;必须是1.6.0版本以上 "weixin-js-sdk": "^1.6.0&quo…

CC归属地壹基金捐款

所有过去及未来对CC软件的捐赠都会全部捐给壹基金 软件下载地址&#xff1a;http://fir.im/ccarea 支付宝帐号 1. 付款后请务必Email(ccSMSBlocker#gmail.com)联系作者&#xff0c;通过邮箱接收您的捐款码&#xff0c;感谢您对壹基金的捐赠&#xff01; 转载于:https://www.cnb…

常规实验所用溶液配方大全

常规实验所用溶液配方大全 1.0.5mol/LEDTA 配制 组分浓度&#xff1a; 0.5mol/l EDTA&#xff0c; PH8 配制量&#xff1a;500ml 配制方法(1)称取93.06克EDTA.Na2.2H2O&#xff0c;置于500 ml烧杯中 (2)加入约400ml dd H2O.用热磁力搅拌器充分搅拌 (3)用NaOH调节PH值到8&#x…

ofd文件怎么复制文字

我们有时需要将ofd格式里面的文字复制到其他文件里面去&#xff0c;直接复制要么乱码要么排版乱或者直接不让复制&#xff0c;那怎么办呢&#xff0c;其实这种格式我们可以转成Word&#xff0c;在Word里面复制文字的。今天小编就给大家分享一款免费的ofd转Word的软件&#xff0…

Eclipse中SVN的安装步骤(两种)和用法

一、给安装EclipseSVN&#xff0c;最常见的有两种方式&#xff1a;手动方式和使用安装向导方式。详细过程例如以下&#xff1a; 方式一&#xff1a;手动安装 1、从官网下载site-1.6.9.zip文件,网址是:subclipse.tigris.org2、从中解压出features与plugins目录&#xff0c;拷贝到…

一位高手悟出的炒股铁律,照着做,富可敌国!(转贴)

1、只买上升轨道的股票&#xff0c;不买下降轨道的股票&#xff0c;如果股票一直在上升轨道&#xff0c;就永远持有&#xff0c;不要卖&#xff01;2、在上升轨的下沿买进股票&#xff0c;然后持有&#xff0c;到上升轨发生明显的变化&#xff0c;卖出。3、局面复杂看不清的股票…