MySQL 字符集,亂碼等問題解決centos7,Mysql5.7

MySQL 字符集說明以及字符集錯誤恢復

實驗環境centos7以上版本(不會的看我以前的教程)
mysql5.7 (我帶你快速裝一次用yum裝)

首先安裝mysql
注:mysql-5.7.tar.gz 中包括了安裝 mysql5.7 主要的軟件包。 這樣部署起來更方便
https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar
去這裏下載tar包
然後上次到root的家目錄下面
在這裏插入圖片描述

[root@huaxinfeng63 ~]# tar xvf mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar
[root@huaxinfeng63 ~]# yum -y install ./mysql*.rpm
[root@huaxinfeng63 ~]# systemctl start mysqld 	#啓動 MySQL 會生成臨時密碼。

在 MySQL 的配置文件/etc/my.cnf 中關閉密碼強度審計插件,並重啓 MySQl 服務
[root@huaxinfeng63 ~]# vim /etc/my.cnf #修改 MySQL 的配置文件,在[myqld]標籤處末行 添加以下項:

validate-password=OFF #不使用密碼強度審計插件,記住一定是最後一行哦。

[root@huaxinfeng63 ~]# systemctl restart mysqld #重啓 MySQL 服務

[root@huaxinfeng63 ~]# grep ‘temporary password’ /var/log/mysqld.log #獲取臨時密碼
A temporary password is generated for root@localhost: buL.UJp4dSOd #臨時密碼

[root@huaxinfeng63 ~]# mysql -u root -p’buL.UJp4dSOd’ #使用臨時密碼登錄 MySQl,注意臨時密碼要引號
登陸進來之後設置密碼爲123

mysql> set password for root@localhost = password('123'); #修改 root 用戶密碼爲 123

字符集介紹

字符集就是一套文字符號及其編碼、比較規則的集合,第一個計算機字符集 ASCII!MySQL 數據庫字 符集包括字符集(CHARACTER)和校對規則(COLLATION)兩個概念,其中字符集用來定義 MySQL 數據字符串的存儲方式,而校對規則定義比較字符串的方式

在這裏插入圖片描述

MySQL 怎樣選擇合適的字符集

1.如果處理各種各樣的文字,發佈到不同語言國家地區,應選 Unicode 字符集,對 MySQL 來說就是 UTF-8(每個漢字三個字節)

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

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

查看當前 MySQL 支持的字符集

MySQL 可以支持多種字符集,同一臺服務器,庫或表的不同字段都可以指定不同的字符集

[root@huaxinfeng63 ~]#  mysql -u root -p123 -e "show character set \G;"

在這裏插入圖片描述
這就是mysql支持的字符集 注:/G是以橫向格式輸出
查看常用的字符集:

[root@huaxinfeng63 ~]# mysql -uroot -p123 -e "show character set \G;" | egrep "gbk|utf8|awk'{print $0}'"

在這裏插入圖片描述
查看 MySQL 當前的字符集設置情況
[root@huaxinfeng63 ~]# mysql -uroot -p123
mysql> show variables like ‘character_set%’;
在這裏插入圖片描述
修改 MySQL 的字符集

[root@huaxinfeng63 ~]# vim /etc/my.cnf #修改 MySQL 配置文件,在[mysqld]處的未 行添加如下:
[root@huaxinfeng63 ~]# character-set-server=utf8
[root@huaxinfeng63 ~]# systemctl restart mysqld
[root@huaxinfeng63 ~]# mysql -u root -p123
mysql> show variables like 'character_set%';

在這裏插入圖片描述

實驗

在不使用任何工具的情況下,修改字符集,保證數據完整性,但是要停服務器中途不能進行增刪改操作

將字符集爲 latin1 已有記錄的數據轉成 utf8,並且已經存在的記錄不亂碼

  1. 步驟
    (1) 建庫及建表的語句導出,sed 批量修改爲 UTF-8
    (2) 導出之前所有的數據
    (3) 修改 MySQL 服務端和客戶端編碼爲 UTF-8
    (4) 刪除原有的庫表及數據
    (5) 導入新的建庫及建表語句
    (6) 導入之前的數據

首先你要把表結構導出,導出book的表結構到booktabke.sql中
[root@huaxinfeng63 ~]# mysqldump -u root -p123 --default-character-set=latin1 -d book> booktable.sql

  1. 編輯 booktable.sql 將 latin1 修改成 utf8
    [root@huaxinfeng63 ~]# vim booktable.sql #修改所有 latin1 爲 utf8
    在 vim 未行模式下 :%s/latin1/utf8/g 全文查找 latin1 並替換爲 utf8。

  2. 確保數據庫不再更新,導出所有數據
    [root@huaxinfeng63 ~]# mysqldump -u root -p153456 --quick --no-create-info – extended-insert --default-character-set=latin1 book > bookdata.sql
    參數說明:

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

–no-create-info:不要創建 create table 語句。

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

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

  1. 打開 bookdata.sql 將 SET NAME latin1 修改成 SET NAME utf8
    [root@huaxinfeng63 ~]# vim bookdata.sql
    改:10 /*!40101 SET NAMES latin1 /;
    爲:10 /
    !40101 SET NAMES utf8 */;

  2. 重新建庫

[root@huaxinfeng63 ~]# mysql -u root -p123
mysql> drop database book;
mysql> create database book default charset utf8;
mysql> exit
  1. 建立表,導入我們之前導出的表的數據庫
[root@huaxinfeng63 ~]# mysql -u root -p123 book <booktable.sql
  1. 導入數據
[root@huaxinfeng63 ~]# mysql -u root -p123 book<bookdata.sql

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

如果對你有幫助給我點個贊吧謝謝了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章