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] =] 发生?
- 不适用于
like '%CECi\u%'
也不适用 like '%CECi\u%'
- 适用于
like E'%CECi\u008D%'
但 不是通用的
对于 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]'
我尝试使用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] =] 发生?
- 不适用于
like '%CECi\u%'
也不适用like '%CECi\u%'
- 适用于
like E'%CECi\u008D%'
但 不是通用的
对于 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]'