如何将带有表情符号和特殊字符的国际字符串编码存储在数据库中
How to encode international strings with emoticons and special characters for storing in database
我想使用游戏中的 API 并将玩家和战队名称存储在本地数据库中。名称可以包含各种字符和表情符号。以下是我发现的几个例子:
- ⭐
- яαℓαηι
- 戴维斯
- 窝猫
- 铁击道游队
- ❤✖❤♠️♦️♣️✖
我使用 python 读取 api 并将其写入 mysql 数据库。之后,我想在 Node.js 网络应用程序中使用这些名称。
编码这些字符的最佳方式是什么?我怎样才能将它们保存在数据库中,以便之后可以正确显示它们?
我尝试用 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_unicode_ci 字符集的 mysql 数据库中。
当我将上面的字符串 select 存储在 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_unicode_ci不适合这样的内容?还是我必须使用其他编码?
正如@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'
参数后,不再需要对字符串进行编码,因为 mysql 客户端库现在已经成功完成了。
我想使用游戏中的 API 并将玩家和战队名称存储在本地数据库中。名称可以包含各种字符和表情符号。以下是我发现的几个例子:
- ⭐
- яαℓαηι
- 戴维斯
- 窝猫
- 铁击道游队
- ❤✖❤♠️♦️♣️✖
我使用 python 读取 api 并将其写入 mysql 数据库。之后,我想在 Node.js 网络应用程序中使用这些名称。
编码这些字符的最佳方式是什么?我怎样才能将它们保存在数据库中,以便之后可以正确显示它们?
我尝试用 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_unicode_ci 字符集的 mysql 数据库中。
当我将上面的字符串 select 存储在 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_unicode_ci不适合这样的内容?还是我必须使用其他编码?
正如@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'
参数后,不再需要对字符串进行编码,因为 mysql 客户端库现在已经成功完成了。