Postgres에서 비 ASCII 행 쿼리


14

[:ascii:]Postgres에서 수업이 진행 됩니까 ? 그것은 그들의 도움에 나열되어 있지 않지만 웹에서 그것을 사용하는 예제를 봅니다 .

collationc_typ e가 있는 UTF-8 데이터베이스 가 en_US.UTF-8있으며 Postgres 버전은 9.6.2입니다. 다음과 같이 비 ASCII 행을 검색하면

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

유니 코드와 비 유니 코드 기호를 모두습니다 (전체 출력은 여기에 있습니다 ).

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

이 쿼리에 어떤 문제가 있습니까?


1
분리 할 수없는 유니 코드 공백이있는 문장을 얻을 수 있습니까? (또는 그 문제에 대해 분명하게 숨기는 다른 캐릭터)
joanolo

@joanolo, 이것을 확인하는 방법? 평평하지 않은보기를 보는 방법?
Suncatcher

a regexp_replace()를 사용 하여 비 ASCII 문자를 표시 할 수 있습니다 . 내 대답을 참조하십시오.
joanolo

1
항상 정확한 결과를 dba.se에 붙여 넣어야합니다. ASCII 이외의 문자에 대해서는 그래픽을 테스트 할 수 없습니다. 실제 결과 집합을 테스트 할 수 있습니다. 이것은을위한 포스터 자식 그래픽 안
에반 캐롤

2
2 센트 만 추가하면 joanolo의 답변은 훌륭하지만이 구체적인 문제를 해결하는 데 도움이되지 않았습니다. 올바른 인용 부호를 제외하고 내 데이터 세트에는 [:ascii:]어쨌든 클래스 를 사용할 수없는 다른 혼란스러운 문자 (공백, ",«와 같은)가 있습니다 .이 문제에서 실제로 도움이 된 것은 유니 코드 블록의 개념입니다. 이 멋진 정규식 에서 배웠습니다. 개별지도 .
Suncatcher

답변:


25

귀하의 질문에 대답하려면 : [:ascii:]작동합니다. 당신은 할 수 있습니다 당신이로 인식하지 않는 텍스트의 일부 문자가 ASCII가 아닌 , 그러나 그들은 거기. 예를 들어 깨지지 않는 공백 과 같은 문자 이거나 다른 유니 코드 공백 문자 일 수 있습니다.

웹 페이지에서 복사하여 붙여 넣은 텍스트에 깨지지 않는 공백 (  ) 이있는 것이 이상하지는 않지만 해당 공백 이 있음을 알지 못합니다.

보여주는 예는 다음과 같습니다.

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는 아포스트로피 만 지원합니다. 왼쪽 아포스트로피와 오른쪽 아포스트로피는 인쇄상의 올바른 유니 코드 확장입니다.

여기 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가 아닌 캐릭터를 보여주기 때문에 정말 환상적인 답변입니다. 이것이 내가이 질문에 대답했을 방법입니다.
Evan Carroll

1
OPs 예제로 업데이트했습니다.
Evan Carroll

1
정말 환상적이고 유용한 답변입니다! 감사.
Suncatcher
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.