gpt4 book ai didi

mysql - Django 与 MySQL 和 UTF-8

转载 作者:行者123 更新时间:2023-11-29 03:07:35 25 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
How to filter (or replace) unicode characters that would take more than 3 bytes in UTF-8?

背景:

我将 Django 与 MySQL 5.1 一起使用,我遇到了 4 字节 UTF-8 字符的问题,导致整个 Web 应用程序出现 fatal error 。

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

每当我在我的 Django 网站上的 ModelForm 中输入一个 4 字节的 unicode 字符(例如🀐)时,该表单就会进行验证,然后会引发类似于以下内容的异常:

Incorrect string value: '\xF0\x9F\x80\x90' for column 'first_name' at row 1

我的问题:

在使用 MySQL 5.1 数据库的 Django Web 应用程序中,避免由 4 字节 UTF-8 字符引起的 fatal error 的合理方法是什么。

我考虑过:

  1. 有选择地禁用 MySQL 警告以避免特定的错误消息(不确定是否可行)
  2. 创建将查看 request.POST QueryDict 并替换/删除所有无效 UTF8 字符的中间件
  3. 以某种方式 hook/alter/monkey 修补为 Django 或 MySQLdb 输出 SQL 查询的机制,以在执行查询之前替换/删除所有无效的 UTF-8 字符

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

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])

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