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

本文介绍了在django、sqlalchemy和mysql环境中遇到的字符集问题,特别是关于emoji表情的存储。通过分析字符集charset的区别,提出了将数据库字符集设置为utf8mb4的解决方案,包括在数据库层、django的setting.py文件以及mysql配置文件中的具体操作步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景

使用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:password@1.1.1.1/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
<think>好的,用户让我介绍Python和MySQL,或者他们之间的关系。我需要先确认用户的具体需求是什么。他们可能刚开始学习Python,想了解如何用Python操作数据库,或者他们想了解MySQL在Python中的应用。 首先,我应该解释Python和MySQL各自是什么,以及它们各自的用途。Python是一种流行的编程语言,而MySQL是关系型数据库管理系统。接着,说明它们如何结合使用,比如通过库如PyMySQLmysql-connector-python。 然后,用户可能需要一个简单的示例代码,展示如何连接数据库、执行查询和操作数据。需要确保代码示例清晰,并且提到必要的步骤,比如安装库、处理异常等。 另外,用户可能对ORM工具感兴趣,比如SQLAlchemyDjango ORM,这些可以简化数据库操作。应该提到这些高级用法,但可能不需要深入细节,除非用户进一步询问。 还要注意可能的常见问题,比如字符集设置、防止SQL注入,使用上下文管理器(如with语句)来管理连接。这些是实际开发中需要注意的地方,对新手很有帮助。 最后,总结一下Python与MySQL结合的优势,比如开发效率高、资源丰富等,并邀请用户提出更具体的问题,以便进一步帮助。</think>Python 与 MySQL 是两个常用于开发的技术组合,通常结合使用来实现数据存储、管理和操作。以下是它们的简要介绍及结合使用的关键点: --- ### **1. Python 简介** - **用途**:通用编程语言,以简洁语法和丰富生态著称,适合 Web 开发、数据分析、自动化等场景。 - **数据库支持**:通过第三方库(如 `PyMySQL`、`mysql-connector-python`)可直接操作 MySQL 数据库。 --- ### **2. MySQL 简介** - **用途**:开源关系型数据库管理系统(RDBMS),支持结构化数据存储,具备事务处理、索引优化等功能。 - **特点**:跨平台、支持 SQL 语法,常用于 Web 应用的后端数据存储。 --- ### **3. Python 操作 MySQL 的典型流程** #### **步骤 1:安装驱动库** ```bash # 常用库二选一 pip install pymysql # 或 pip install mysql-connector-python ``` #### **步骤 2:连接数据库** ```python import pymysql # 建立连接 connection = pymysql.connect( host='localhost', user='root', password='your_password', database='test_db', charset='utf8mb4' ) ``` #### **步骤 3:执行 SQL 操作** ```python try: with connection.cursor() as cursor: # 创建表 cursor.execute("CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT, name VARCHAR(255), PRIMARY KEY(id))") # 插入数据 cursor.execute("INSERT INTO users (name) VALUES (%s)", ('Alice',)) # 提交事务 connection.commit() # 查询数据 with connection.cursor() as cursor: cursor.execute("SELECT * FROM users") results = cursor.fetchall() print(results) # 输出:((1, 'Alice'),) finally: connection.close() ``` --- ### **4. 高级用法** - **ORM 框架**:使用 `SQLAlchemy` 或 `Django ORM` 将数据库表映射为 Python 类,避免直接写 SQL。 ```python from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() engine = create_engine('mysql+pymysql://user:password@localhost/test_db') class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(255)) # 自动创建表并插入数据 Base.metadata.create_all(engine) ``` - **异步支持**:通过 `aiomysql` 库实现异步 MySQL 操作(需 Python 3.7+)。 --- ### **5. 注意事项** - **防 SQL 注入**:始终使用参数化查询(如 `%s` 占位符),避免拼接 SQL 字符串。 - **连接管理**:使用 `with` 语句或确保手动关闭连接,防止资源泄漏。 - **字符集**:建议设置为 `utf8mb4` 以支持 Emoji 和特殊字符。 --- ### **6. 典型应用场景** - Web 后端(如 Django/Flask + MySQL) - 数据爬虫存储 - 数据分析与报表生成 如果需要更具体的操作示例(如事务处理、连接池配置等),可以进一步说明需求!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值