mysql h 字符集 了解MySQL的字符集

2021-10-18 20:39:15 字數 4653 閱讀 4520

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

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)

字符集了解

計算機中儲存資訊的最小單元是乙個byte,即8個bite,能表示的範圍只有0 255,所以是無法完全表示人類世界的符號的,同樣也無法理解人類的各種符號,所以需要一種翻譯的東東即為字元編碼集,幾中字元編碼集如下 ascii碼 一共有128個,用乙個位元組的低七位表示,0 31是控制字元如換行 回車 刪...

mysq 字符集問題

錯誤 illegal mix of collations gbk chinese ci,implicit and gbk bin,implicit for operation sql state hy000,error code 1267 原因 資料庫的編碼與建表時的編碼不一樣 處理 如果安裝mys...

mysql字符集修改儲存 如何修改MySQL字符集

如何修改mysql字符集 一 檢視mysql的字符集 二 修改mysql配置檔案 不是安裝目錄,是資料目錄。我是用sublime開啟的。進去之後,在三個地方增加配置。第乙個 client default character set utf8 第二個 mysql default character s...