gpt4 book ai didi

python - 向 mysql 插入 4 字节 unicode 引发的警告

转载 作者:太空狗 更新时间:2023-10-29 21:29:43 25 4
gpt4 key购买 nike

请看以下内容:

/home/kinka/workspace/py/tutorial/tutorial/pipelines.py:33: Warning: Incorrect string 
value: '\xF0\x9F\x91\x8A\xF0\x9F...' for column 't_content' at row 1
n = self.cursor.execute(self.sql, (item['topic'], item['url'], item['content']))

字符串'\xF0\x9F\x91\x8A,实际上是一个4字节的unicode:u'\U0001f62a'。 mysql 的字符集是 utf-8 但插入 4 字节 unicode 它将截断插入的字符串。google了一下这样的问题,发现5.5.3下的mysql不支持4字节的unicode,不幸的是我的是5.5.224。我不想升级mysql服务器,所以我只想过滤python中的4字节unicode,我尝试使用正则表达式但失败了。那么,有什么帮助吗?

最佳答案

如果 MySQL 无法处理 4 个字节或更多的 UTF-8 代码,那么您将不得不过滤掉代码点 \U00010000 上的所有 unicode 字符; UTF-8 以 3 个字节或更少的字节对低于该阈值的代码点进行编码。

您可以为此使用正则表达式:

>>> import re
>>> highpoints = re.compile(u'[\U00010000-\U0010ffff]')
>>> example = u'Some example text with a sleepy face: \U0001f62a'
>>> highpoints.sub(u'', example)
u'Some example text with a sleepy face: '

或者,您可以使用 .translate() function使用仅包含 None 值的映射表:

>>> nohigh = { i: None for i in xrange(0x10000, 0x110000) }
>>> example.translate(nohigh)
u'Some example text with a sleepy face: '

但是,创建翻译表会消耗大量内存,需要一些时间来生成;这可能不值得您付出努力,因为正则表达式方法更有效。

这一切都假定您使用的是 UCS-4 编译的 python。如果您的 python 是使用 UCS-2 支持编译的,那么您只能在正则表达式中使用最大 '\U0000ffff' 的代码点,并且您永远不会首先遇到这个问题。

我注意到从 MySQL 5.5.3 开始新添加的 utf8mb4 codec确实支持完整的 Unicode 范围。

关于python - 向 mysql 插入 4 字节 unicode 引发的警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10798605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com