如何使用python在mysql数据库中存储阿拉伯语文本?

时间:2015-12-03 04:31:10

标签: python mysql string unicode export-to-csv

我有阿拉伯字符串说

txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'

我想把这个文本写成阿拉伯语转换成mySql数据库。我尝试使用

txt = smart_str(txt)

txt = text.encode('utf-8') 

这两个人都在工作,因为他们将字符串转换为

u'Arabic (\xd8\xa7\xd9\x84\xd8\xb7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86)' 

此外,我的数据库字符集已设置为utf-8

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;

因此,由于这个新的unicodes,我的数据库显示与编码文本相关的字符。请帮忙。我希望保留我的阿拉伯语文本。

从MySQL数据库快速导出这个阿拉伯语文本会将相同的阿拉伯语文本写入文件还是会再次将其转换回unicode?

我使用了愚蠢的代码来插入

cur.execute("INSERT INTO tab1(id, username, text, created_at) VALUES (%s, %s, %s, %s)", (smart_str(id), smart_str(user_name), smart_str(text), date))

早些时候,当我没有使用smart_str时,它会抛出错误,只说“拉丁语1”和“#”;被允许。

2 个答案:

答案 0 :(得分:3)

澄清一些事情,因为它将在未来帮助你。

txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'

这不是阿拉伯字符串。这是一个带有unicode代码点的unicode 对象。如果您只是打印它,如果您的终端支持阿拉伯语,您将获得如下输出:

>>> txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
>>> print(txt)
Arabic (الطيران)

现在,要在数据库中获得与Arabic (الطيران)相同的输出,您需要对字符串进行编码。

编码正在考虑这些代码点;并将它们转换为字节,以便计算机知道如何处理它们。

所以最常见的编码是utf-8,因为它支持所有英文字符,以及许多其他语言(包括阿拉伯语)。还有其他一些,例如,windows-1256也支持阿拉伯语。有些人没有对这些数字的引用(称为代码点),当您尝试编码时,您将收到如下错误:

>>> print(txt.encode('latin-1'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 8-14: ordinal not in range(256)

这告诉你的是,latin-1表中不存在unicode对象中的某个数字,因此程序不知道如何将其转换为字节。

计算机存储字节。因此,在存储或传输信息时,您需要始终对其进行正确编码/解码。

此编码/解码步骤有时称为unicode sandwich - 外部的所有内容都是字节,内部的所有内容都是unicode。

完成此操作后,您需要在将数据发送到数据库之前正确编码数据;要做到这一点,编码:

q = u"""
    INSERT INTO
       tab1(id, username, text, created_at)
    VALUES (%s, %s, %s, %s)"""

conn = MySQLdb.connect(host="localhost",
                       user='root',
                       password='',
                       db='',
                       charset='utf8',
                       init_command='SET NAMES UTF8')
cur = conn.cursor()
cur.execute(q, (id.encode('utf-8'),
                user_name.encode('utf-8'),
                text.encode('utf-8'), date))

要确认它是否正确插入,请确保您使用支持阿拉伯语的终端或应用程序中的mysql;否则 - 即使它正确插入,当你的程序显示它时 - 你会看到垃圾字符。

答案 1 :(得分:2)

在执行SET names utf8之前执行INSERT

cur.execute("set names utf8;")

cur.execute("INSERT INTO tab1(id, username, text, created_at) VALUES (%s, %s, %s, %s)", (smart_str(id), smart_str(user_name), smart_str(text), date))

您的问题与this SO post非常相似,您应该阅读。