首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带MySQL和UTF-8的Django

问带MySQL和UTF-8的Django
EN

Stack Overflow用户
提问于 2012-10-29 01:19:14
回答 1查看 1.1K关注 0票数 2

可能重复: How to filter (or replace) unicode characters that would take more than 3 bytes in UTF-8?

背景:

我正在使用MySQL 5.1中的Django,我在使用4字节UTF-8字符时遇到了问题,在我的web应用程序中造成致命错误。

我使用a script将数据库中的所有表和列转换为UTF-8,这解决了大多数unicode问题,但4字节unicode字符仍然存在问题。作为noted elsewhere,MySQL 5.1不支持长度超过3个字节的UTF-8字符.

每当我输入一个4字节的unicode字符(例如)在我的Django网站上的ModelForm中,表单验证,然后引发一个类似于以下情况的异常:

代码语言:javascript
复制
Incorrect string value: '\xF0\x9F\x80\x90' for column 'first_name' at row 1

我的问题:

使用MySQL 5.1数据库的Django web应用程序中,避免4字节UTF-8字符造成致命错误的合理方法是什么?

我考虑过:

  1. 有选择地禁用MySQL警告以具体避免该错误消息(尚不确定这是否可行)
  2. 创建中间件,查看request.POST QueryDict并替换/删除所有无效的UTF8字符
  3. 钩子/修改/猴子补丁机制,它输出Django或MySQLdb的SQL查询,在执行查询之前替换/删除所有无效的UTF-8字符。

替换无效字符的示例中间件(受this SO question启发):

代码语言:javascript
复制
import re

class MySQLUnicodeFixingMiddleware(object):

    INVALID_UTF8_RE = re.compile(u'[^\u0000-\uD7FF\uE000-\uFFFF]', re.UNICODE)

    def process_request(self, request):
        """Replace 4-byte unicode characters by REPLACEMENT CHARACTER"""
        request.POST = request.POST.copy()
        for key, values in request.POST.iterlists():
            request.POST.setlist(key,
                [self.INVALID_UTF8_RE.sub(u'\uFFFD', v) for v in values])
EN

回答 1

Stack Overflow用户

发布于 2013-01-17 11:09:45

您有升级mysql的选项吗?如果这样做,您可以升级并将编码设置为utf8mb4。

假设您没有这个选项,我为您看到以下选项:

1)添加java脚本/前端验证,以防止除1,2或3字节unicode字符以外的任何内容的输入,

( 2)在模型中添加一个清理函数,以去除任何4字节unicode字符的数据(这将是您的选项2或3)。

同时,您的用户实际上使用的是4字节字符。如果您的应用程序中有使用它们的业务案例,您可以使用该功能并请求升级。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13114813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档