mysql字符集之中文亂碼配置

1. 查看mysq支持的字符集

show character set;

mysql> show character set;
+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese        | big5_chinese_ci     |      2 |
| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
| ascii    | US ASCII                        | ascii_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese       | gb2312_chinese_ci   |      2 |
| gbk      | GBK Simplified Chinese          | gbk_chinese_ci      |      2 |
| utf8     | UTF-8 Unicode                   | utf8_general_ci     |      3 |
| utf8mb4  | UTF-8 Unicode                   | utf8mb4_general_ci  |      4 |
| utf16    | UTF-16 Unicode                  | utf16_general_ci    |      4 |
| utf16le  | UTF-16LE Unicode                | utf16le_general_ci  |      4 |
| utf32    | UTF-32 Unicode                  | utf32_general_ci    |      4 |
| binary   | Binary pseudo charset           | binary              |      1 |
| gb18030  | China National Standard GB18030 | gb18030_chinese_ci  |      4 |
......
+----------+---------------------------------+---------------------+--------+
41 rows in set (0.00 sec)

2. 查看字符集的校對規則

show collation;

show collation like 'utf8%';

select * 
from information_schema.collations 
where collation_name like 'utf8%';

3. 查看當前數據庫的字符集

show variables like '%character%';

mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

參數解釋:

character_set_client:客戶端請求數據的字符集。
character_set_connection:從客戶端接收到數據,然後傳輸的字符集。
character_set_database: 默認數據庫的字符集,無論默認數據庫如何改變,都是這個字符集;如果沒有默認數據庫,那就使用 character_set_server指定的字符集,這個變量建議由系統自己管理,不要人爲定義。
character_set_server: 數據庫服務器的默認字符集。
character_set_filesystem: 把os上文件名轉化成此字符集,即把 character_set_client轉換character_set_filesystem,默認binary是不做任何轉換的。
character_set_results: 結果集的字符集。
character_set_system: 這個值總是utf8,不需要設置,是爲存儲系統元數據的字符集。

4. 查看當前數據庫的校對規則

show variables like '%collation%';

mysql> show variables like '%collation%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

參數解釋:

collation_connection:當前連接的字符集。
collation_database:當前日期的默認校對。每次用USE語句來“跳轉”到另一個數據庫的時候,這個變量的值就會改變。如果沒有當前數據庫,這個變量的值就是collation_server變量的值。
collation_server:服務器的默認校對。

排序方式的命名規則爲:字符集名字_語言_後綴,其中各個典型後綴的含義如下:

1)_ci:case insensitive 不區分大小寫的排序方式。
2)_cs:case sensitive 區分大小寫的排序方式。
3)_bin:二進制排序方式,大小比較將根據字符編碼,不涉及人類語言,因此_bin的排序方式不包含人類語言。

utf8_general_ci:不區分大小寫,這個你在註冊用戶名和郵箱的時候就要使用。
utf8_general_cs:區分大小寫,如果用戶名和郵箱用這個 就會照成不良後果
utf8_bin:字符串每個字符串用二進制數據編譯存儲。 區分大小寫,而且可以存二進制的內容


5. MySQL字符集的設置

5.1 創建對象的默認值

字符集合校對規則有4個級別的默認設置:
1)服務器級別;
2)數據庫級別;
3)表級別、列級別;
4)連接級別。

低級別的設置會集成高級別的設置。

通用的規則:先爲服務器或者數據庫選擇一個合理的字符集,然後根據不同的實際情況,讓某個列選擇自己的字符集。

5.2 控制server和client端交互通信的配置

客戶和服務器之間的字符集轉換工作由以下幾個MySQL系統變量控制:

1)character_set_server:mysql server默認字符集。
2)character_set_database:數據庫默認字符集。
3)character_set_client:MySQL server假定客戶端發送的查詢使用的字符集。
4)character_set_connection:MySQL Server接收客戶端發佈的查詢請求後,將其轉換爲character_set_connection變量指定的字符集。
5)character_set_results:mysql server把結果集和錯誤信息轉換爲character_set_results指定的字符集,併發送給客戶端。
6)character_set_system:系統元數據(字段名等)字符集

還有以collation_開頭的同上面對應的變量,用來描述字符序。

注意事項:
• my.cnf中的default_character_set設置隻影響mysql命令連接服務器時的連接字符集,不會對使用libmysqlclient庫的應用程序產生任何作用!

• 對字段進行的SQL函數操作通常都是以內部操作字符集進行的,不受連接字符集設置的影響。

• SQL語句中的裸字符串會受到連接字符集或introducer設置的影響,對於比較之類的操作可能產生完全不同的結果,需要小心!

5.3 默認情況下字符集選擇規則

(1)編譯MySQL 時,指定了一個默認的字符集,這個字符集是 latin1;

(2)安裝MySQL 時,可以在配置文件 (my.cnf) 中指定一個默認的的字符集,如果沒指定,這個值繼承自編譯時指定的;

(3)啓動mysqld 時,可以在命令行參數中指定一個默認的的字符集,如果沒指定,這個值繼承自配置文件中的配置,此時character_set_server被設定爲這個默認的字符集;

