1. 程式人生 > 資料庫 >MySQL 字符集,亂碼等問題解決

MySQL 字符集,亂碼等問題解決

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 ‘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

注意:選擇目標字符集時,要注意最好大於等於原字符集(字型檔更大),否則可能會丟失不被支援 的資料。

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