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文字のグラフィックをテストすることはできません。実際の結果セットをテストできます。これは、グラフィック
エヴァンキャロル

2
ちょうど私の2セントを追加するために:joanoloの答えは壮観ですが、この具体的な問題を解決する助けにはなりませんでした。右の引用符を除いて、私のデータセットは、他の混乱文字の束を持っていることができなく使用できるようになります(似スペース、」、«)[:ascii:]とにかくクラスを。本当にこの問題で私を助けたことはユニコード・ブロックの概念であり、私はから学んだこの素晴らしい正規表現チュートリアル
サンキャッチャー

回答:


25

あなたの質問に答えるために:[:ascii:]作品。あなたはありますが、として認識していないことを、あなたのテキストにいくつかの文字を持っている非ASCII、まだ彼らはそこにいます。それらは、たとえば、壊れないスペース、または他のUnicodeスペース文字のようなものです。

Webページからコピーアンドペーストするテキストに改行できないスペース )が含まれているのは奇妙なことではありませんが、そこにあることに気付かないでしょう。

表示する例を次に示します。

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 + 0027)ではなく、正しい単一引用符(U + 2019)が必要なのはなぜですか?...この問題に最初に遭遇したのはあなたではないことがわかります。


3
非ASCII文字が表示されるため、これは本当に素晴らしい答えです。これは私がこの質問に答える方法です。
エヴァンキャロル

1
OPの例を更新しました。
エヴァンキャロル

1
本当に幻想的で役立つ答えです!ありがとう。
サンキャッチャー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.