1. 程式人生 > >Mysql DBA 高級運維學習筆記-Mysql插入中文亂碼問題

Mysql DBA 高級運維學習筆記-Mysql插入中文亂碼問題

right data 移動 info 不一致 命令執行 esp 概念 -c

1.1 mysql插入中文數據亂碼

1.1.1MySQL中添加中文數據並查看檢表語句

a.創建cuizhong測試數據庫並查看建表語句

mysql> create database cuizhong;
Query OK, 1 row affected (0.00 sec)
mysql> show create database cuizhong\G
*************************** 1. row ***************************
   Database: cuizhong
Create Database: CREATE DATABASE `cuizhong` /*!40100 DEFAULT CHARACTER SET latin1 */
1 row in set (0.00 sec)

提示:如果在安裝MySQL時未指定字符集,則mysql默認字符集是latin1。

b.在cuizhong庫下創建一個student表,並查看表結構和建表語句

mysql> use cuizhong
Database changed
mysql> show tables;
+--------------------+
| Tables_in_cuizhong |
+--------------------+
| student|
+--------------------+
1 row in set (0.00 sec)

mysql> create table student( id int(4) NOT NULL AUTO_INCREMENT, name char(20) NOT NULL, PRIMARY KEY(id) );
mysql> desc student
-> ;
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra  |
+-------+----------+------+-----+---------+----------------+
| id| int(4)   | NO   | PRI | NULL| auto_increment |
| name  | char(20) | NO   | | NULL||
+-------+----------+------+-----+---------+----------------+
2    rows in set (0.00 sec)
mysql> show create table student\G
*************************** 1. row ***************************
   Table: student
Create Table: CREATE TABLE `student` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

提示:默認建表不指定字符集則繼承庫的字符集,即latin1。

c.批量插入數據到student表

mysql> insert into student values(1,‘zhangsan‘),(2,‘lisi‘),(3,‘wanger‘),(4,‘xiaozhang‘),(5,‘xiaowang‘);
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select * from student;
+----+-----------+
| id | name  |
+----+-----------+
|  1 | zhangsan  |
|  2 | lisi  |
|  3 | wanger|
|  4 | xiaozhang |
|  5 | xiaowang  |
+----+-----------+
5 rows in set (0.00 sec)

提示:數字和英文的數據時正常的,不會有亂碼問題。

d.插入一條中文數據

mysql> insert into student values(6,‘我是誰‘);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from student;
+----+-----------+
| id | name  |
+----+-----------+
|  1 | zhangsan  |
|  2 | lisi  |
|  3 | wanger|
|  4 | xiaozhang |
|  5 | xiaowang  |
|  6 | ???   |
+----+-----------+
6 rows in set (0.00 sec)

出現問題:中文內容亂碼

為什麽插入中文數據會出現亂碼問題呢?

通過上面的例子我們可以看出客戶端字符集和庫,表字符集不一樣導致亂碼問題,所以我們在插入數據的時候要先查看系統字符集和客戶端,庫表字符集是否一樣,不一樣將字符集修改一致再插入數據。字符集不一致導致插入亂碼解決辦法刪重新插入。

1.1.2 MySQL命令行插入中文數據不亂碼實戰

a.查看建表語句,註意默認的字符集是latin1

mysql> show create table student\G
*************************** 1. row ***************************
   Table: student
Create Table: CREATE TABLE `student` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

b.設置MySQL客戶端的字符集和建表的字符集latin1一致

設置字符集為插入數據表的字符集

mysql> set names latin1;
Query OK, 0 rows affected (0.00 sec)

c.再插入一條中文數據

mysql> insert into student values(7,‘小紅‘);
Query OK, 1 row affected (0.01 sec)

mysql> select * from student;
+----+-----------+
| id | name  |
+----+-----------+
|  1 | zhangsan  |
|  2 | lisi  |
|  3 | wanger|
|  4 | xiaozhang |
|  5 | xiaowang  |
|  6 | ???   |
|  7 | 小紅  |
+----+-----------+
7 rows in set (0.00 sec)

提示:不亂碼了,但是老的數據就沒辦法解決了。

上面的是MySQL命令行插入數據不亂碼的方法,那麽如果更新的數據多就需要執行sql文件更新數據了,所以保證執行sql文件也不亂碼怎麽辦呢?

1.1.3 執行SQL文件插入中文數據不亂碼實戰

a.將要更新的多個sql語句放在文本文件中如test.sql

