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