当前位置: 首页 > 面试题库 >

通过将4字节unicode插入mysql引发警告

楚天宇
2023-03-14
问题内容

请看以下内容:

/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则会截断插入的字符串。我用谷歌搜索了这样的问题,发现5.5.3下的mysql不支持4字节的unicode,不幸的是我的是5.5.224。我不想升级mysql服务器,所以我只想过滤python中的4字节unicode,我尝试使用正则表达式但失败了。那么,有什么帮助吗?


问题答案:

如果MySQL无法处理4字节或更多字节的UTF-8代码,那么您必须过滤掉代码点上的所有unicode字符\U00010000;
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()函数与仅包含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编解码器确实支持完整的Unicode范围。



 类似资料:
  • 问题内容: 我正在为我的自定义StringDatatype编写单元测试,并且需要写下4字节的unicode字符。“ \ U”-不起作用(非法转义字符错误),例如:U + 1F701(0xf0 0x9f 0x9c 0x81)。如何将其写成字符串? 问题答案: Unicode代码点不是4个字节。它是整数(目前介于U + 0000到U + 10FFFF之间)。 您的4个字节是(很自然地)其UTF-8编码

  • 问题内容: 通讯: 但是我想通过Ajax将我的电子邮件插入数据库。我不希望页面被重定向,因为每次刷新页面时,都会将空值插入数据库。 我只希望我的电子邮件通过Ajax插入数据库,然后再发送电子邮件,即 应该消失,并且应该有“您已成功订阅”行。 任何简短的代码将非常有用..预先感谢您:) 问题答案: 尝试这个: 和在 不要使用已弃用的。 实际上,如果您的问题是将空值插入数据库,则尝试此操作,这里不需要

  • 我需要在html页面上插入一个欧米茄(欧米茄)。我使用它的HTML转义代码来实现这一点,因此我可以编写并获得?。当我将它放入HTML元素中时,这一切都很好;但是,当我尝试将其放入我的JS中时,例如时,它将代码解析为JS,整个过程无法运行。有人知道怎么做吗?

  • 问题内容: 我正在尝试将字节数组插入sqlite数据库的blob列中。我已经尝试过使用setBinaryStream和setBytes,但是我无法通过SQLite JDBC驱动程序异常来实现。我正在使用sqlite-jdbc-3.8.7.jar。我应该使用哪个jar来完成这项工作?谢谢! 这是我的代码: 问题答案: 一旦对象已经与创建 该对象已经处理了命令文本。是时候执行PreparedState

  • 问题内容: 尝试将文件从Windows SFTP传输到Unix服务器时,我遇到一个特殊的问题。错误“堆栈跟踪”为- 我在其他论坛上进行了大量搜索,但无法找到根本原因。我还观察到另一件事-我尝试使用SFTP的文件名是 .xml,当我将其更改为 .XML时,SFTP是“成功的”。很奇怪,无法确定问题。我正在尝试使用JSch Java API。但是我在尝试WinSCP前端时也遇到了同样的问题。 问题答案