mysql> system cat test.sql
set names latin1;
insert into student values(8,‘不認識‘);

提示:必須要加入set names latin1,確保插入數據不亂碼。

b.在MySQL命令行中通過source調用test.sql文件插入數據

mysql> source test.sql
Query OK, 0 rows affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

mysql> select * from student;
+----+-----------+
| id | name  |
+----+-----------+
|  1 | zhangsan  |
|  2 | lisi  |
|  3 | wanger|
|  4 | xiaozhang |
|  5 | xiaowang  |
|  6 | ???   |
|  7 | 小紅  |
|  8 | 不認識|
+----+-----------+
8 rows in set (0.00 sec)

小結:執行DQL,DML語句的時候要set name 系統及庫表的字符集。

1.1.4 通過MySQL 命令加字符集參數導入數據解決亂碼問題

a. 把要更新的多個SQL語句放入文本中,這次不帶set names latin1

#set names latin1;
insert into student values(9,‘李四‘);

b. 通過MySQL命令加上字符集參數指定latin1字符集導入test.sql

[root@localhost ~]# mysql -uroot -p123456 --default-character-set=latin1 cuizhong < test.sql

通過-e參數在mysql庫外查看結果

[root@localhost ~]# mysql -uroot -p123456 -e "set names latin1;select * from cuizhong.student"
+----+-----------+
| id | name  |
+----+-----------+
|  1 | zhangsan  |
|  2 | lisi  |
|  3 | wanger|
|  4 | xiaozhang |
|  5 | xiaowang  |
|  6 | ???   |
|  7 | 小紅  |
|  8 | 不認識|
|  9 | 李四  |
+----+-----------+

1.1.5 MySQL插入中文不亂碼5中方法小結

方法(1):登錄mysql先做然後再執行更新語句或執行語句文件

mysql> set names latin1;
Query OK, 0 rows affected (0.00 sec)
mysql> source test.sql
Query OK, 0 rows affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

提示:確保test.sql文件格式正確

方法(2):在sql文件中指定set names latin1;然後登錄mysql,通過如下命令執行。

mysql> source test.sql
Query OK, 0 rows affected (0.00 sec)

方法(3):在sql文件中指定set names latin1 然後通過mysql導入

[root@localhost ~]# mysql -uroot -p123456  cuizhong < test.sql
[root@localhost ~]# mysql -uroot -p123456 -e "set names latin1;select * from cuizhong.student"

提示:這裏的cuizhong是庫名不是表名。

方法(4):通過指定mysql命令的字符集參數來實現

#set names latin1;
insert into student values(9,‘李四‘);
[root@localhost ~]# mysql -uroot -p123456 --default-character-set=latin1 cuizhong < test.sql

方法(5)在配置文件裏設置客戶端及服務端相關參數

a.更改my.cnf客戶端模塊的參數,可以實現set names latin1效果,並永久生效

[client]
default-character-set=latin1

提示:不需要重啟服務,退出重新登陸生效。

b.在服務端裏面再指定latin1字符集

[mysqld]
Default-character-set=latin1適合5.1 及以前呢版本
Default-character-server=latin1 適合5.5

1.2 Mysql數據庫字符集知識

1.2.1 MySQL數據庫字符集介紹

簡單的說,一套文字符號及其編碼、比較規則的集合。MySQL數據庫字符集包括字符集(CHARACTER)和校對規則(COLLATION)兩個概念。其中,字符集是用來定義MySQL數據字符串的存儲方式,而校對規則則是定義比較字符串的方式。前面建庫的語句中CHARACTER SET latin1即為數據庫字符集而COLLATE latin1_swedish_ci 為校對字符集,有關字符集詳細內容參考mysql手冊,第10張字符集章節。

1.2.2 MySQL數據庫常見字符集介紹

使用MySQL時常用的字符集有下表四種

技術分享圖片

1.2.3 MySQL如何選擇合適的字符集

a.如果處理各種各樣的文字,發布到不同國家和地區,應選Unicode字符集。對mysql來說就是UTF-8(每個漢字三個字節),如果應用需處理英文,有少量漢字UTF-8更好。

b.如果只需支持中文,並且數據量很大,性能要求也很高,可選GBK(定長,每個漢字占雙字節,英文也占雙字節),如果需要大量運算,比較順序等定長字符集更快,性能高。

c.處理移動互聯網業務,可能需要使用utf8mb4字符集。

1.2.4 查看當前MySQL系統支持的字符集

