1

我使用以下 Python 代码在 MySQL 表中插入一行:

city = City()
city.country_id = connection.globe.session.query(Country).\
    filter(Country.code == row[1]).one().id
city.name = row[3].decode('latin1').encode('utf8')
city.province = row[2].decode('latin1').encode('utf8')
[city.latitude, city.longitude] = [row[5], row[6]]

connection.globe.session.add(city)
connection.globe.session.commit()

在我的本地机器上进行测试时,正确插入了一个示例行:

75,209,36,Radès,36.7681,10.2753

使用来自不同机器 (AWS) 的相同代码会导致行略有不同:

75,209,36,Radès,36.7681,10.2753

整个 MySQL 数据库都配置为使用 utf8mb4 编码,实际上我花了很多时间相信 MySQL 应该为编码错误负责。但是由于我一直在不同的机器上运行它,我注意到相同的代码可以在一台机器上运行,但不能在另一台机器上运行。

由于正在执行相同的代码,我不相信我的 Python 代码是罪魁祸首。

Linux 和我在这里缺少的字符集/字符编码有什么奇怪的地方吗?

编辑:我应该注意到它们连接到同一个 RDS 数据库,这意味着数据库在两个插入之间是一致的。

4

1 回答 1

0

如果一切配置正确,则无需对字符串进行解码/编码。

HexE8是 latin1 中的编码;hexC3A8是 utf8 的编码。

如果进来的数据是latin1,就这样声明,然后让MySQL自己转换INSERT成表。 LOAD DATA(假设这是您用来读取 .csv 文件的内容)有一个CHARACTER SET子句。与数据库的连接需要在客户端指定编码。列/表需要在列中指定编码。更多讨论(尤其是“Mojibake”): http ://stackoverflow.com/questions/38363566/trouble-with-utf8-characters-what-i-see-is-not-what-i-stored

拜松笔记:http: //mysql.rjweb.org/doc.php/charcoll#python

于 2017-06-27T10:11:23.623 回答