将 postgres 中除 ascii 32 和 ascii 0、13、27 之外的所有字符替换为 127 sql

Replace all characters except ascii 32 to 127 and ascii 0, 13, 27 in postgres sql

有没有什么函数可以替换postgres中除ascii 32到127和ascii 0,13,27之外的所有字符sql。我不想替换空格、换行符等。我想替换奇怪的字符,例如俱乐部标志、正方形或奇怪的星号。

我尝试像下面那样修改 regexp_replace 但它不起作用。

select regexp_replace('abc$wanto&tore9046move#special~04 chars', '[^\x00-\x7f]', '', 'g') 
--This is giving error ERROR: 22021: invalid byte sequence for encoding "UTF8": 0x00

select *, regexp_replace('abc$wanto&tore9046move#special~04 chars', '[^[:ascii:]]', '', 'g')
--This one is taking everything beyond 255 also in the set. 

非常感谢您的宝贵时间和帮助

尝试 unicode 范围:

select regexp_replace('abc$wanto&tore9046move#special~04 chars', '[\u0080-\u00ff]', '', 'g')

Reference

这将删除 128-255 ascii 范围内的任何字符。

你几乎是对的:

select regexp_replace('abc$wanto&tore9046move#special~04 chars', '[^\x00-\x7f]', '', 'g') 

但空字节 \x00 在 PostgreSQL 字符串文字中无效,因此您必须从 \x01 开始。您想要的范围从 32 (0x20) 开始,因此请使用它加上 13 (0x0d) 和 27 (0x1b) 的一些特定内容:

select regexp_replace('abc$wanto&tore9046move#special~04 chars', '[^\x20-\x7f\x0d\x1b]', '', 'g')

或者,使用更有用的输入:

regress=> select regexp_replace('aáiï*∞ıb ', '[^\x20-\x7f\x0d\x1b]', '', 'g');
 regexp_replace 
----------------
 ai*b 
(1 row)