前情提要
- 操作系統(tǒng):CentOS7
- 數(shù)據(jù)庫(kù):MySQL-5.7.19
- 連接終端:SecureCRT7
顯示數(shù)據(jù)庫(kù)信息
\s
查看數(shù)據(jù)庫(kù)編碼
show variables like "character%";
由上面圖片看到character_set_database
和character_set_server
的字符為latin1
蛤售。
新建一個(gè)數(shù)據(jù)庫(kù)
# 新建數(shù)據(jù)庫(kù)
create database demo;
# 查看數(shù)據(jù)庫(kù)編碼
show create database demo;
由圖片看出創(chuàng)建的數(shù)據(jù)庫(kù)的編碼就是latin1
隔盛。
設(shè)置數(shù)據(jù)庫(kù)編碼
現(xiàn)在我打算把剛才創(chuàng)建的demo
數(shù)據(jù)庫(kù)的字符編碼修改為utf8
跋选。設(shè)置如下:
# 使用demo數(shù)據(jù)庫(kù)
use demo;
set character_set_database = utf8;
set character_set_server = utf8;
由上圖可知我們已經(jīng)把數(shù)據(jù)庫(kù)的編碼設(shè)置為utf8了足画。
下面我們新開一個(gè)終端完慧,并在新的終端查看數(shù)據(jù)庫(kù)的編碼。
show variables like "character%";
我們會(huì)發(fā)現(xiàn),數(shù)據(jù)庫(kù)的編碼并沒有改變,還是
latin1
。出現(xiàn)這樣的原因是因?yàn)槲覀冊(cè)O(shè)置的編碼是session級(jí)別的阱持。也就是說夭拌,我們?cè)O(shè)置的編碼只在當(dāng)前會(huì)話起作用。關(guān)閉掉當(dāng)前會(huì)話,重新開啟鸽扁,設(shè)置就會(huì)失效蒜绽。
如何才能使得我們?cè)O(shè)置的編碼能試用于全局呢?而不是僅僅限于當(dāng)前會(huì)話桶现?
我們可以設(shè)置全局的編碼
設(shè)置全局?jǐn)?shù)據(jù)庫(kù)編碼
我們新開一個(gè)終端窗口躲雅,這樣我們的編碼又變回
latin1
了
我們給這個(gè)終端窗口命名為:terminal_mysql_one
然后我們?cè)O(shè)置全局編碼
set global character_set_database = utf8;
set global character_set_server = utf8;
show variables like "character%";
從上圖我們看出,我們?cè)O(shè)置了全局的變量骡和,但是看上去并沒有起作用相赁。
我們新開一個(gè)終端窗口,命名為terminal_mysql_two
慰于。查看一下數(shù)據(jù)庫(kù)的編碼钮科。發(fā)現(xiàn)編碼已經(jīng)變成utf8
了。
為什么會(huì)這樣婆赠?
其實(shí)還是session绵脯,當(dāng)前會(huì)話的鍋。
當(dāng)前會(huì)話的編碼已經(jīng)形成了休里,已經(jīng)緩存下來了蛆挫。設(shè)置全局的時(shí)候并不會(huì)影響到當(dāng)前的會(huì)話的編碼。
修改表的編碼
上面我們已經(jīng)將全局的數(shù)據(jù)庫(kù)的編碼設(shè)置為utf8了妙黍。所以不管新開多少個(gè)終端窗口悴侵,編碼還都會(huì)是utf8的。但是我們當(dāng)前的terminal_mysql_one
的編碼是變的废境。我們新增一個(gè)數(shù)據(jù)庫(kù)表看下畜挨。
# 使用demo數(shù)據(jù)庫(kù)
use demo;
# 創(chuàng)建表t_demo
create table t_demo(id varchar(20),name varchar(20));
# 查看表t_demo的編碼
show create table t_demo;
# 查看表結(jié)構(gòu)
desc t_demo;
我們可以看出表的編碼是latin1
。
- 我們?cè)噲D向表中插入一條帶中文的數(shù)據(jù)
insert into t_demo(id, name) values("1", "測(cè)試");
從執(zhí)行的結(jié)果來看是報(bào)錯(cuò)了噩凹,原因是編碼的問題巴元。那我們是不是把當(dāng)前會(huì)話的編碼設(shè)置為utf8
就可以了?
- 設(shè)置當(dāng)前會(huì)話(session)的編碼為
utf8
set character_set_database = utf8;
set character_set_server = utf8;
# 查看字符集
show variables like "character%";
# 查看表編碼
show create table t_demo;
設(shè)置完之后驮宴,我們可以發(fā)現(xiàn)還是會(huì)出現(xiàn)這樣的問題逮刨。
表在創(chuàng)建的時(shí)候編碼已經(jīng)生效了,所以即使改變了當(dāng)前會(huì)話的編碼堵泽,對(duì)表也是沒有影響的修己。
既然這樣,我們把表的字符編碼修改為utf8
- 設(shè)置表的編碼為
utf8
alter table t_demo character set utf8;
show create table t_demo;
insert into t_demo(id, name) values("1", "測(cè)試");
我們發(fā)現(xiàn)即使修改了表的字符編碼迎罗,還是不能正確的插入睬愤。
仔細(xì)觀察發(fā)現(xiàn),我們的字段還是latin1字符集纹安。
- 修改表字段的字符集
alter table t_demo convert to character set utf8 collate utf8_general_ci;
show create table t_demo;
insert into t_demo(id, name) values("1", "測(cè)試");
終于尤辱,我們插入了數(shù)據(jù)砂豌。
通過配置文件修改字符編碼
前面我講了很多,也設(shè)置了很多光督。跳來跳去的阳距。最終我們得到了我們想要的。
這個(gè)時(shí)候结借,如果我重啟了數(shù)據(jù)庫(kù)會(huì)發(fā)生什么筐摘?
- 數(shù)據(jù)庫(kù)的編碼又變回了原來的樣子
- 已經(jīng)修改了字符集的表和字段的字符集沒有改變
好吧,如果我們重啟數(shù)據(jù)庫(kù)船老,我們之前做的大部分都是白費(fèi)的咖熟。
所以要想是的編碼永久生效,我們需要修改mysql的配置文件努隙。
- 配置文件地址
linux:/etc/my.cnf
將下面的代碼寫入配置文件
[mysqld]
character-set-server = utf8
[client]
default-character-set = utf8
[mysql]
default-character-set = utf8
需要注意的是:my.cnf里面已經(jīng)有
[mysqld]
了球恤,所以我們只需要把對(duì)應(yīng)的設(shè)置放到下面就行了。至于剩下的[client]
和[mysql]
放到my.cnf的最后荸镊。不然重啟會(huì)有問題咽斧。
好了,設(shè)置完重啟就好了躬存。我們發(fā)現(xiàn)編碼變成utf8了张惹。
總結(jié)
修改編碼有session級(jí)、global級(jí)岭洲。
session級(jí)的修改只影響到當(dāng)前會(huì)話的編碼宛逗,已經(jīng)生成的庫(kù)和表的編碼不會(huì)改變。
global級(jí)的修改會(huì)影響到全局盾剩,但是當(dāng)前會(huì)話的編碼不會(huì)被改變
不管是session還是global級(jí)的修改雷激,只要重啟數(shù)據(jù)庫(kù),這一切就都會(huì)還原告私。
使用到的命令
# 查看數(shù)據(jù)庫(kù)信息
\s
# 查看數(shù)據(jù)庫(kù)編碼
show variables like "character%";
# 設(shè)置當(dāng)前session的database編碼
set character_set_database = utf8;
# 設(shè)置當(dāng)前session的server編碼
set character_set_server = utf8;
# 設(shè)置global的database編碼
set global character_set_database = utf8;
# 設(shè)置global的server的編碼
set global character_set_server = utf8;
# 新建數(shù)據(jù)庫(kù)
create database demo;
# 查看數(shù)據(jù)庫(kù)編碼
show create database demo;
# 設(shè)置表的編碼
alter table t_demo character set utf8;
# 設(shè)置表中字段的編碼
alter table t_demo convert to character set utf8 collate utf8_general_ci;