[HY000][1366] Incorrect string value: '\xE5\xB0\x8F\xE9\xB8\xA3' for column 'name' at row 1


問題

最近使用docker部署了mysql5.7,然后新建庫表后, 插入數據后提示字符集錯誤

create database test;
use test;

create table test_user
(
    id   int auto_increment,
    name varchar(50) null,
    constraint test_user_pk primary key (id)
);

insert into test.test_user (name)
values ('小鳴');

處理過程

  • 首先查看 MySQL 系統變量關於字符編碼的值 show variables like '%char%';
Veriable_name Value
character_set_database latin1
character_set_server latin1
  • 查看數據庫建表 sql, 可以看到模式字符類型為 latin1;
show create database test_user;

# output
CREATE TABLE `test_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) CHARACTER SET latin1 DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1
  • 修改字符集
# 修改數據庫字符編碼
alter database test char set utf8;

然后重新 insert 中文數據, 依舊提示1366錯誤, 然后查看建表 SQL, 可見默認使用的還是 latin1 字符編碼

show create table test_user;
# output
CREATE TABLE `test_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) CHARACTER SET latin1 DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1
# 修改表的字符集
alter table test_user default character set utf8;

# 修改表字段字符集
alter table test_user change name name varchar(250) character set utf8;

或 直接修改表及表字段字符集
alter table test_user convert to character set utf8;
  • insert 中文數據成功

  • 插曲: 在我修改數據庫默認編碼后新建表user_login_log, 然后插入中文數據, 可正常insert , 查看其建表語句, 可見默認為utf8, 即由於數據庫默認被設置成了utf8, 建表也默認為utf8;

create table user_login_log(
    id int auto_increment,
    user_id int null ,
    detail varchar(250) null ,
    login_time datetime default now() null ,
    constraint user_login_log_pk primary key(id)
) ;

show create table user_login_log;
# output
CREATE TABLE `user_login_log` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `detail` varchar(250) DEFAULT NULL,
  `login_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

修改服務器字符集及服務器排序規則

  • 修改之前查看: show variables like '%server%'
Veriable_name Value
character_set_server latin1
collation_server latin1_swedish_ci
  • 最后, 我們可以看到 character_set_server的字符默認也是latin1 , 我們就不通過set方式修改, 需要直接去修改 my.ini 配置文件;

我這里 mysql 5.7 / Ubuntu 部署在 docker 中:

# 查看運行容器
root@VM-155-245-ubuntu:~# docker ps

# 進入容器
root@VM-155-245-ubuntu:~# docker exec -it 85a bash

# 修改配置文件 (這里需要先安裝vim : apt install vim)
# 末尾添加服務器字符集及服務器排序規則
root@85aexxx:/# vim /etc/mysql/mysql.conf.d/mysqld.cnf 
...
character_set_server=utf8
collation_server=utf8_general_ci
...

# 重啟服務
root@85aexxx:/# service mysql restart
[info] Stopping MySQL Community Server 5.7.29.
....root@VM-155-245-ubuntu:~# 

這里遇到一個小插曲: 修改配置文件后結果無法啟動了, 容器直接關機了, 再次開機也沒用, 查看日志 :

root@VM-155-245-ubuntu:~# docker logs mysql57

....

2020-09-05 06:07:58+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
	command was: mysqld --verbose --help
	2020-09-05T06:07:58.303495Z 0 [ERROR] unknown variable 'conllation_server=utf8_general_ci'

原來這里conllation_server=utf8_general_ci輸錯了, 應該是 collation_server=utf8_general_ci

# 從容器中拷貝出配置文件
root@VM-155-245-ubuntu:~# docker cp mysql57:/etc/mysql/mysql.conf.d/mysqld.cnf .

# 修改后拷貝覆蓋容器中配置文件
root@VM-155-245-ubuntu:~# docker cp mysqld.cnf  mysql57:/etc/mysql/mysql.conf.d/mysqld.cnf
  • 啟動容器, 查看服務器字符集及服務器字符排序規則, 已修改成功

參考

MySQL服務器維護許多配置其操作的系統變量。每個系統變量都有一個默認值。可以在服務器啟動時使用命令行或選項文件中的選項設置系統變量。可以使用以下SET 語句在運行時動態更改其中的大多數內容,該 語句使您無需停止並重新啟動服務器即可修改服務器的操作。您還可以在表達式中使用系統變量值。

  • 這里說明使用 set 系統變量名=值 只能動態修改, 重啟會恢復默認;

默認數據庫使用的字符集。每當默認數據庫更改時,服務器都會設置此變量。如果沒有默認數據庫,則該變量的值與相同character_set_server。
全局 變量character_set_database和 collation_database系統變量在MySQL 5.7中已棄用,並將在以后的MySQL版本中刪除。
在MySQL 5.7中不建議 為會話character_set_database和 collation_database系統變量分配值, 並且分配會產生警告。會話變量在MySQL的未來版本中將變為只讀,並且賦值將產生錯誤。仍然可以訪問會話變量,以確定默認數據庫的數據庫字符集和排序規則。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM