如何用表情符号和特殊字符编码国际字符串以存储在数据库中

时间:2018-08-24 20:22:51

标签: python mysql character-encoding utf8mb4

我想使用游戏中的API,并将玩家和氏族名称存储在本地数据库中。名称可以包含各种字符和表情。这只是我发现的几个示例:

  • яαℓαηι
  • نکل
  • 窝猫
  • 铁击道游队
  • ❤✖❤♠️♦️♣️✖

我使用python读取api并将其写入mysql数据库。之后,我想在Node.js Web应用程序上使用这些名称。

编码这些字符的最佳方法是什么?如何将它们保存在数据库中,以便以后可以正确显示它们?

我试图用utf-8在python中编码字符串:

>>> s = "I am awesome and I love you"
>>> [m.start() for m in re.finditer(r"\b\w", s)]
[0, 2, 5, 13, 17, 19, 24]

并将编码后的字符串存储在具有 utf8mb4_unicode_ci 字符集的mysql数据库中。

当我从上方存储字符串并在mysql工作台中选择它时,它显示如下:

>>> sample = '蛙喜鄉民CLUB'
>>> sample
'蛙喜鄉民CLUB'
>>> sample = sample.encode('UTF-8')
>>> sample
b'\xe8\x9b\x99\xe5\x96\x9c\xe9\x84\x89\xe6\xb0\x91CLUB'

当我再次使用python从数据库中读取此字符串(并将其存储在蛙喜鄉民CLUB 中)时,我得到:

db_str

第一个输出完全是乱码,第二个输出是utf-8,看起来像上面的编码字符串,但是在每个字节之间添加了>>> db_str èåéæ°CLUB >>> db_str.encode('UTF-8') b'\xc3\xa8\xc2\x9b\xc2\x99\xc3\xa5\xc2\x96\xc2\x9c\xc3\xa9\xc2\x84\xc2\x89\xc3\xa6\xc2\xb0\xc2\x91CLUB' \xc2

如何将此类字符串保存到mysql中,以便我可以再次读取它们并在python脚本中正确显示它们?

我的数据库排序规则utf8mb4_unicode_ci不适合此类内容吗?还是我必须使用其他编码?

1 个答案:

答案 0 :(得分:1)

如@abarnert在对该问题的评论中所述,问题是用于编写unicode字符串的库不知道应使用utf-8,因此将字符串编码错误。

在将charset='utf8mb4'作为参数添加到mysql连接之后,该字符串将以预期的编码正确写入。

我要做的就是改变

conn = MySQLdb.connect(host, user, pass, db, port)

conn = MySQLdb.connect(host, user, pass, db, port, charset='utf8mb4')

然后,我在问题中描述的方法就完美地发挥了作用。

编辑:在连接对象上声明charset='utf8mb4'参数后,不再需要对字符串进行编码,因为mysqlclient库已经成功完成了对字符串的编码。