天天看點

mysql 英文亂碼_MySQL亂碼問題及字元集

一、MySQL亂碼問題

(一)為什麼亂碼

我們有時候往資料庫中插入中文會出現亂碼,那麼為什麼會出現亂碼呢?實際上這是因為字元集沒有統一的緣故,它必須同時滿足以下的統一才能保證資料庫不亂碼:

Linux系統伺服器的語言

MySQL用戶端的字元集

MySQL服務端的字元集

MySQL的庫、表的字元集

開發程式的字元集

也就是說上面的字元集都統一才不會出現亂碼問題。下面就來看看如何處理每一種情況。

(二)字元集

1、什麼是字元集

字元集就是一套文字元号及其編碼、比較規則。

MySQL資料庫字元集包括字元集(CHARACTER)和校對規則(COLLATION)兩個概念。其中,字元集是用來定義MySQL數字字元串的存儲方式。而校對規則是定義比較字元串的方式。

2、常見字元集

常用字元集

長度

說明

GBK

2

非國際标準

UTF-8

3

中英文混合環境,建議使用

latin1

1

MySQL預設字元集

utf8mb4

4

UTF-8 Unicode,用于移動網際網路

3、如何選擇字元集

如果處理各種文字,并且釋出到不同國家,MySQL選擇UTF-8字元集

如果隻需要支援中文,并且資料量大、性能高,MySQL選擇GBK字元集

如果處理移動網際網路,MySQL選擇utf8mb4字元集

(三)解決亂碼

1、Linux系統語言選擇

#檢視系統目前的語言

[[email protected] /]#echo $LANG

en_US.UTF-8

#檢視系統支援的語言,如果沒有中文可進行安裝yum groupinstall chinese-support

[[email protected] /]#locale

en_US.UTF-8"LC_NUMERIC="en_US.UTF-8"LC_TIME="en_US.UTF-8"LC_COLLATE="en_US.UTF-8"LC_MONETARY="en_US.UTF-8"LC_MESSAGES="en_US.UTF-8"LC_PAPER="en_US.UTF-8"LC_NAME="en_US.UTF-8"LC_ADDRESS="en_US.UTF-8"LC_TELEPHONE="en_US.UTF-8"LC_MEASUREMENT="en_US.UTF-8"LC_IDENTIFICATION="en_US.UTF-8"LC_ALL=

然後,可進行系統語言設定,假設使用的都是utf8字元集:

#vim /etc/sysconfig/i18n

SYSFONT="latarcyrheb-sun16"

2、MySQL用戶端的字元集

臨時修改

mysql> set names utf8;

這種臨時修改,一旦退出MySQL用戶端,重新登入就失效了。

永久修改

通過更改/etc/my.cnf下用戶端的配置參數,可實作臨時修改的效果,并且是永久生效的。

#vim /etc/my.cnf

[client]

default-character-set=utf8

這種永久修改無需重新開機MySQL服務,隻需要退出重新登入就可以生效。

3、MySQL服務端的字元集

[mysqld]

default-character-set=utf8 #适合5.1及以前的版本

character-set-server=utf8 #适合5.5版本

修改完畢後重新開機服務即可。

4、MySQL的庫、表的字元集

#建庫指定字元集

create database crm DEFAULT CHARACTER SET UTF8 COLLATE utf8_general_ci;#建表指定字元集

CREATE TABLE `userinfo` (

`id` int(4) NOT NULL AUTO_INCREMENT,

`username` char(20) NOT NULL,

PRIMARY KEY(`id`)

)ENGINE=InnoDB DEFAULT CHARSET=utf8

(四)檢視設定情況

在上面設定完畢後,可以檢視字元集的情況:

mysql> show variables like 'character_set%';+--------------------------+-------------------------------------------+

| Variable_name | Value |

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

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | utf8 |

| character_set_filesystem | binary |

| character_set_results | utf8 |

| character_set_server | utf8 |

| character_set_system | utf8 |

| character_sets_dir | /application/mysql-5.5.32/share/charsets/ |

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

8 rows in set (0.00 sec)

對于上面的參數,有下面的解釋:

Variable_name

Value

character_set_client

用戶端字元集

character_set_connection

連接配接字元集

character_set_database

資料庫字元集(配置檔案指定或者建庫、建表指定)

character_set_results

傳回結果字元集

character_set_server

伺服器字元集(配置檔案指定或者建庫、建表指定)

我們知道在上面更改了linux的字元集、MySQL用戶端字元集、MySQL服務端字元集、MySQL庫表字元集,那麼對應的上面的參數那個改變了呢?

當改變了Linux系統的字元集後。character_set_client、character_set_connection、character_set_results這三者的字元集都與系統的保持一緻了。

當改變了MySQL用戶端字元集後。character_set_client、character_set_connection、character_set_results這三者的字元集都被改成了與MySQL用戶端的字元集。比如,set names utf8,這樣前面的三個參數酒杯改成了utf8的字元集。這三個參數預設是與系統的保持一緻。

當改變了MySQL服務端字元集後。比如,在my.cnf配置檔案中設定服務端字元集,character_set_database、character_set_server這二者的字元集會與服務端配置檔案中的一緻。

二、生産環境MySQL字元集更改

對于已經插入到資料庫中的資料,通過“alter database character set *” 或者“alter tablename character set *”并不能更改已經插入到資料庫中資料的字元集,隻是對新建立的表或者記錄生效。

對于已經插入到資料庫中資料字元集的調整,必須先将資料導出,待字元集修改完畢後再将資料導入即可。

(一)執行步驟

1、導出建庫、建表結構

mysqldump -uroot -p --default-character-set=latin1 -d dbname>alltable.sql#說明:--default-character-set=latin1表示以latin1字元集進行連接配接;-d 隻導出表結構

2、修改建庫、建表字元集

修改上述導出的alltable.sql檔案,将字元集latin1修改為你要更改的字元集,比如utf8。

3、導出資料庫中資料

確定資料庫中資料不再更新,然後到處所有的資料。

mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 dbname>alltada.sql"""說明:

--quick 用于轉儲大的表,強制mysqldump從伺服器一次一行的檢索資料而不是檢索所有行,并且輸出前CACHE到記憶體中

--no-create-info 不建立CREATE TABLE語句

--extended-insert 使用包括幾個VALUES清單的多行INSERT文法,這樣檔案更小、IO小,導出資料更快

--default-character-set=latin1 按照原有字元集導出資料,這樣導出的中文不會亂碼"""

4、修改導出的資料檔案

修改導出的alldata.sql檔案,将set names latin1修改為你需要更改的字元集(比如:set names utf8,或者修改Linux系統的用戶端和服務端)

5、建庫、建表、導入資料

#建庫

create database dbname default charset utf8;#建表,導入alldata.sql檔案中的建表語句和資料

mysql -uroot -p dbname

(二)總結

建庫、建表語句導出,并且通過sed批量将字元集修改為utf8

導出MySQL庫中資料

修改MySQL用戶端和服務端字元集為utf8

删除原有的庫、表及資料

導入新的建庫、建表語句

導入資料