使用 SQLAlchemy 和 pymysql,如何设置连接以使用 utf8mb4?

Posted

技术标签:

【中文标题】使用 SQLAlchemy 和 pymysql,如何设置连接以使用 utf8mb4?【英文标题】:Using SQLAlchemy and pymysql, how can I set the connection to utilize utf8mb4? 【发布时间】:2015-09-26 11:07:29 【问题描述】:

我发现(很难)mysql's UTF8 character set 只有 3 个字节。一些研究表明,我可以通过更改表以利用 utf8mb4 排序规则并获得完整的 4 字节 UTF 来解决此问题。

我已经这样做了。我的数据库、表和列都被ALTERed 使用这个字符集。但是,如果我的数据的 unicode 代码点大于 U+FFFF,我仍然会收到此消息:

Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='"

我发现我有以下设置:

> show variables like '%collation%';

collation_connection  utf8_general_ci
collation_database    utf8mb4_general_ci
collation_server      utf8mb4_general_ci

collation_server 是通过更改 my.cnf 来设置的。我的问题是如何更改连接?我目前使用 SQL Alchemy 和 pymysql 连接到数据库,如下所示:

connect_string = 'mysql+pymysql://:@:/?charset=utf8'.format(DB_USER, DB_PASS, DB_HOST, DB_PORT, DATABASE)
engine = create_engine(connect_string, convert_unicode=True, echo=False)
session = sessionmaker()
session.configure(bind=engine)

当通过 SQL Alchemy 连接时,我该如何从 utf8_general_ci 更改为 utf8mb4_general_ci

【问题讨论】:

有趣。我正在寻找如何在 sqlalchemy 中定义列。你是怎么做到的? 【参考方案1】:

connect_string 改为使用charset=utf8mb4

connect_string = 'mysql+pymysql://:@:/?charset=utf8mb4'.format(DB_USER, DB_PASS, DB_HOST, DB_PORT, DATABASE)

【讨论】:

是否可以稍后将DATABASE 传递给engine

以上是关于使用 SQLAlchemy 和 pymysql,如何设置连接以使用 utf8mb4?的主要内容,如果未能解决你的问题,请参考以下文章

python学习之pymysql和sqlalchemy

使用 SQLAlchemy 和 pymysql,如何设置连接以使用 utf8mb4?

sqlalchemy和pymysql连接mysql的方法

sqlalchemy 使用pymysql连接mysql 1366错误

sqlalchemy 使用pymysql连接mysql 1366错误

SQLAlchemy 和 PyMySQL 在连接到 AWS RDS 后拒绝连接到“localhost”