Select 文本中的奇怪字符,不适用于 LIKE 运算符

Select strange characters on text, not working with LIKE operator

我尝试使用this solution and this (for str_eval()) but seems other encode or other UTF8's Normalization Form, perhaps combining diacritical marks...

select distinct  logradouro, str_eval(logradouro)  
from logradouro where logradouro like '%CECi%';
--         logradouro         |          str_eval
------------------------------+----------------------------
-- AV CECi\u008DLIA MEIRELLES | AV CECi\u008DLIA MEIRELLES

PROBLEM:如何selecttable的所有行存在问题?
即[=13] =] 发生?


对于 Google,在解决问题后编辑:这是一个典型的 XY problem。在原题(上)中我使用了~错误假设。以下所有解决方案都是对以下 (objective) 问题的回答:

如何select只有printable ASCII文本?

"Printable ASCII"是UTF8的一个子集,就是"all ASCII that is not a 'control character'".

"non-printable"控制字符是UNICODE十六进制00到1F和7F
(HTML实体�+或十进制 0 到 31 + 127).

PS1:零(�)是PostgreSQL text数据类型内部表示的"end of text"标记,所以不需要已检查,但将其包含在范围内没有问题。

PS2:关于次要问题"how to convert a word with encode bug to a valid word?",
见一个heuristic at .

使用变通方法解决

select distinct  logradouro, str_eval(logradouro)
from logradouro where not(logradouro ~ E'^[a-zA-Z0-9_,;\- \.\(\)\/"\'\*]+$');

编码有系统性错误,无法转换为正确的UTF8...即使转换,问题是"CECi\u008DLIA"不是"CECíLIA"。

解决方案是在

上使用一种"heuristic spell corrector"
regexp_replace(logradouro, E'[^a-zA-Z0-9_,;\- \.\(\)\/"\'\*]+', '!')

示例:"Ceci!lia" 的 i! 更正为 í


注意。使用特定数据集训练的任何启发式解决方案(或神经网络)(特定 systematic error source) is a black box 解决方案,仅对那种类型的系统错误有效。没有针对此类问题的泛化.

此条件将排除不完全由可打印 ASCII 字符组成的任何字符串:

logradouro ~ '[^\u0020-\u007E]'