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

luaexgnf  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(457)

我想使用一个api从一个游戏和存储在本地数据库中的球员和部落的名字。名称可以包含各种字符和表情符号。以下是我发现的几个例子:
⭐?
яαℓαηι
نکل
窝猫
鐵擊道遊隊
❤✖❤♠️♦️♣️✖
我使用python读取api并将其写入mysql数据库。之后,我想使用node.js web应用程序上的名称。
编码这些字符的最佳方法是什么?如何将它们保存在数据库中,以便以后正确显示它们?
我尝试用utf-8对python中的字符串进行编码:

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

并用utf8mb4\uunicode\u ci字符集将编码后的字符串存储在mysql数据库中。
当我存储上面的字符串并在mysql workbench中选择它时,显示如下:

蛙喜鄉民CLUB

当我用python再次从数据库中读取这个字符串时(并将其存储在 db_str )我得到:

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

第一个输出完全是乱七八糟的,第二个输出的utf-8看起来很像上面的编码字符串,但是添加了 \xc2 或者 \xc3 在每个字节之间。
如何将这些字符串保存到mysql中,以便再次读取它们并在python脚本中正确显示它们?
我的数据库排序规则utf8mb4\u unicode\u ci是否不适合此类内容?或者我必须使用另一种编码?

qoefvg9y

qoefvg9y1#

正如@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库现在已经成功地完成了编码。

相关问题