如何使用 to_sql 对表创建强制执行 utf8mb4?

Posted

技术标签:

【中文标题】如何使用 to_sql 对表创建强制执行 utf8mb4?【英文标题】:How to enforce utf8mb4 on table creation with to_sql? 【发布时间】:2019-10-14 22:50:31 【问题描述】:

我正在从 Python 中的 API 导入一些数据,对其进行格式化并使用 to_sql 将其保存到 mysql 数据库中。

results, types, valid = self.process_data(data, [])
        if valid:
            results.to_sql(
                con=self.db.connection,
                name="degreed_" + method,
                if_exists="replace", 
                index=False,
                dtype=types,
            )

在我的连接中,我已将 utf8mb4 指定为字符集:

self.connection = create_engine(
            'mysql+mysqlconnector://0:1@2/3?charset=utf8mb4'.
            format(database_username, database_password, database_ip, database_name))

在我的类型中,我的文本列如下:

NVARCHAR(length=500, collation='utf8mb4_bin').

但是,我仍然收到错误消息:

COLLATION 'utf8mb4_bin' is not valid for CHARACTER SET 'utf8' 

在 MySQL 中,我的 character_set_client 是 utf8mb4,默认表字符集是 utf8mb4。为什么字符集是utf8?

抱歉,如果我在这里做任何愚蠢的事情,我对 sqlalchemy 和 mysql 还是很陌生。

【问题讨论】:

【参考方案1】:

原来问题是我使用的是 NVARCHAR 而不是 VARCHAR,所以结果被转换为 UTF8。

【讨论】:

UTF-8 的 MySQL 名称是 utf8mb4

以上是关于如何使用 to_sql 对表创建强制执行 utf8mb4?的主要内容,如果未能解决你的问题,请参考以下文章

Python:使用 dataframe.to_sql 向 MySQL 添加主键

使用 python 对 postgres 执行 upsert 操作,如 pandas to_sql 函数

使用 Doctrine 2 强制编码和解码

使用触发器强制约束

在 pandas.to_sql() 中使用“可调用”方法的示例?

Pandas to_sql 创建表但不插入数据