[root@localhost ~]# mysql -uroot -p123456 -e "SHOW CHARACTER SET"

最常用的有四種:

[root@localhost ~]# mysql -uroot -p123456 -e "SHOW CHARACTER SET;"|egrep "gbk|utf8|latin1"|awk ‘ {print $0}‘
latin1    cp1252 West European    latin1_swedish_ci    1
gbk    GBK Simplified Chinese    gbk_chinese_ci    2
utf8    UTF-8 Unicode    utf8_general_ci    3
utf8mb4    UTF-8 Unicode    utf8mb4_general_ci    4

查看mysql當前的字符集設置情況

mysql> show variables like ‘character_set%‘;
+--------------------------+----------------------------------+
| Variable_name| Value|
+--------------------------+----------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database   | latin1   |
| character_set_filesystem | binary   |
| character_set_results| utf8 |
| character_set_server | latin1   |
| character_set_system | utf8 |
| character_sets_dir   | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+

提示:默認情況下character_set_client,character_set_connection,character_set_results三者的字符集和系統的字符集是一致的,是同時修改的。即為:

[root@localhost ~]# cat /etc/sysconfig/i18n 
LANG="zh_CN.UTF-8"
[root@localhost ~]# echo $LANG
zh_CN.UTF-8

1.3 Mysql數據庫默認設置的字符集是什麽?

a.先看一下mysql默認情況下設置的字符集

mysql> show variables like ‘character_set%‘;
+--------------------------+----------------------------------+
| Variable_name| Value|
+--------------------------+----------------------------------+
| character_set_client | gb2312   |
| character_set_connection | gb2312   |
| character_set_database   | latin1   |
| character_set_filesystem | binary   |
| character_set_results| gb2312   |
| character_set_server | latin1   |
| character_set_system | utf8 |
| character_sets_dir   | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+

不同字符集參數的含義如下

Variable_name  | Value  
| character_set_client | latin1  客戶端字符集
| character_set_connection | latin1  連接字符集
| character_set_database   | latin1數據庫字符集,配置文件指定或建庫建表指定
| character_set_results| latin1  返回結果字符集
| character_set_server | latin1服務器字符集,配置文件指定或建庫建表指定

更改linux系統字符集變量後,查看MySQL中字符集的變化

[root@localhost ~]# echo $LANG
zh_CN.UTF-8
[root@localhost ~]# mysql -uroot -p123456 -e "show variables like ‘character_set%‘;"
+--------------------------+----------------------------------+
| Variable_name| Value|
+--------------------------+----------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database   | latin1   |
| character_set_filesystem | binary   |
| character_set_results| utf8 |
| character_set_server | latin1   |
| character_set_system | utf8 |
| character_sets_dir   | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+

我們發現character_set_connection,character_set_client,character_set_server 三者的字符集和系統的一致也都改成utf8了。

1.4 執行set names latin1到底做了什麽

無論linux系統的字符集是gb2312還是utf8默認情況下插入數據都是亂碼的。

a.此時查看數據就是亂碼

mysql> use cuizhong
Database changed
mysql> select * from student
-> ;
+----+---------------------+
| id | name|
+----+---------------------+
|  1 | zhangsan|
|  2 | lisi|
|  3 | wanger  |
|  4 | xiaozhang   |
|  5 | xiaowang|
|  6 | ??? |
|  7 | ?°?o¢  |
|  8 | ??è?¤èˉ?   |
|  9 | ?????  |
+----+---------------------+
9 rows in set (0.10 sec)

b. 執行完set對應的字符集操作,就解決亂碼問題了

(1)先查看一下庫和表的字符集

mysql> show create database cuizhong\G
*************************** 1. row ***************************
   Database: cuizhong
Create Database: CREATE DATABASE `cuizhong` /*!40100 DEFAULT CHARACTER SET latin1 */
1 row in set (0.00 sec)
mysql> show create table student\G
*************************** 1. row ***************************
   Table: student
Create Table: CREATE TABLE `student` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

(2)我們看庫和表的字符集都是latin1,所以執行set names latin1保證字符集一樣就不會亂碼了。

mysql> set names latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from student;
+----+-----------+
| id | name  |
+----+-----------+
|  1 | zhangsan  |
|  2 | lisi  |
|  3 | wanger|
|  4 | xiaozhang |
|  5 | xiaowang  |
|  6 | ???   |
|  7 | 小紅  |
|  8 | 不認識|
|  9 | 李四  |
+----+-----------+