(4)當創建一個新的數據庫時,除非明確指定,這個數據庫的字符集被缺省設定爲character_set_server;

(5)當選定了一個數據庫時,character_set_database被設定爲這個數據庫默認的字符集;

(6)在這個數據庫裏創建一張表時,表默認的字符集被設定爲character_set_database,也就是這個數據庫默認的字符集;

(7)當在表內設置一欄時,除非明確指定,否則此欄缺省的字符集就是表默認的字符集;


6 實例操作

6.1 爲列指定字符集

6.2 爲表指定字符集

6.3 爲數據庫指定字符集

6.4 爲列指定校對規則

6.5 爲表指定校對規則

6.6 爲數據庫指定校對規則

6.7 字符直接量字符集

6.8 配置MySQL服務器級別字符集

6.8.1 編譯時指定

編譯時可指定默認字符集和默認校對規則,要想同時更改默認字符集和校對規則,要同時使用-- with-charset=CHARSET--with-collation=COLLATION選項。校對規則必須是字符集的合法校對規則。

./configure -- with-charset=CHARSET --with-collation=COLLATION

通過configure選項--with-extra-charsets=LIST,可以定義在服務器中再定義增加字符集。LIST 指下面任何一項:

  1. 空格間隔的一系列字符集名。
  2. complex -,以包括不能動態裝載的所有字符集。
  3. all -,以將所有字符集包括進二進制。
./configure -- with-charset=CHARSET --with-collation=COLLATION --with-extra-charsets=all
6.8.2 在配置文件my.cnf中指定

[mysqld]
character_set_server=utf8

--影響參數:character_set_server 和 character_set_database
--注意:修改後要重啓數據庫才能生效。

[client]
default-character-set=utf8

--影響參數:character_set_client, character_set_connection, character_set_results。
--注意:修改後無需重啓數據庫。
6.8.3 使用啓動參數--character-set-server=CHARSET指定
./mysqld --character-set-server=utf8 >/dev/null 2>&1 &
--影響參數:character_set_server 和 character_set_database
6.8.4 客戶端登錄時通過–default-character-set=CHARSET指定
mysql -uroot -pmysql --default-character-set=utf8
--影響參數:set character_set_client,set character_set_connection,set character_set_results。
6.8.5 臨時指定

a)分別指定

mysql> set character_set_client = utf8;
mysql> set character_set_connection = utf8;
mysql> set character_set_database = utf8;
mysql> set character_set_results = utf8;
mysql> set character_set_server = utf8;

b)mysql客戶端使用:

set names utf8;
 <<等同於>>
set character_set_client=utf8;
set character_set_connection=utf8;
set character_set_results=utf8;

c)

set character set utf8;
 <<等同於>>
set character_set_client=utf8;
set character_set_results=utf8;
set collation_connection=@@collation_database;
6.8.6 總結:介紹幾個MYSQL命令
6.8.6.1 查看數據庫支持的所有字符集
show character set;show char set;
6.8.6.2 查看當前狀態:包含當前的字符集設置
status
或
\s
6.8.6.3 查看系統字符集設置:包括所有的字符集設置
show variables like 'char%';
6.8.6.4 查看庫mydb002表my_table1的字符集設置
mysql> show table status from mydb002 like 'my_table1' \G
*************************** 1. row ***************************
           Name: my_table1
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 1
 Avg_row_length: 16384
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2020-06-28 00:15:40
    Update_time: 2020-06-28 00:15:55
     Check_time: NULL
      Collation: utf8mb4_unicode_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.00 sec)
6.8.6.5 查看錶列的字符集設置,同一個表中,每列可設置成不同的字符集
mysql> show full columns from my_table1;
+-------+--------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type         | Collation          | Null | Key | Default | Extra | Privileges                      | Comment |
+-------+--------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
| id    | int(11)      | NULL               | NO   |     | NULL    |       | select,insert,update,references |         |
| name  | varchar(100) | utf8mb4_unicode_ci | YES  |     | NULL    |       | select,insert,update,references |         |
+-------+--------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
2 rows in set (0.00 sec)
6.8.6.6 設置字符集
  1. 修改服務器級
    1.1. 臨時更改:
    SET GLOBAL character_set_server=utf8;
    1.2. 永久更改:修改my.cnf文件
    [mysqld]
    character-set-server=utf8

  2. 修改數據庫級
    2.1. 臨時更改:
    SET GLOBAL character_set_database=utf8;
    2.2 永久更改:
    同1.2操作,改了服務器級別的此項跟隨修改。

  3. 修改表級,更改後永久生效
    ALTER TABLE table_name DEFAULT CHARSET utf8;

  4. 修改列級,更改後永久生效;例:

alter table `table_test_01` 
change `field_test_01` varchar( 20 )
character set utf8 
collate utf8_general_ci 
default null;
  1. 更改連接字符集
    5.1. 臨時更改:
    set names utf8;
    5.2. 永久更改,修改my.cnf文件:
    [client]
    default-character-set=utf8

  2. 執行SQL語句時信息的路徑是這樣的
    信息輸入路徑:client→connection→server;
    信息輸出路徑:server→connection→results.


[client]
default-character-set=utf8

[mysql]

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