Python 用 MySQL 存储 emoji

这篇博客讲述了在使用 SQLAlchemy 与 MySQL 存储含有 emoji 的数据时遇到的问题及解决方法,包括尝试使用不同的 collation,二进制存储,以及 escape 方法。最终通过调整数据库的 charset, collation 和更新 MySQL Connector/Python 版本解决了问题。" 87858484,8200315,Flash 抽奖程序设计与实现,"['Flash开发', '游戏开发', '前端开发', '编程实践']

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

最近需要使用 SQLAlchemy 存弹幕的内容,但是遇到了存 emoji 的问题。

utf8_bin?

一开始就套用存储中文姓名的那一套,使用utf8_bin的 collation,觉得 utf8 这种万能的东西直接用就行了。可谁知给我报错:

mysql.connector.errors.DatabaseError: 1366 (HY000): Incorrect string value: '\xE8\x86\x9C' for column 'text' at row 1

蛤?竟有如此操作?

utf8mb4_unicode_ci

<think>好的,用户让我介绍PythonMySQL,或者他们之间的关系。我需要先确认用户的具体需求是什么。他们可能刚开始学习Python,想了解如何用Python操作数据库,或者他们想了解MySQLPython中的应用。 首先,我应该解释PythonMySQL各自是什么,以及它们各自的用途。Python是一种流行的编程语言,而MySQL是关系型数据库管理系统。接着,说明它们如何结合使用,比如通过库如PyMySQLmysql-connector-python。 然后,用户可能需要一个简单的示例代码,展示如何连接数据库、执行查询和操作数据。需要确保代码示例清晰,并且提到必要的步骤,比如安装库、处理异常等。 另外,用户可能对ORM工具感兴趣,比如SQLAlchemy或Django ORM,这些可以简化数据库操作。应该提到这些高级用法,但可能不需要深入细节,除非用户进一步询问。 还要注意可能的常见问题,比如字符集设置、防止SQL注入,使用上下文管理器(如with语句)来管理连接。这些是实际开发中需要注意的地方,对新手很有帮助。 最后,总结一下PythonMySQL结合的优势,比如开发效率高、资源丰富等,并邀请用户提出更具体的问题,以便进一步帮助。</think>PythonMySQL 是两个常用于开发的技术组合,通常结合使用来实现数据存储、管理和操作。以下是它们的简要介绍及结合使用的关键点: --- ### **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) - 数据爬虫存储 - 数据分析与报表生成 如果需要更具体的操作示例(如事务处理、连接池配置等),可以进一步说明需求!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值