(3)執行完set字符集操作的結果改變了如下字三個字符集character_set_client,character_set_connection,character_set_results的參數。

mysql> show variables like ‘character_set%‘;
+--------------------------+----------------------------------+
| Variable_name| Value|
+--------------------------+----------------------------------+
| character_set_client | latin1   |
| character_set_connection | latin1   |
| character_set_database   | latin1   |
| character_set_filesystem | binary   |
| character_set_results| latin1   |
| character_set_server | latin1   |
| character_set_system | utf8 |
| character_sets_dir   | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+

1.5 Mysql命令參數—default-character-set=latin1在做什麽?

(1)先查看一下mysql的字符集

[root@localhost ~]# mysql -uroot -p123456 -e "show variables like ‘character_set%‘;"
+--------------------------+----------------------------------+
| Variable_name| Value|
+--------------------------+----------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database   | latin1   |
| character_set_filesystem | binary   |
| character_set_results| utf8 |
| character_set_server | latin1   |
| character_set_system | utf8 |
| character_sets_dir   | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+

(2)帶—default-character-set=latin1 參數登錄mysql

[root@localhost ~]# mysql -uroot -p123456 --default-character-set=latin1
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.5.32 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

mysql> 

(3)現在再查看mysql的字符集

mysql> show variables like ‘character_set%‘;
+--------------------------+----------------------------------+
| Variable_name| Value|
+--------------------------+----------------------------------+
| character_set_client | latin1   |
| character_set_connection | latin1   |
| character_set_database   | latin1   |
| character_set_filesystem | binary   |
| character_set_results| latin1   |
| character_set_server | latin1   |
| character_set_system | utf8 |
| character_sets_dir   | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+

(4)帶參數登錄也是臨時修改不帶參數登錄又變回去了

[root@localhost ~]# mysql -uroot -p123456 --default-character-set=latin1 -e "show variables like ‘character_set%‘;"
+--------------------------+----------------------------------+
| Variable_name| Value|
+--------------------------+----------------------------------+
| character_set_client | latin1   |
| character_set_connection | latin1   |
| character_set_database   | latin1   |
| character_set_filesystem | binary   |
| character_set_results| latin1   |
| character_set_server | latin1   |
| character_set_system | utf8 |
| character_sets_dir   | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+

[root@localhost ~]# mysql -uroot -p123456 -e "show variables like ‘character_set%‘;"
+--------------------------+----------------------------------+
| Variable_name| Value|
+--------------------------+----------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database   | latin1   |
| character_set_filesystem | binary   |
| character_set_results| utf8 |
| character_set_server | latin1   |
| character_set_system | utf8 |
| character_sets_dir   | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+

1.6 確保MySQL數據庫插入數據不亂碼解決方案

1.6.1統一MySQL數據庫客戶端及服務端的字符集

(1)MySQL數據庫的下面幾個字符集(客戶端和服務端)統一成一個字符集才能確保插入的中文數據庫可以正常輸出。當然,linux系統的字符集也要盡可能和數據庫字符集統一。

(2)show variables like ‘character_set%‘;命令輸出結果如下:

Variable_name| Value 
+--------------------------+--------------------------------+
①character_set_client | latin1  客戶端字符集
②character_set_connection | latin1  連接字符集
③character_set_database   | latin1   數據庫字符集
④character_set_results| latin1   返回結果字符集
⑤character_set_server | latin1   服務器字符集,配置文件制定或建庫建表指定

其中,①②④三個參數默認情況采用linux系統字符集設置,人工登錄數據庫執行set names latin1以及mysql指定字符集登錄操作,都是改變mysql客戶端的client、connection、results3個參數的字符集都為latin1,從而解決插入亂碼問題,這個操作可以在my.cnf配置文件裏修改mysql客戶端的字符集,配置方法如下:

[client]
Default-character-set=latin1
提示:不需要重啟
[root@localhost ~]# sed -n "18,22p" /etc/my.cnf 
[client]
#password    = your_password
port        = 3306
socket        = /usr/local/mysql/tmp/mysql.sock
default-character-set = latin1
[root@localhost ~]# mysql -uroot -p123456 -e "show variables like ‘character_set%‘;"
+--------------------------+----------------------------------+
| Variable_name| Value|
+--------------------------+----------------------------------+
| character_set_client | latin1   |
| character_set_connection | latin1   |
| character_set_database   | latin1   |
| character_set_filesystem | binary   |
| character_set_results| latin1   |
| character_set_server | latin1   |
| character_set_system | utf8 |
| character_sets_dir   | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+

