解決Incorrect string value: ‘\xF0\x9F\x8C\xB8’ for column ‘nickName’ at row 1,mysql儲存微信暱稱nickName的表情出錯
阿新 • • 發佈:2018-12-01
原因:
由於mysql預設編碼為utf-8,最大隻佔3個位元組,一些表情或者非常見字元,比如該例子中“xF0\x9F\x8C\xB8”佔4個位元組,這樣往資料表裡插入4個位元組的資料就會出錯。
解決辦法:
將相應資料庫和資料表的編碼由utf8修改為utf8mb4。具體兩者區別可以執行百度。
1.cd到 /etc/mysql/mysql.conf.d目錄,修改目錄下的mysqld.cnf檔案,新增如下內容:
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4'
2.重啟MySQL使生效:
service mysql restart
這時我們在mysql命令列模式下使用命令【\s】就可以看到剛才設定的結果:
mysql> \s -------------- mysql Ver 14.14 Distrib 5.7.22, for Linux (x86_64) using EditLine wrapper Connection id: 7 Current database: Current user: [email protected] SSL: Not in use Current pager: less Using outfile: '' Using delimiter: ; Server version: 5.7.22-0ubuntu0.16.04.1 (Ubuntu) Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: utf8mb4 Db characterset: utf8mb4 Client characterset: utf8mb4 Conn. characterset: utf8mb4 UNIX socket: /var/run/mysqld/mysqld.sock Uptime: 2 hours 43 min 38 sec Threads: 2 Questions: 114 Slow queries: 0 Opens: 193 Flush tables: 1 Open tables: 76 Queries per second avg: 0.011
3.修改資料庫和資料表對應欄位的編碼格式(name自行替換):
(1)修改資料庫編碼方式
ALTER DATABASE name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
修改完可以使用如下命令檢視修改結果:
show variables like 'character_set_database';
(2)修改資料表編碼方式
ALTER TABLE name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 修改完可以使用如下命令檢視修改資料表的結果: show create table name
(3)修改資料表裡欄位的編碼方式
事實上只要做到前兩步就可以了
ALTER TABLE name CHANGE 'name' VARCHAR(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
4.如果是使用Django等框架做資料庫連線,注意還要在連線的配置檔案中指定好編碼格式,django的配置如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', #資料庫引擎
'NAME': '',# 資料庫名,先前建立的
'USER': '',#使用者名稱
'PASSWORD':'',
'HOST':'127.0.0.1',
'PORT':'3306',
'CHARSET':'utf8mb4', #特別注意這裡
}
}