web-dev-qa-db-fra.com

Interrogation de lignes non ASCII à partir de Postgres

Est-ce que [:ascii:] travail de classe à Postgres? Il n'est pas répertorié dans leur aide , cependant je vois exemples sur le Web qui l'utilisent.

J'ai une base de données UTF-8, où collation et c_typ e sont en_US.UTF-8, et la version Postgres est 9.6.2. Lorsque je recherche des lignes non ASCII comme celle-ci:

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

J'obtiens les symboles Unicode et non-Unicode (la sortie complète est ici ):

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

Quel est le problème avec cette requête?

14
Suncatcher

Pour répondre à ta question: [:ascii:] travaux. Vous mai avez dans votre texte des caractères que vous ne reconnaissez pas comme non-ASCII, pourtant ils sont là. Ils peuvent être quelque chose comme un espace insécable, par exemple, ou tout autre caractère d'espace Unicode .

Il n'est pas étrange d'avoir espaces insécables ( ) dans les textes que vous copiez et collez à partir d'une page Web, mais vous ne remarquez pas qu'ils sont là.

Voici un exemple à montrer:

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:]]' ;

C'est ce que tu as:

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

Vous pouvez voir à partir de cela, que votre problème est le caractère d'apostrophe droite . ASCII ne prend en charge que l'apostrophe. L'apostrophe gauche et l'apostrophe droite sont des extensions Unicode typographiquement correctes.

dbfiddle ici

Vous pouvez également le vérifier avec les versions précédentes sur http://rextester.com/UKIQ48014 (PostgreSQL 9.5) et http://sqlfiddle.com/#!15/4c563/1/ (PostgreSQL 9.3)


Les textes que je pense que vous pensez sont en ASCII pur, et ne le sont pas :

 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 | 
 | : ------------------------------------------------- -------------------------- | Avez-vous entendu parler de la sainte mort? Ne la priez pas. | 
 | Le taux de mariage en Chine est en chute libre car les femmes préfèrent l'autonomie à 
 

dbfiddle --- (ici

Ces textes utilisent ' au lieu de ' pour marquer les apostrophes.

Vérifiez Ponctuation: pourquoi la bonne citation unique (U + 2019), et non l'apostrophe sémantiquement distincte (U + 0027), le caractère d'apostrophe préféré en Unicode? ... pour voir que vous êtes pas la première personne rencontrant ce problème.

26
joanolo