(3)修改完客戶端字符集不用set查詢表數據就不會亂碼了

[root@localhost ~]# mysql -uroot -p123456 -e "select * from cuizhong.student;"
+----+-----------+
| id | name  |
+----+-----------+
|  1 | zhangsan  |
|  2 | lisi  |
|  3 | wanger|
|  4 | xiaozhang |
|  5 | xiaowang  |
|  6 | ???   |
|  7 | 小紅|
|  8 | 不認識 |
|  9 | 李四|
+----+-----------+

1.6.2 更改MySQL服務端字符集

(1) 按下面要求修改my.cnf參數

[mysqld]
Default-character-set = latin1適合5.1及以前版本

(2) 修改前查看當前字符集

[root@localhost ~]# mysql -uroot -p123456 -e "show variables like ‘character_set%‘;"
+--------------------------+----------------------------------+
| Variable_name| Value|
+--------------------------+----------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database   | latin1   |
| character_set_filesystem | binary   |
| character_set_results| utf8 |
| character_set_server | latin1   |
| character_set_system | utf8 |
| character_sets_dir   | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+

(3) 查看修改的參數

[root@localhost ~]# sed -n "26,27p" /etc/my.cnf 
[mysqld]
character-set-server = utf8

(4) 重啟mysql服務(生產環境是不允許重啟的)

