Python 如何将编码值存储到数据库中

Python 如何将编码值存储到数据库中,python,mysql,string,utf-8,Python,Mysql,String,Utf 8,我想将地址(typestring)存储到数据库字段(typeVARCHAR)中。 问题是,有时地址包含非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", pass

我想将地址(type
string
)存储到数据库字段(type
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...
因此,当我运行代码时,在
打印后,我会得到以下内容:

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

我尝试过在mysql查询中更改
address
address 2
,还有很多其他尝试,但到目前为止我什么都没有…

您的数据库使用的是拉丁语1,所以解决问题的方法是在mysql数据库中使用UTF-8。有关如何将现有数据库转换为UTF-8的信息,请参阅本文:

为了确保您未来的数据库也使用utf-8,请查看这篇关于如何更改的帖子:


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

您的数据库使用latin1,因此解决问题的方法是在MySQL数据库中使用utf-8。有关如何将现有数据库转换为UTF-8的信息,请参阅本文:

为了确保您未来的数据库也使用utf-8,请查看这篇关于如何更改的帖子:

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

请参阅:

  • 要存储的字节未编码为utf8/utf8mb4。-大概是
    init_命令
    解决了这个问题
  • 数据库中的列是字符集utf8(或utf8mb4)。——这个好像坏了
  • 此外,检查读取期间的连接是否为UTF-8
如果您还有其他问题,请按照上面链接中的“测试数据”

Python提示如下:

请参阅中的“问号”:

  • 要存储的字节未编码为utf8/utf8mb4。-大概是
    init_命令
    解决了这个问题
  • 数据库中的列是字符集utf8(或utf8mb4)。——这个好像坏了
  • 此外,检查读取期间的连接是否为UTF-8
如果您还有其他问题,请按照上面链接中的“测试数据”


Python提示:

也许utf-8不是mysql数据库中的默认字符集。如果启动mysql控制台并键入“show variables like'char%';”,会得到什么结果?VARCHAR列的排序规则是什么?你能改变该列以使用不同的排序规则,或者用NVARCHAR列替换它吗?@GöranPaues:我已经运行了命令,我得到的结果是:
character\u set\u client->latin1;字符集连接->拉丁1;字符集数据库->拉丁1;字符集文件系统->二进制;字符集结果->拉丁1;字符集服务器->拉丁1;字符集系统->utf8;character\u sets\u dir->/usr/share/mysql/charsets/
@TomBlodget:varchar列的排序规则是这一个
地址varchar(255)默认值“”
我没有创建表,修改该列可能是一个困难的选择…@TomBlodget:但是无论如何,想想看,如果我可以修改该列!你对NVARCHAR是什么意思?对不起,我几乎是数据库新手……也许utf-8不是mysql数据库中的默认字符集。如果启动mysql控制台并键入“show variables like'char%';”,会得到什么结果?VARCHAR列的排序规则是什么?你能改变该列以使用不同的排序规则,或者用NVARCHAR列替换它吗?@GöranPaues:我已经运行了命令,我得到的结果是:
character\u set\u client->latin1;字符集连接->拉丁1;字符集数据库->拉丁1;字符集文件系统->二进制;字符集结果->拉丁1;字符集服务器->拉丁1;字符集系统->utf8;character\u sets\u dir->/usr/share/mysql/charsets/
@TomBlodget:varchar列的排序规则是这一个
地址varchar(255)默认值“”
我没有创建表,修改该列可能是一个困难的选择…@TomBlodget:但是无论如何,想想看,如果我可以修改该列!你对NVARCHAR是什么意思?对不起,我对数据库几乎是新手…你是说上面显示的这行
character\u set\u database->latin1
的所有内容吗?这只是需要检查的几件事之一。是的,这表明你的数据库编码是latin1,不是utf-8。你的意思是上面显示的这一行
character\u set\u database->latin1
?这只是需要检查的几件事之一。是的,这表明你的数据库编码是latin1,而不是utf-8。
Francesc Arag?, 2, 07872 Es Cal?, Espa?a