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

如何使用python在mysql数据库中存储阿拉伯语文本?,python,mysql,string,unicode,export-to-csv,Python,Mysql,String,Unicode,Export To Csv,我有一个阿拉伯字符串 txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)' 我想把这段文字转换成阿拉伯语的mySql数据库。我试着用 txt = smart_str(txt) 或 这两种方法都不起作用,因为它们将字符串隐藏到 u'Arabic (\xd8\xa7\xd9\x84\xd8\xb7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86)' 此外,我的数据库字符集已设置为utf-8 ALTER DAT

我有一个阿拉伯字符串

txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
我想把这段文字转换成阿拉伯语的mySql数据库。我试着用

txt = smart_str(txt)

这两种方法都不起作用,因为它们将字符串隐藏到

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时,它抛出一个错误,表示只允许使用“latin-1”

在执行
插入之前,只需执行
设置名称utf8

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))

你的问题与之非常相似,你应该读一读。

来澄清一些事情,因为它也会帮助你在未来继续前进

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 (الطيران)
>>> 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)
现在,要在数据库中获得与阿拉伯语类似的输出,您需要对字符串进行编码

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

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

>>> txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
>>> print(txt)
Arabic (الطيران)
>>> 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)

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

您能否向我们展示您用于执行
插入的代码?
?我已经包括了插入。请帮助您好先生,感谢我前面提到的重播,我可以在我的数据库中看到utf-8文本,但utf-8文本不是阿拉伯语。当我使用smart_str()时,它正在将阿拉伯语的\u0627\转换为\xd8\其他内容。请插入原始阿拉伯语。无需将其转换为unicode。当我在不使用smart_str()的情况下输入原始文本时,它会抛出>>UnicodeEncodeError:“latin-1”编解码器无法对字符进行编码先生,请您帮忙。非常感谢先生。这很有教育意义。万分感谢:)