【问题标题】:How to store encoded values into a DB [duplicate]如何将编码值存储到数据库中[重复]
【发布时间】:2017-09-12 06:57:22
【问题描述】:

我想将地址(类型string)存储到数据库字段(类型VARCHAR)中。 问题是有时地址有 Non-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,以及许多其他尝试,但到目前为止我一无所获......

【问题讨论】:

  • 也许 utf-8 不是 mysql 数据库中的默认字符集。如果你启动一个 mysql 控制台并输入“show variables like 'char%';”,你会得到什么结果?
  • VARCHAR 列的排序规则是什么?您可以更改该列以使用不同的排序规则或将其替换为 NVARCHAR 列吗?
  • @GöranPaues :我已经运行了命令,这就是我得到的:character_set_client -&gt; latin1; character_set_connection -&gt; latin1; character_set_database -&gt; latin1; character_set_filesystem -&gt; binary; character_set_results -&gt; latin1; character_set_server -&gt; latin1; character_set_system -&gt; utf8; character_sets_dir -&gt; /usr/share/mysql/charsets/
  • @TomBlodget : varchar 列的排序规则是 ADDRESS varchar(255) DEFAULT '' 我没有创建表,更改该列可能是一个困难的选择...
  • @TomBlodget :但无论如何,想想我是否可以改变专栏!你是什​​么意思 NVARCHAR ?抱歉,我对数据库几乎是新手...

标签: python mysql string utf-8


【解决方案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

【讨论】:

    【解决方案2】:

    您的数据库使用的是 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 已成为事实上的标准,因此最好您的数据库使用它。

    【讨论】:

    • 你是指上面显示的character_set_database -&gt; latin1这行吗?
    • 这只是要检查的几件事之一。
    • 是的,这表示您的数据库编码是 latin1,而不是 utf-8。
    猜你喜欢
    • 2013-08-11
    • 2019-06-29
    • 2012-09-25
    • 2011-12-25
    • 2014-12-19
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多