在資料庫中,字元亂碼屬於常見、多發問題。鑑於本人水平頂多只能歸於不入流之類,寫這篇文章時內心誠惶誠恐,實在擔心誤導大家。內容僅供參考,若有錯誤,請各位及時指出,我也好學習提高!
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 字符集,這必須要作為移動網際...