我有一个 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 几乎是唯一的选择?
我找到了解决方案。数据库模式最初是使用 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";