[root@localhost ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL.. SUCCESS!

(5) 查看更改後的字符集

[root@localhost ~]# mysql -uroot -p123456 -e "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   | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+

提示:以上在[mysqld]下設置的參數會更改下面2個參數的字符集設置。

| Variable_name| Value|
| character_set_database   | utf8 |
| character_set_server | utf8 |

這個時候我們再修改系統字符集mysql數據庫字符集就不改了。

[root@localhost ~]# cat /etc/sysconfig/i18n 
LANG="zh_CN.GB2312"
#LANG="zh_CN.UTF-8"
[root@localhost ~]# source /etc/sysconfig/i18n 
[root@localhost ~]# mysql -uroot -p123456 -e "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   | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+

1.6.3 統一mysql數據庫客戶端及服務端字符集總結

不亂碼思想:建議中英文環境選擇utf8 ,linux系統,客戶端,服務端,庫,表,程序字符集統一。

1.Linux系統字符集統一utf8

[root@localhost ~]# cat /etc/sysconfig/i18n 
LANG="zh_CN.UTF-8"

提示linux客戶款也要更改字符集 例如:xshell

技術分享圖片

例如:SecureCRT

技術分享圖片

2.Mysql數據庫客戶端

臨時:

Set names latin1

永久:

更改my.cnf客戶端模塊的參數,可以實現set names latin1效果,並永久生效。

3.服務端

更改my.cnf參數

[mysqld]
Default-character-set = latin1適合5.1及以前版本
character-set-server = latin1適合5.5

4.庫表,程序 指定字符集建庫

Create database cuizhong_utf8 DEFAULT CHARACTER SET UTF8 COLLATE後面加校對規則

我們可以show一下查看支持的校對規則

mysql> show character set;
+----------+-----------------------------+---------------------+--------+
| Charset  | Description | Default collation   | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5 | Big5 Traditional Chinese| big5_chinese_ci |  2 |
| dec8 | DEC West European   | dec8_swedish_ci |  1 |
| cp850| DOS West European   | cp850_general_ci|  1 |
| hp8  | HP West European| hp8_english_ci  |  1 |
| koi8r| KOI8-R Relcom Russian   | koi8r_general_ci|  1 |
| latin1   | cp1252 West European| latin1_swedish_ci   |  1 |
| latin2   | ISO 8859-2 Central European | latin2_general_ci   |  1 |
| swe7 | 7bit Swedish| swe7_swedish_ci |  1 |
| ascii| US ASCII| ascii_general_ci|  1 |
| ujis | EUC-JP Japanese | ujis_japanese_ci|  3 |
| sjis | Shift-JIS Japanese  | sjis_japanese_ci|  2 |
| hebrew   | ISO 8859-8 Hebrew   | hebrew_general_ci   |  1 |
| tis620   | TIS620 Thai | tis620_thai_ci  |  1 |
| euckr| EUC-KR Korean   | euckr_korean_ci |  2 |
| koi8u| KOI8-U Ukrainian| koi8u_general_ci|  1 |
| gb2312   | GB2312 Simplified Chinese   | gb2312_chinese_ci   |  2 |
| greek| ISO 8859-7 Greek| greek_general_ci|  1 |
| cp1250   | Windows Central European| cp1250_general_ci   |  1 |
| gbk  | GBK Simplified Chinese  | gbk_chinese_ci  |  2 |
| latin5   | ISO 8859-9 Turkish  | latin5_turkish_ci   |  1 |
| armscii8 | ARMSCII-8 Armenian  | armscii8_general_ci |  1 |
| utf8 | UTF-8 Unicode   | utf8_general_ci |  3 |
| ucs2 | UCS-2 Unicode   | ucs2_general_ci |  2 |
| cp866| DOS Russian | cp866_general_ci|  1 |
| keybcs2  | DOS Kamenicky Czech-Slovak  | keybcs2_general_ci  |  1 |
| macce| Mac Central European| macce_general_ci|  1 |
| macroman | Mac West European   | macroman_general_ci |  1 |
| cp852| DOS Central European| cp852_general_ci|  1 |
| latin7   | ISO 8859-13 Baltic  | latin7_general_ci   |  1 |
| utf8mb4  | UTF-8 Unicode   | utf8mb4_general_ci  |  4 |
| cp1251   | Windows Cyrillic| cp1251_general_ci   |  1 |
| utf16| UTF-16 Unicode  | utf16_general_ci|  4 |
| cp1256   | Windows Arabic  | cp1256_general_ci   |  1 |
| cp1257   | Windows Baltic  | cp1257_general_ci   |  1 |
| utf32| UTF-32 Unicode  | utf32_general_ci|  4 |
| binary   | Binary pseudo charset   | binary  |  1 |
| geostd8  | GEOSTD8 Georgian| geostd8_general_ci  |  1 |
| cp932| SJIS for Windows Japanese   | cp932_japanese_ci   |  2 |
| eucjpms  | UJIS for Windows Japanese   | eucjpms_japanese_ci |  3 |
+----------+-----------------------------+---------------------+--------+
39 rows in set (0.00 sec)

5.開發程序的字符集

簡體UTF8

http://download.comsenz.com/Discuzx/3.2/Discuz_X3.2_SC_UTF8.zip。

1.7 如何更改生產MySQL數據庫庫表的字符集

數據字符集的修改步驟

對於已有數據庫想修改字符集不能直接通過“alter database character set ”或者”alter table tablename character set ”,這兩個命令都沒有更新已有數據的字符集。而只是對新創建的表或者數據生效。

已經有記錄的字符集的調整必須將數據導出,經過修改字符集之後重新導入才可完成。

修改數據庫默認編碼

Alter database [your db name] charset [your character setting]

下面模擬將latin1字符集的數據庫修改成GBK字符集的過程。

(1)導出表結構

Mysqldump –uroot –p123456 –-default-character-set=latin1 –d dbname>alltable1.sql –-default-character-set=gbk 表示以GBK字符集進行連接 –d只導表結構。

(2)然後編輯alltable.sql將latin1用sed替換成GBK

(3)確保數據不在更新導出所有數據

Mysqldmup –uroot –p123456 –-quick –-no-create-info –-extended-insert –-default-character-set=latin1 dbname>alltable.sql

參數說明:

--quick:用於轉儲大的表,強制mysqldump從服務器一次一行的檢索數據而不是檢索所有行並輸出前CACHE到內存中。

--no-create-info:不創建CREATE TABLE 語句。

--extended-insert:使用包括幾個VALUES列表的多行INSERT語法,這樣文件更小,IO也小導入數據是非常快。

--default-character-set=latin1按照原有字符集導出數據,這樣導出的文件中,所有中文都是可見的,不會保存成亂碼。

(4)打開alltable.sql將set names latin1修改成set names gbk(或者修改系統的服務端和客戶端)

(5)建庫

Create database dbname default charset gbk;

(6)創建表執行,alltable1.sql

Mysql –uroot –p123456 dbname<alltable1.sql

(7)導入數據

Mysql –uroot –p123456 dbname<alltable.sql

總結:latin1改成utf8

(1)建庫及建表的語句導出,sed批量修改為utf8。

(2)導出所有數據。

(3)修改mysql服務端和客戶端編碼為utf8。

(4)刪除原有的庫表及數據。

(5)導入新的建庫建表的語句。

(6)導入mysql的所有數據。

Mysql DBA 高級運維學習筆記-Mysql插入中文亂碼問題