如何将编码值存储到DB中

时间:2017-04-16 14:25:56

标签: python mysql string utf-8

我想将地址(类型string)存储到数据库字段(类型VARCHAR)中。 问题是,有时地址有非ASCII 字符,所以我接下来要做的是:

在我的.py文件中

import sys
reload(sys)
sys.setdefaultencoding('utf8')

# Other imports...

# The connection with the DB
conn = MySQLdb.connect(host="127.0.0.1", user="myUser", passwd="myPass", db="myDB", charset='utf8', init_command='SET NAMES UTF8')

# More code here...

address2 = address.encode('utf-8')
print "\nTHE ADDRESS TYPE IS -> ", type(address), "\n"
print "\nTHE ADDRESS IS -> ", address, "\n"
print "\nTHE ADDRESS2 IS -> ", address2, "\n"

self.conn.cursor().execute("""INSERT INTO myTable (BLA, BLA, ADDRESS) VALUES (%s, %s, %s)""", (bla, bla, address2))
# The rest of the code...

因此,当我运行代码时,我会在prints之后得到以下内容:

THE ADDRESS TYPE IS ->  <type 'str'>
THE ADDRESS IS -> Francesc Aragó, 2, 07872 Es Caló, España
THE ADDRESS2 IS -> Francesc Aragó, 2, 07872 Es Caló, España

但是当我在数据库中访问我的表并访问该字段时,我得到了这个

Francesc Arag?, 2, 07872 Es Cal?, Espa?a

我尝试在mysql查询中更改address2 address以及其他许多尝试,但到目前为止我什么都没有...

2 个答案:

答案 0 :(得分:1)

您的数据库正在使用latin1,因此您的问题的解决方案是在MySQL数据库中使用UTF-8。有关如何将现有数据库转换为UTF-8的信息,请参阅此文章: How to convert an entire MySQL database characterset and collation to UTF-8?

为了确保您未来的数据库也使用utf-8,请查看此帖子,了解如何更改:Change MySQL default character set to UTF-8 in my.cnf?

您也可以在Python代码中使用latin1而不是utf-8,但UTF-8已经成为事实上的标准,因此最好是数据库使用它。

答案 1 :(得分:1)

请参阅Trouble with utf8 characters; what I see is not what I stored中的“问号”:

  • 要存储的字节不编码为utf8 / utf8mb4。 - 大概是init_command解决了这个问题。
  • 数据库中的列是CHARACTER SET utf8(或utf8mb4)。 - 这似乎被打破了。
  • 另外,检查读取时的连接是否为UTF-8。

如果您还有其他问题,请按照上述链接中的“测试数据”进行操作。

Python提示:http://mysql.rjweb.org/doc.php/charcoll#python