1. 程式人生 > >解決Incorrect string value: ‘\xF0\x9F\x8C\xB8’ for column ‘nickName’ at row 1,mysql儲存微信暱稱nickName的表情出錯

解決Incorrect string value: ‘\xF0\x9F\x8C\xB8’ for column ‘nickName’ at row 1,mysql儲存微信暱稱nickName的表情出錯

原因:
由於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',				#特別注意這裡
    }
}