ssh遠程連接linux下的MySQL數據庫字符集和防止亂碼


實驗環境:

本地windows 8.1

遠程連接工具 SecureCRT 7.3

Linux發行版本 CentOS 6.7 x86_64位Linux系統,內核的版本為2.6.32-573

mysql版本 mysql-5.5.32

1.1 MySQL數據庫字符集介紹

字符集就是一套文字符號及編碼、比較規則的集合

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

1.1.1 在互聯網環境中,使用MySQL時常用的字符集有

常用字符集

一個漢字長度

說明

GBK

2字節

不是國際標准,對中文環境支持的很好

UTF-8

3字節

中英文混合的環境,建議使用此字符集,用的比較多

latin1

1字節

MySQL的默認字符集

utf8mb4

4字節

UTF-8 Unicode,用於移動互聯網

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

1)        如果處理各種各樣的文字,發布到不同語言國家地區,應選擇Unicode字符集,對mysql來說就是UTF-8(每個漢字3字節),更適合於多英文少中文

2)        如果只需要支持中文,並且數據量很大,性能要求也很高,可選GBK(定長,每個漢字占雙字節,英文也占雙字節),更適合於大量運算、比較排序,定長字符集,性能較高

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

老師建議:沒有特別需求,請選擇UTF-8

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

mysql> show character set;

1.2 查看系統當前使用的字符集

mysql> show variables like 'character_set%';

 

想要不亂碼,就要讓上述字符集統一

1.3 更改客戶端的字符集

1.3.1 進入數據庫后更改客戶端字符集

set names gbk;

將3個客戶端的字符集(1、2、5)改為gbk

相當於輸入下面3條命令:

set character_set_client = gbk;

set character_set_results = gbk;

set character_set_connection = gbk;

1.3.2 登錄數據庫時更改客戶端字符集,效果同上

[root@db02 ~]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock --default-character=gbk;

mysql> show variables like 'character_set%';

 

1.3.3 修改配置文件my.cnf

永久生效,上面

[client]

default-character-set=gbk

注意:多實例的情況下,此步驟修改字符集,要修改/etc/my.cnf

1.4 更改服務端字符集

1.4.1 修改配置文件my.cnf

[mysqld]

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

character-set-server=uft8  ##適合5.5

重啟服務后永久生效

這個修改影響的第3和第6個字符集,相當於修改

character_set_database

character_set_server

1.4.2 在編譯的時候指定服務端字符集

-DDEFAULT_CHARSET=utf8 \

-DDEFAULT_COLLATION=utf8_general_ci \

-DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \

1.4.3 命令行修改庫的字符集

不建議在有數據的庫上修改,下面的命令對之前已經存在的數據無效,影響之后更新的數據

mysql> alter database oldboy character set latin1 collate = latin1_swedish_ci;

mysql> show create database oldboy\G

1.4.4 命令行修改表的字符集

不建議在有數據的表上修改,下面的命令對之前已經存在的數據無效,影響之后更新的數據

mysql> alter table oldboy.test character set latin1;

mysql> show create table oldboy.test\G

1.5 防止亂碼,統一其它地方

1.5.1 建表建庫的時候注意統一字符集

建庫

create database oldboy_utf8 default character set utf8 collate utf8_general_ci

建表

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=utf8

1.5.2 程序

程序代碼的編碼要和庫表統一,UTF-8無簽名

1.5.3 linux服務端

cat /etc/sysconfig/i18n

$LANG的字符集要和數據庫統一

1.5.4 連接工具CRT的字符集

更改SecureCRT工具的默認字符集為utf-8

1.5.5 在數據庫中執行sql語句的方法

1)        操作習慣

盡量不在MySQL命令行直接插入數據(SSH客戶端影響),將SQL語句放到文件里

2)        sql文件的格式

統一使用“uft8沒有簽名”

3)        導入文件方式

可在MySQL命令行中用source執行sql文件

命令方式導入數據mysql –uroot –poldboy123 oldboy <test.sql

4)        導入sql語句時設置客戶端字符集

sql文件里加入set names utf8;

或者mysql –uroot –poldboy123 oldboy --default-character-set=uft8 <test.sql

1.6 更改已有數據的數據庫字符集

思想:導出原庫的表結構和數據,刪除原庫創建新庫,將表結構和數據導入新庫

1.6.1 導出表結構

mysqldump –uroot –poldboy123 --default-character-set=latin1 –d dbname >alltable.sql

--default-character-set=uft8表示以utf8字符集進行連接,-d只導表結構

1.6.2 編輯表結構語句

表結構alltable.sql將所有latin1字符串改成utf8(可以用sed做個替換)

1.6.3 導出數據

確保數據庫不再更新,導出所有數據(不帶表結構)

mysqldump –uroot –poldboy123 --quick --no-create-info --extended-insert --default-character-set =latin1 dbname >alldata.sql

參數說明:

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

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

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

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

1.6.4 修改my.cnf配置

調整客戶端及服務端字符集,重啟生效

1.6.5 通過utf8建庫

刪除原庫,然后create database dbname default charset utf8;

1.6.6 導入表結構

導入的是更改過的字符集的表結構

mysql –uroot –poldboy123 dbname <alltable.sql

1.6.7 導入數據

mysql –uroot –poldboy123 dbname <alldata.sql

PS:選擇目錄字符集時,要注意最好大於等於源字符集(字庫更大),否則可能會丟失不被支持的數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM