处理重音字符 Python/MySQL
Handling Accented Characters Python/MySQL
我有一个正在构建的系统,它通过 POST 请求(API 内置于 Flask/Python 中)将行插入到 MySQL 数据库中。有些行中有重音。特别是我有一行名称为 Péter
。当我在我的代码中为数据库执行 SELECT 时,代码中的输出是 P\xc3\xa9ter
。这要求我在字符编码方面做一些工作。当我执行 GET 请求时,我提取数据并尝试将其输出为 JSON 响应,但出现此错误:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 1: invalid continuation byte
其他 GET 请求在没有重音符号的行上没有问题,所以我已经开始将它隔离到那个问题。
我正在使用 Amazon RDS 实例作为我的 MySQL 数据库。默认情况下,RDS 实例采用 latin-1 编码。我已经进入并更新了我的参数组,现在一切似乎都是 utf-8 编码的。这是我的字符和排序规则变量:
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /rdsdbbin/mysql-5.6.27.R1/share/charsets/ |
+--------------------------+-------------------------------------------+
8 rows in set (0.00 sec)
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
我重新启动了实例,甚至重新加载了整个数据库。作为进一步的说明,我 运行 这个 API 在我的 MySQL 数据库本地,它工作正常(这再次让我认为它是编码,因为整个数据库都是直接从我的数据库导入的本地主机版本)。
我不完全确定我的下一步是解决这个问题。是否可能将其错误地保存到数据库中?在将其插入数据库之前,我不进行任何编码。当我从命令行对其执行 SELECT 语句时,该字符在数据库中确实显示为 é(它应该在数据库中以某种方式编码)吗?
感谢您的帮助!
对于遇到此问题的任何其他人,我只需要在我的连接字符串中设置 charset = 'utf8'
(明确设置字符集)。我尝试在代码等中对字符串进行编码,但这立即奏效了。
我有一个正在构建的系统,它通过 POST 请求(API 内置于 Flask/Python 中)将行插入到 MySQL 数据库中。有些行中有重音。特别是我有一行名称为 Péter
。当我在我的代码中为数据库执行 SELECT 时,代码中的输出是 P\xc3\xa9ter
。这要求我在字符编码方面做一些工作。当我执行 GET 请求时,我提取数据并尝试将其输出为 JSON 响应,但出现此错误:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 1: invalid continuation byte
其他 GET 请求在没有重音符号的行上没有问题,所以我已经开始将它隔离到那个问题。
我正在使用 Amazon RDS 实例作为我的 MySQL 数据库。默认情况下,RDS 实例采用 latin-1 编码。我已经进入并更新了我的参数组,现在一切似乎都是 utf-8 编码的。这是我的字符和排序规则变量:
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /rdsdbbin/mysql-5.6.27.R1/share/charsets/ |
+--------------------------+-------------------------------------------+
8 rows in set (0.00 sec)
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
我重新启动了实例,甚至重新加载了整个数据库。作为进一步的说明,我 运行 这个 API 在我的 MySQL 数据库本地,它工作正常(这再次让我认为它是编码,因为整个数据库都是直接从我的数据库导入的本地主机版本)。
我不完全确定我的下一步是解决这个问题。是否可能将其错误地保存到数据库中?在将其插入数据库之前,我不进行任何编码。当我从命令行对其执行 SELECT 语句时,该字符在数据库中确实显示为 é(它应该在数据库中以某种方式编码)吗?
感谢您的帮助!
对于遇到此问题的任何其他人,我只需要在我的连接字符串中设置 charset = 'utf8'
(明确设置字符集)。我尝试在代码等中对字符串进行编码,但这立即奏效了。