如何用GORM/SQL查询时忽略无效UTF-8字符?
解决方案:过滤PostgreSQL中含无效UTF-8的行
你之前尝试的过滤方法都没命中问题核心:要么误过滤了合法的多字节UTF-8字符,要么逻辑无法识别无效字节序列。以下是两种可靠的解决方式:
方式一:自定义PostgreSQL函数(推荐)
先在数据库中创建一个检查字符串是否为有效UTF-8的函数,逻辑是尝试转换字符串,失败则判定为无效:
CREATE OR REPLACE FUNCTION is_valid_utf8(text) RETURNS boolean AS $$ BEGIN PERFORM convert_from(convert_to($1, 'UTF8'), 'UTF8'); RETURN true; EXCEPTION WHEN OTHERS THEN RETURN false; END; $$ LANGUAGE plpgsql IMMUTABLE;
之后在GORM查询中先过滤有效行,再执行ILIKE操作:
db.Where("is_valid_utf8(name)").Where("name ILIKE ?", value)
方式二:纯正则表达式过滤(无需创建函数)
用匹配合法UTF-8字节序列的正则直接过滤,覆盖所有单/双/三/四字节的合法UTF-8字符:
validUtf8Pattern := `^([\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF4][\x80-\xBF]{3})*$` db.Where("name ~ ?", validUtf8Pattern).Where("name ILIKE ?", value)
补充说明
临时过滤只能解决查询报错问题,建议从数据写入源头做UTF-8校验,避免无效数据持续流入。
内容的提问来源于stack exchange,提问作者Bustinout
相关产品推荐
相关产品推荐

