前情提要
- 操作系統:CentOS7
- 數據庫:MySQL-5.7.19
- 連接終端:SecureCRT7
顯示數據庫信息
\s
查看數據庫編碼
show variables like "character%";
由上面圖片看到character_set_database
和character_set_server
的字符為latin1
。
新建一個數據庫
# 新建數據庫
create database demo;
# 查看數據庫編碼
show create database demo;
由圖片看出創建的數據庫的編碼就是latin1
。
設置數據庫編碼
現在我打算把剛才創建的demo
數據庫的字符編碼修改為utf8
。設置如下:
# 使用demo數據庫
use demo;
set character_set_database = utf8;
set character_set_server = utf8;
由上圖可知我們已經把數據庫的編碼設置為utf8了。
下面我們新開一個終端,并在新的終端查看數據庫的編碼。
show variables like "character%";
我們會發現,數據庫的編碼并沒有改變,還是
latin1
。出現這樣的原因是因為我們設置的編碼是session級別的。也就是說,我們設置的編碼只在當前會話起作用。關閉掉當前會話,重新開啟,設置就會失效。
如何才能使得我們設置的編碼能試用于全局呢?而不是僅僅限于當前會話?
我們可以設置全局的編碼
設置全局數據庫編碼
我們新開一個終端窗口,這樣我們的編碼又變回
latin1
了
我們給這個終端窗口命名為:terminal_mysql_one
然后我們設置全局編碼
set global character_set_database = utf8;
set global character_set_server = utf8;
show variables like "character%";
從上圖我們看出,我們設置了全局的變量,但是看上去并沒有起作用。
我們新開一個終端窗口,命名為terminal_mysql_two
。查看一下數據庫的編碼。發現編碼已經變成utf8
了。
為什么會這樣?
其實還是session,當前會話的鍋。
當前會話的編碼已經形成了,已經緩存下來了。設置全局的時候并不會影響到當前的會話的編碼。
修改表的編碼
上面我們已經將全局的數據庫的編碼設置為utf8了。所以不管新開多少個終端窗口,編碼還都會是utf8的。但是我們當前的terminal_mysql_one
的編碼是變的。我們新增一個數據庫表看下。
# 使用demo數據庫
use demo;
# 創建表t_demo
create table t_demo(id varchar(20),name varchar(20));
# 查看表t_demo的編碼
show create table t_demo;
# 查看表結構
desc t_demo;
我們可以看出表的編碼是latin1
。
- 我們試圖向表中插入一條帶中文的數據
insert into t_demo(id, name) values("1", "測試");
從執行的結果來看是報錯了,原因是編碼的問題。那我們是不是把當前會話的編碼設置為utf8
就可以了?
- 設置當前會話(session)的編碼為
utf8
set character_set_database = utf8;
set character_set_server = utf8;
# 查看字符集
show variables like "character%";
# 查看表編碼
show create table t_demo;
設置完之后,我們可以發現還是會出現這樣的問題。
表在創建的時候編碼已經生效了,所以即使改變了當前會話的編碼,對表也是沒有影響的。
既然這樣,我們把表的字符編碼修改為utf8
- 設置表的編碼為
utf8
alter table t_demo character set utf8;
show create table t_demo;
insert into t_demo(id, name) values("1", "測試");
我們發現即使修改了表的字符編碼,還是不能正確的插入。
仔細觀察發現,我們的字段還是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", "測試");
終于,我們插入了數據。
通過配置文件修改字符編碼
前面我講了很多,也設置了很多。跳來跳去的。最終我們得到了我們想要的。
這個時候,如果我重啟了數據庫會發生什么?
- 數據庫的編碼又變回了原來的樣子
- 已經修改了字符集的表和字段的字符集沒有改變
好吧,如果我們重啟數據庫,我們之前做的大部分都是白費的。
所以要想是的編碼永久生效,我們需要修改mysql的配置文件。
- 配置文件地址
linux:/etc/my.cnf
將下面的代碼寫入配置文件
[mysqld]
character-set-server = utf8
[client]
default-character-set = utf8
[mysql]
default-character-set = utf8
需要注意的是:my.cnf里面已經有
[mysqld]
了,所以我們只需要把對應的設置放到下面就行了。至于剩下的[client]
和[mysql]
放到my.cnf的最后。不然重啟會有問題。
好了,設置完重啟就好了。我們發現編碼變成utf8了。
總結
修改編碼有session級、global級。
session級的修改只影響到當前會話的編碼,已經生成的庫和表的編碼不會改變。
global級的修改會影響到全局,但是當前會話的編碼不會被改變
不管是session還是global級的修改,只要重啟數據庫,這一切就都會還原。
使用到的命令
# 查看數據庫信息
\s
# 查看數據庫編碼
show variables like "character%";
# 設置當前session的database編碼
set character_set_database = utf8;
# 設置當前session的server編碼
set character_set_server = utf8;
# 設置global的database編碼
set global character_set_database = utf8;
# 設置global的server的編碼
set global character_set_server = utf8;
# 新建數據庫
create database demo;
# 查看數據庫編碼
show create database demo;
# 設置表的編碼
alter table t_demo character set utf8;
# 設置表中字段的編碼
alter table t_demo convert to character set utf8 collate utf8_general_ci;