MySQL的中文UTF8亂碼問題

來源:互聯網
上載者:User

從MySQL支援Unicode後,為了與時俱進,我們的web程式也開始考慮用UTF8了。其實UTF8也用了好幾年了,程式基本能跑,沒什麼大問題,但是資料倒換的時候,總是遇到不爽的事情。

【問題現象】

網頁xxx.php用EditPlus另存新檔UTF8格式,MySQL在my.ini裡設定default-character-set=utf8,建表時加了CREATE TABLE `xxx ` (myname varchar(255)) ENGINE=MyISAM DEFAULT CHARSET=utf8,用xxx.php執行insert/update/select出來的都是中文,貌似沒問題,但是用phpMyAdmin看select是亂碼,用第三方工具軟體(如SQLyog)看select也是亂碼,mysqldump也是亂碼,很不爽。當然,如果你建表的時候,選擇了binary/varbinary/blob類型,不會發現亂碼,因為指定的是二進位儲存,MySQL儲存資料時就沒有編碼的概念了。

【尋找問題】

雖然在my.ini裡設定default-character-set=utf8,但是執行以下命令時有新發現:

mysql> SHOW VARIABLES LIKE 'character%';

+----------------------------------------+-------------------------

| Variable_name | Value

+----------------------------------------+-------------------------

| character_set_client | latin1

| character_set_connection | latin1

| character_set_database | utf8

| character_set_filesystem | binary

| character_set_results | latin1

| character_set_server | utf8

| character_set_system | utf8

| character_sets_dir | D:\mysql\share\charsets\

+----------------------------------------+-------------------------

8 rows in set (0.00 sec)

mysql> SHOW VARIABLES LIKE 'collation_%';

+---------------------------------------+------------------

| Variable_name | Value

+---------------------------------------+------------------

| collation_connection | latin1_swedish_ci

| collation_database | utf8_general_ci

| collation_server | utf8_general_ci

+--------------------------------------+------------------

3 rows in set (0.00 sec)

發現Value列裡面不全是utf8,仍然有部分是latin1,比如其中的client和connection。那網頁xxx.php的工作過程就是這樣的啦:從xxx.php頁面上輸入漢字,因為xxx.php是UTF8編碼的,所以xxx.php以UTF8格式轉換輸入的漢字,然後以UTF8提交給mysql,但是mysql的client和connection都是latin1的,而表是UTF8的,所以mysql儲存時,先將xxx.php提交的漢字,轉成latin1的格式,再轉成UTF8字元格式設定存在表中。如果此時我們用第三方軟體或者phpMyAdmin去select查看此表,而表中儲存的資料是被latin1過的UTF8字元,出來的時候是以UTF8格式取的,當然看起來時亂碼了。解決方案就是讓所有過程都是UTF8的就可以了。

【解決問題】

1、從my.ini下手

[client]

default-character-set=utf8

[mysql]

default-character-set=utf8

[mysqld]

default-character-set=utf8

以上3個section都要加default-character-set=utf8,平時我們可能只加了mysqld一項。

然後重啟mysql,執行

mysql> SHOW VARIABLES LIKE 'character%';

mysql> SHOW VARIABLES LIKE 'collation_%';

確保所有的Value項都是utf8即可。

2、建表時加utf8,表欄位的Collation可加可不加,不加時預設是utf8_general_ci了。

CREATE TABLE `tablename4` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`varchar1` varchar(255) DEFAULT NULL,

`varbinary1` varbinary(255) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8

3、網頁xxx.php儲存時選擇utf8編碼,頁頭最好加上

header('conten-type:text/html;charset=utf-8');

在執行CRUD操作前先執行一下

mysql_query("set names utf8");

測試代碼xxx.php如下:

<?php

header('conten-type:text/html;charset=utf-8');

mysql_connect("localhost", "root", "password") or die("Could not connect: " . mysql_error());

mysql_select_db("test");

mysql_query("set names utf8");

$str = "CHN 軟體開發有限公司,JPN ソフトウェア開発株式會社,KOR 소프트웨어 개발 유한 공사,RUS Суд программного обеспечения".time();

$sql = "insert into tablename4 (varchar1, varbinary1 ) values ('".$str."','".$str."')";

echo $sql."<hr>";

mysql_query($sql);

$result = mysql_query("SELECT id, varchar1 ,varbinary1 FROM tablename4");

while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {

printf ("ID: %s , varchar1: %s, varbinary1: %s<br>", $row[0], $row["varchar1"], $row["varbinary1"]);

}

mysql_free_result($result);

?>

如此設定之後,無論是在php頁面插入任何utf8字元,在php頁面裡取出來的,在phpMyAdmin裡取出來的,在mysql的第三方用戶端軟體裡取出來的,都是一樣的漢字了,不會再發現亂碼,mysqldump出來的也是漢字。OK,問題解決。

【另】在中文windows系統下,在cmd.exe裡運行mysql.exe字元終端,不能使用上面的規則,因為預設情況下,中文windows系統cmd.exe裡的字碼頁是cp936即GBK,不能顯示全部UTF8字元,所以在字元終端裡看到亂碼是正常現象,不要奇怪,這個問題在類Unix系統的shell終端裡可以解決的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.