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 指下面任何一項:
- 空格間隔的一系列字符集名。
- complex -,以包括不能動態裝載的所有字符集。
- 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. 臨時更改:
SET GLOBAL character_set_server=utf8;
1.2. 永久更改:修改my.cnf文件
[mysqld]
character-set-server=utf8
-
修改數據庫級
2.1. 臨時更改:
SET GLOBAL character_set_database=utf8;
2.2 永久更改:
同1.2操作,改了服務器級別的此項跟隨修改。 -
修改表級,更改後永久生效
ALTER TABLE table_name DEFAULT CHARSET utf8;
-
修改列級,更改後永久生效;例:
alter table `table_test_01`
change `field_test_01` varchar( 20 )
character set utf8
collate utf8_general_ci
default null;
-
更改連接字符集
5.1. 臨時更改:
set names utf8;
5.2. 永久更改,修改my.cnf文件:
[client]
default-character-set=utf8
-
執行SQL語句時信息的路徑是這樣的
信息輸入路徑:client→connection→server;
信息輸出路徑:server→connection→results.
[client]
default-character-set=utf8
[mysql]
[mysqld]
character-set-server=utf8