django、sqlalchemy、mysql字符集charset的設置

一、背景

使用django+python+mysql開發微信公衆號的後臺服務器,在將用戶的暱稱存入數據庫時,報錯.

  • 因爲emoji表情的存在所導致!只有utf8mb4_unicode_ci的字符集才支持!
  • 重點:mysqlutf8並不是真正的’utf-8’,mysql在後續用的utf8mb4纔是真正的’utf-8’

二、字符集介紹分析

字符集的簡單對比

  • utf8_general_ci 不區分大小寫,這個你在註冊用戶名和郵箱的時候就要使用。

  • utf8_general_cs 區分大小寫,如果用戶名和郵箱用這個就會照成不良後果。

  • utf8_bin: compare strings by the binary value of each character in the string 將字符串每個字符串用二進制數據編譯存儲,區分大小寫,而且可以存二進制的內容。

  • utf8_unicode_ci校對規則僅部分支持Unicode校對規則算法,一些字符還是不能支持

utf8_unicode_ci比較準確,utf8_general_ci速度比較快。通常情況下 utf8_general_ci的準確性就夠我們用的了,在我看過很多程序源碼後,發現它們大多數也用的是utf8_general_ci,所以新建數據 庫時一般選用utf8_general_ci就可以了


三、解決辦法(設置字符集爲utf8mb4)

之前將數據庫的編碼設置成utf8,當存入字母或中文字符時,都是3個字節.
而當用戶的暱稱存在emoji表情時,該表情對應的編碼是4個字節,也就是utf8mb4格式.

1. 進入mysql,執行命令,直接在數據庫層操作

-- 1.查看到數據庫的字符集設置
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

-- 查看錶格所有字段字符集的格式
SHOW FULL COLUMNS FROM account_wechat_account

-- 修改表的字符集格式
ALTER TABLE account_wechat_account DEFAULT CHARACTER SET utf8 COLLATE utf8mb4_unicode_ci

-- 2,修改數據庫,表,列的字符集.

-- 修改Database字符集
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 修改Table字符集
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 修改column字符集
ALTER TABLE table_name CHANGE column_name column_name longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;

ALTER TABLE `payment_share_code_record`
CHANGE `nickname` `nickname` varchar(40) COLLATE 'utf8mb4_unicode_ci' NULL AFTER `actual_name`;

上面的命令我沒有打錯,CHANGE後面跟兩遍表名。

請不要單純的複製粘貼,你可能需要修改數據庫名,表名,列名和not null.

2. 修改django連接數據庫時的字符集(setting.py文件)

在django項目的setting文件中,你必須設置charset=utf8mb4,
數據庫的配置模板如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'example',
        'USER': 'example',
        'PASSWORD': 'example',
        'HOST': '',
        'PORT': '',
        'OPTIONS': {'charset': 'utf8mb4'},
    }
}

3.flask/sqlalchemy設置字符集的格式:

connect_engine = create_engine('mysql://user:[email protected]/db?charset=utf8mb4')    # utf8mb4支持更全的字符格式

4.最後一步,不是必須的.但是強烈建議進行設置(mysql配置文件).

/etc/mysql/my.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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章