从Postgres查询非ASCII行


14

是否[:ascii:]在所有的Postgres类的工作?在他们的帮助中没有列出它,但是我在网络上看到一些利用它的示例

我有一个UTF-8数据库,其中归类c_typ e是en_US.UTF-8,而Postgres版本是9.6.2。当我搜索这样的非ASCII行时:

select title from wallabag_entry where title ~ '[^[:ascii:]]';

我同时获得 Unicode和非Unicode符号(完整的输出):

Сталинская правозащитница: мать Меленкова бабушка Настя
Дневник НКВДиста Шабалина: Знает ли Москва положение на фронте?
Бег по городу и поездка на осле: как в средневековье наказывали прелюбодеев
Как комиссар Крекшин в 1740 чуть не отменил историю России
Have you heard of Saint Death? Dont pray to her.
Архаїчна українська мова: перевага чи недолік?
Гренада не их
Chinas marriage rate is plummeting because women are choosing autonomy over 

此查询有什么问题?


1
您是否有可能使用Unicode不可中断的空格获得句子?(或其他任何隐藏在普通视图中的角色)
joanolo

@joanolo,如何检查?如何查看非普通视图?
森卡彻

您可以使用a regexp_replace()标记您的非ASCII字符。看我的答案。
joanolo

1
您应该始终将确切结果粘贴到dba.se中。我们无法测试图形是否包含非ASCII字符。我们可以测试实际结果集。这是海报的孩子,因为不应该是图片
Evan Carroll

2
只需加上我的两分钱:尽管joanolo的答案令人赞叹,但这并没有帮助我解决这个具体问题。除了右引号外,我的数据集还有许多其他令人困惑的字符(如空格,“,«),这使得[:ascii:]无论如何都无法使用类。真正帮助我解决此问题的是Unicode块的概念,我从这个神话般的正则表达式中学到了这一点。教程
森卡彻

Answers:


25

回答您的问题:[:ascii:]有效。您可能在文本中有一些无法识别为非ASCII的字符,但它们在那里。例如,它们可以是不可中断的空格,也可以是任何其他Unicode空格字符

从网页复制粘贴的文本中包含不间断空格 ),这并不奇怪,但是您不会注意到它们在那里。

这是一个示例显示:

WITH t(t) AS
(
    VALUES 
      ( 'Сталинская правозащитница: мать Меленкова бабушка Настя' ),
      ( 'Дневник НКВДиста Шабалина: Знает ли Москва положение на фронте?' ),
      ( 'Бег по городу и поездка на осле: как в средневековье наказывали прелюбодеев' ),
      ( 'Как комиссар Крекшин в 1740-е чуть не отменил историю России' ),
      ( 'Have you heard of Saint Death? Don’t pray to her.' ),
      ( 'Архаїчна українська мова: перевага чи недолік?' ),
      ( 'Гренада не их' ),
      ( 'China’s marriage rate is plummeting because women are choosing autonomy over ' )

)
SELECT 
    t,  regexp_replace(t, '([^[:ascii:]])', '[\1]', 'g') AS t_marked
FROM 
    t 
WHERE 
    t ~ '[^[:ascii:]]' ;

那就是你得到的:

                                       t                                       |                                                                                                 t_marked                                                                                                  
-------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Сталинская правозащитница: мать Меленкова бабушка Настя                       | [С][т][а][л][и][н][с][к][а][я] [п][р][а][в][о][з][а][щ][и][т][н][и][ц][а]: [м][а][т][ь] [М][е][л][е][н][к][о][в][а] [б][а][б][у][ш][к][а] [Н][а][с][т][я]
 Дневник НКВДиста Шабалина: Знает ли Москва положение на фронте?               | [Д][н][е][в][н][и][к] [Н][К][В][Д][и][с][т][а] [Ш][а][б][а][л][и][н][а]: [З][н][а][е][т] [л][и] [М][о][с][к][в][а] [п][о][л][о][ж][е][н][и][е] [н][а] [ф][р][о][н][т][е]?
 Бег по городу и поездка на осле: как в средневековье наказывали прелюбодеев   | [Б][е][г] [п][о] [г][о][р][о][д][у] [и] [п][о][е][з][д][к][а] [н][а] [о][с][л][е]: [к][а][к] [в] [с][р][е][д][н][е][в][е][к][о][в][ь][е] [н][а][к][а][з][ы][в][а][л][и] [п][р][е][л][ю][б][о][д][е][е][в]
 Как комиссар Крекшин в 1740 чуть не отменил историю России                  | [К][а][к] [к][о][м][и][с][с][а][р] [К][р][е][к][ш][и][н] [в] 1740-[е] [ч][у][т][ь] [н][е] [о][т][м][е][н][и][л] [и][с][т][о][р][и][ю] [Р][о][с][с][и][и]
 Have you heard of Saint Death? Dont pray to her.                             | Have you heard of Saint Death? Don[’]t pray to her.
 Архаїчна українська мова: перевага чи недолік?                                | [А][р][х][а][ї][ч][н][а] [у][к][р][а][ї][н][с][ь][к][а] [м][о][в][а]: [п][е][р][е][в][а][г][а] [ч][и] [н][е][д][о][л][і][к]?
 Гренада не их                                                                 | [Г][р][е][н][а][д][а] [н][е] [и][х]
 Chinas marriage rate is plummeting because women are choosing autonomy over  | China[’]s marriage rate is plummeting because women are choosing autonomy over 

由此可见,您的问题是右撇号。ASCII仅支持撇号。左撇号和右撇号是印刷上正确的Unicode扩展名。

dbfiddle 在这里

您也可以在http://rextester.com/UKIQ48014(PostgreSQL 9.5)和http://sqlfiddle.com/#!15/4c563/1/0(PostgreSQL 9.3)中使用以前的版本进行检查。


我猜您认为这些文本是纯ASCII的,不是

 WITH t(t) AS
 (
     VALUES 
       ('A fully ASCII text!'),
       ('Have you heard of Saint Death? Don’t pray to her.'),
       ('China’s marriage rate is plummeting because women are choosing autonomy over ')
 )
 SELECT 
    regexp_replace(t, '([^[:ascii:]])', '[\1]', 'g') AS t_marked
 FROM 
    t 
 WHERE 
    t ~ '[^[:ascii:]]' ;
| t_marked |
 | :------------------------------------------------- ----------------------------- | |
 | 你听说过圣死吗?不要向她祈祷。|
 | 中国的婚姻率暴跌,因为妇女选择了自主权而不是|
 

dbfiddle 在这里

这些文本使用'代替'来标记撇号。

检查标点符号:为什么正确的单引号(U + 2019)而不是语义上不同的撇号(U + 0027)(Unicode中首选的撇号字符)?...以确保您不是遇到此问题的第一个人。


3
这是一个非常棒的答案,因为它向您显示了非ASCII字符。这就是我要回答这个问题的方式。
埃文·卡罗尔

1
我更新了OP的示例。
埃文·卡罗尔

1
真的很棒又有用的答案!谢谢。
森卡彻
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.