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

kko*_*koe 4 python mysql string unicode export-to-csv

我有一个阿拉伯字符串说

txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
Run Code Online (Sandbox Code Playgroud)

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

txt = smart_str(txt)
Run Code Online (Sandbox Code Playgroud)

或者

txt = text.encode('utf-8') 
Run Code Online (Sandbox Code Playgroud)

这两个都不起作用,因为它们将字符串转换为

u'Arabic (\xd8\xa7\xd9\x84\xd8\xb7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86)' 
Run Code Online (Sandbox Code Playgroud)

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

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

因此,由于这个新的 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))
Run Code Online (Sandbox Code Playgroud)

在此之前,当我没有使用 smart_str 时,它会抛出一个错误,表示仅允许“latin-1”。

Bur*_*lid 5

澄清一些事情,因为这对你将来也有帮助。

\n\n
txt = u\'Arabic (\\u0627\\u0644\\u0637\\u064a\\u0631\\u0627\\u0646)\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
>>> txt = u\'Arabic (\\u0627\\u0644\\u0637\\u064a\\u0631\\u0627\\u0646)\'\n>>> print(txt)\nArabic (\xd8\xa7\xd9\x84\xd8\xb7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86)\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,为了获得与数据库中相同的输出Arabic (\xd8\xa7\xd9\x84\xd8\xb7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86),您需要对字符串进行编码。

\n\n

编码就是采用这些代码点;并将它们转换为字节,以便计算机知道如何处理它们。

\n\n

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

\n\n
>>> print(txt.encode(\'latin-1\'))\nTraceback (most recent call last):\n  File "<stdin>", line 1, in <module>\nUnicodeEncodeError: \'latin-1\' codec can\'t encode characters in position 8-14: ordinal not in range(256)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

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

\n\n
\n\n

解决这个问题后,您需要在将数据发送到数据库之前对其进行正确编码;为此,对其进行编码:

\n\n
q = u"""\n    INSERT INTO\n       tab1(id, username, text, created_at)\n    VALUES (%s, %s, %s, %s)"""\n\nconn = MySQLdb.connect(host="localhost",\n                       user=\'root\',\n                       password=\'\',\n                       db=\'\',\n                       charset=\'utf8\',\n                       init_command=\'SET NAMES UTF8\')\ncur = conn.cursor()\ncur.execute(q, (id.encode(\'utf-8\'),\n                user_name.encode(\'utf-8\'),\n                text.encode(\'utf-8\'), date))\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n