AWS RDS 上的 MySQL v9.0 + python 2.7 上的 PyMSQL 0.10.1

问题描述 投票:0回答:1

我有一个 python 2.7 应用程序 (Edgewall Trac),它连接到部署在 AWS RDS 上的 MySQL v5.7 数据库。多个 PHP 应用程序也可以访问同一个数据库。 AWS 最近通知我将停止对 MySQL v5.7 的支持,我应该切换到 MySQL v8.0。

我升级了数据库而没有丢失数据,但必须将character_set参数设置为utf8如此处所述

character_set_client     -> "utf8"
character_set_connection -> "utf8"
character_set_server     -> "utf8"

重启数据库后,PHP应用程序工作正常;但是 python 2.7 + PyMySQL 0.10.1 仍然无法连接。它抛出了相同的错误如这里讨论的所以看起来编码仍然不是 PyMySQL 所期望的。我尝试设置我能找到的所有字符编码和排序规则参数,如下所示:

character_set_database -> "utf8"
character_set_results  -> "utf8"
collation_connection   -> "utf8_unicode_ci"
collation_server       -> "utf8_unicode_ci"

但是,在更改+数据库重新启动之后,我仍然遇到相同的错误。

TimeoutError: Unable to get database connection within 0 seconds. (AttributeError: 'NoneType' object has no attribute 'encoding')

我可以尝试的任何其他建议,或者继续使用 MySQL v5.7 几乎是唯一的选择?

mysql amazon-rds pymysql utf
1个回答
0
投票

我找到了解决方案。数据库模式最初是使用 utf8/utf8-bin 作为字符集和排序规则创建的。将其转换为 utf8mb4/utf8mb4_bin 使得 pymysql 的一切都再次正常工作,除了 PHP 所需的参数之外,无需设置任何参数。我从 MySQL Workbench 运行了以下查询:

ALTER DATABASE my_db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

然后要更新表,请运行下面的查询,复制输出并再次将其作为查询运行:

SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET utf8mb4
   COLLATE utf8mb4_unicode_ci;   ",
   "ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CONVERT TO CHARACTER SET utf8mb4
   COLLATE utf8mb4_unicode_ci;  ") 
AS alter_sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = "my_db_name";

归功于此讨论中的帖子

© www.soinside.com 2019 - 2024. All rights reserved.