mysql字符集詳解 MySQL字符集詳解

2021-10-17 16:30:05 字數 4653 閱讀 5857

在資料庫中,字元亂碼屬於常見、多發問題。鑑於本人水平頂多只能歸於不入流之類,寫這篇文章時內心誠惶誠恐,實在擔心誤導大家。內容僅供參考,若有錯誤,請各位及時指出,我也好學習提高!

mysql的字符集有4種級別的設定,分別是:伺服器級、資料庫級、表級、字段級。

一、伺服器級字符集

(1)、可以在my.cnf中設定

[mysqld]

default-character-set=gbk (5.1)

character-set-server=gbk (5.5)

(2)、可以在啟動選項中設定

mysqld --default-character-set=gbk

(3)、可以在編譯的時候設定

./configure --with-charset=gbk

或cmake . -default-charset=gbk

如果沒有指定伺服器的字符集,預設使用latin1為伺服器的字符集。

(4)、檢視當前伺服器的字符集

mysql> show variables like '%char%';

| variable_name | value |

| character_set_client | latin1 |

| character_set_connection | latin1 |

| character_set_database | latin1 |

| character_set_filesystem | binary |

| character_set_results | latin1 |

| character_set_server | latin1 |

| character_set_system | utf8 |

| character_sets_dir | /usr/local/mysql-5.6.28/share/charsets/ |

二、資料庫字符集

資料庫的字符集在建立資料庫的時候指定,也可以在建立完資料庫之後通過alter database語句修改。如果資料庫中已經存在資料,修改資料庫字符集並不能將已有的資料按新字符集存放。所以無法通過修改資料庫字符集修改資料的內容。

設定資料庫字符集的規則:

(1)、如果指定了字符集和校對規則,則使用指定的規則;

(2)、如果僅指定字符集而沒有指定校對規則,則使用指定的字符集和預設的校對規則;

(3)、如果沒有指定字符集和校對規則,則使用伺服器的字符集和校對規;

三、表字符集

表的字符集是在建表的時候指定的,可以通過alter table語句進行修改。同樣,對於表中已經存在的資料,修改字符集不會影響原有的記錄,仍將使用原有的字符集。

設定表的字符集的規則同設定資料庫的字符集規則。

四、列字符集

列的字符集和校對規則可以在建表的時候指定,也可以在修改表的時候調整。(這個不常用,僅記錄一下)

五、set names命令

除了上述的四種字符集外,對實際的應用訪問來說,還存在客戶端和服務端之間互動的字符集,如下:

(1)、character_set_client:客戶端字符集

(2)、character_set_connection:連線字符集

(3)、character_set_resluts:結果字符集

通常情況下,這3個字符集都應該是相同的,才能保證使用者寫入的資料被正確的讀出,特別是對於中文字元。

set names命令則用於同時修改這3個引數的值。

六、關於中文字符集插入的實驗

字符集不一致是導致資料庫內中文內容亂碼的罪魁禍首。

實驗環境:

server version: 5.6.28 (在此說明實驗環境是由於在學習過程中,從網上參考了部分資料,實驗過程與資料描述稍有出入,未查出原因,只能暫歸結為版本不同所致。)

實驗物件:

mysql> show create table char_test\g

*************************** 1. row ***************************

table: char_test

create table: create table `char_test` (

`id` smallint(6) not null auto_increment,

`name` char(20) not null,

primary key (`id`)

) engine=innodb auto_increment=3 default charset=latin1

1 row in set (0.00 sec)

由上可知,char_test表的字符集是latin1,如果不設定正確的字符集,插入中文字元時,必然會出現如下錯誤:

mysql> insert into char_test (name) values ('小王');

error 1366 (hy000): incorrect string value: '\xe5\xb0\x8f\xe7\x8e\x8b' for column 'name' at row 1

解決方案

(1)、先set names latin1,然後再插入資料。

mysql> set names latin1;

query ok, 0 rows affected (0.00 sec)

mysql> insert into char_test (name) values ('小王');

query ok, 1 row affected (0.01 sec)

mysql> select * from char_test;

| id | name |

| 1 | tom |

| 2 | 小明 |

| 3 | 小王 |

3 rows in set (0.00 sec)

(2)、在data.sql檔案中指定set names latin1,然後通過source命令匯入data.sql。

# vi data.sql

set names latin1;

insert into char_test (name) values ('小李');

mysql> source data.sql

query ok, 1 row affected (0.00 sec)

mysql> select * from char_test;

| id | name |

| 1 | tom |

| 2 | 小明 |

| 3 | 小王 |

| 4 | 小李 |

4 rows in set (0.00 sec)

(3)、在data.sql檔案中指定set names latin1,然後通過mysql命令匯入

# vi data.sql

set names latin1;

insert into char_test (name) values ('小張');

# mysql -uroot -p test1 < data.sql

# mysql -uroot -p -e "set names latin1;select * from test1.char_test;"

(4)、通過指定mysql命令的字符集引數實現 --default-charset-set=字符集

# vi data.sql

insert into char_test (name) values ('小張');

# 錯誤方法

# mysql -uroot -p test1 < data.sql

enter password: ******

error 1366 (hy000) at line 1: incorrect string value: '\xe5\xb0\x8f\xe8\xb5\xb5' for column 'name' at row 1

# 正確方法

# mysql -uroot -p --default-character-set=latin1 test1 < data.sql

enter password: ******

# mysql -uroot -p -e "set names latin1;select * from test1.char_test;"

enter password: ******

| id | name |

| 1 | tom |

| 2 | 小明 |

| 3 | 小王 |

| 4 | 小李 |

| 5 | 小張 |

| 6 | 小趙 |

(5)、在配置檔案中指定客戶端的字符集

vi my.cnf

[client]

default-character-set=latin1

mysql> insert into char_test (name) values ('小馬');

query ok, 1 row affected (0.00 sec)

mysql> select * from char_test;

| id | name |

| 1 | tom |

| 2 | 小明 |

| 3 | 小王 |

| 4 | 小李 |

| 5 | 小張 |

| 6 | 小趙 |

| 7 | 小馬 |

7 rows in set (0.00 sec)

mysql 集群字符集 Mysql 字符集

字符集與字元比較 字符集字符集是某種字元的集合,比如最常見的ascii碼,由127個字元組成,只需要乙個位元組就能表示 我們常說的字符集還是gbk iso utf8 mysql 我們使用得最多的字符集就是gbk 和 utf8了 他們都是變長字符集,如果字元在ascii範圍內就使用乙個位元組表示,其他...

mysql字符集 MySQL字符集選擇

一 怎樣選擇合適的字符集 對mysql資料庫來說,字符集很重要,因為資料庫儲存的資料大部分都是各種文字,字符集對資料庫的儲存,處理效能都會有所影響。主要考慮一下幾方面的因素 1.滿足應用支援語言的需求,應用處理各種各樣的文字,發布到使用不同語言的國家或地區,可以選擇unicode字符集,mysql的...

mysql字符集修改 MySql字符集修改

問題分析 普通的字串或者表情都是佔位3個位元組,所以utf8足夠用了,但是移動端的表情符號佔位是4個位元組,普通的utf8就不夠用了,為了應對無線網際網路的機遇和挑戰 避免 emoji 表情符號帶來的問題 涉及無線相關的 mysql 資料庫建議都提前採用 utf8mb4 字符集,這必須要作為移動網際...