web-dev-qa-db-fra.com

Spécifiez ICU Collations en tant que `encoding`,` lc_collate` et `lc_ctype` à Postgres 10

Postgres 10 gagne la capacité d'utiliser composants internationaux pour Unicode (ICU) Collations plutôt que en fonction des implémentations d'OS hôte. Voir Collations plus robustes avec ICU Support dans PostgreSQL 10 par Peter Eisenraut.

Alors, comment cela spécifie-t-on exactement un ICU CLOSA) lors de la création de la base de données?

J'ai lu une pointe dans le CREATE DATABASE utiliser template0 plutôt que template1 si template1 aurait pu être créé à l'aide de codage et de collation autre que ce que vous souhaitez pour votre nouvelle base de données. Et quand vous utilisez template0, vous devez activer les connexions de données pour remplacer la valeur par défaut.

Et j'ai lu dans Postgres 10 DOC Page pour Support de collation que:

uND-X-ICU (pour "indéfini")

Collation ICU "racine". Utilisez-le pour obtenir un ordre de tri de langue-agnostique raisonnable.

Il semble donc und-x-icu Peut-être une bonne valeur à utiliser lors de l'établissement d'une nouvelle base de données qui inclura un texte multilingual. Lorsque une certaine langue est connue pour se concentrer sur une langue particulière, la commande SELECT peut spécifier une autre collation telle que l'allemand de-x-icu. Sinon, replacez la valeur par défaut de und-x-icu.

J'ai donc essayé le SQL suivant pour créer une base de données dans Postgres 10 Beta 2.

CREATE DATABASE timepiece_
TEMPLATE 'template0'
ALLOW_CONNECTIONS TRUE
CONNECTION LIMIT -1
ENCODING 'UTF8'
LC_COLLATE 'und-x-icu'
LC_CTYPE 'und-x-icu'
;

Échoue avec une erreur:

[42809] Erreur: Nom local non valide: "Und-X-ICU"

Alors je suis coincé sur une annexe .utf8 Comme on le voit dans la doc pour la syntaxe de collation à l'ancienne.

CREATE DATABASE timepiece_
TEMPLATE 'template0'
ALLOW_CONNECTIONS TRUE
CONNECTION LIMIT -1
ENCODING 'UTF8'
LC_COLLATE 'und-x-icu.utf8'
LC_CTYPE 'und-x-icu.utf8'
;

Échoue à la même chose:

[42809] Erreur: Nom local invalide: "und-x-icu.utf8"

Mon groupe Postgres était conçu avec ICU bibliothèques? Voici le résultat de l'appel pg_config . La dernière ligne est 'ICU_LIBS=-L/opt/local/Current/lib -licuuc -licudata -licui18n'. Je suppose que cela signifie que ma construction inclut le ICU Bibliothèques mais je ne suis pas sûr.

/ Bibliothèque/PostgreSQL/10BETA2/BIN/PG_CONFIG --Configure

'--with-ICU' '--PREFIX =/MNT/HGFS/PGINSTALLER.PUNE/SERVER/STAGINE_CACHE/OSX' '--WITH-LDAP' '--With-OpenSSL' '--with-Perl' '- -with-python '' --With-TCL '' --with-Bonjour '' --With-Pam '' --enable-thread-sécurité '' '--with-libxml' '--with uuid = e2fs '' - Cela inclut =/opt/opt/local/actuel/Inclure/libxml2:/opt/local/actuel/comprend:/opt/local/actuel/Inclure/Security '' --DocDir =/mnt/hgfs/pginstaller .Pune/serveur/stadification_cache/OSX/DOC/PostgreSQL '' --with-Libxslt '' --With-Libedit-Preferred '' --with-gssapi '' CFLAGS = -IFYROOT /APPLICATIONS/XCODE.app/Contents/xcode.app/Contents/ Développeur/Plateformes/MacOSx.Platform/Developer/SDKS/MacOSX10.8.SDK -MMAcosx-Version-Min = 10.8 -Arch I386 -ARCH X86_64 -O2 '' LDFLAGS = -L/opt/opt/local/Current/LIBR = -I/opt/opt/local/actuel/Inclure '' ICU_LIBS = -L/opt/opt/local/actuel/LIB -LICUUC -LICUDATA -LICUI18N '

Comment signifie-t-on spécifier le ENCODING, LC_COLLATE, et LC_TYPE Pour utiliser le nouveau ICU Collations?

➠ Qu'est-ce que ICU Collation Noms vous suggéreriez pour les bases de données axées sur l'anglais? Pour les bases de données multilingues d'Europe occidentale?

➠ Quels sont les noms possibles ICU Collation Noms?

4
Basil Bourque

Notons d'abord que, au moment de cette réponse, PostgreSQL 10 dans Toujours en phase bêta. Certains problèmes concernant ICU Intégration et comment il est documenté sont encore en discussion, et il pourrait y avoir des modifications avant A GA version.

Comment fonctionne-t-on l'encodage, lc_collate et lc_type à utiliser le nouveau ICU Collations?

Ce n'est pas possible actuellement (et probablement pas suffisamment documenté, ou pas assez clairement dans le message d'erreur: quand il indique Nom locale non valide , cela signifie de la ensemble de locaux fournis par libc).
[.____] Ceci est discuté dans ce fil sur la liste de diffusion des développeurs: CAN ICU doit être utilisé pour la commande de tri par défaut de la base de données?

➠ Qu'est-ce que ICU Collation Noms vous suggéreriez pour les bases de données axées sur l'anglais? Pour les bases de données multilingues d'Europe occidentale?

Cela compte surtout si vous avez des exigences de tri spécifiques. Dans cet autre fil de la liste de diffusion:
[.____] ce que les utilisateurs peuvent faire avec Custom ICU Collations à Postgres 1
[.____] Certains exemples concrets sont donnés de ICU Collations se comporter de manière spécialement comparée à ce que Libc peut faire.

Lorsqu'il n'ayant pas besoin d'exigences spécifiques, je pense que la plupart des applications ne se soucient pas d'utiliser un ICU COLLATION ou UN LIBC en_US Collation, à l'exception de la portabilité. L'un des gros points de ICU est d'obtenir exactement la même commande sur tous les systèmes d'exploitation pour une locale donnée, ce qui n'est vraiment pas le cas de libc. Je suppose que le pré-créé en-x-icu irait bien pour l'anglais général et pour les langues européennes de l'Ouest, je ne suis pas sûr de la raison pour laquelle une collation serait meilleure que und-x-icu.

En tant que note latérale, ce n'est pas une bonne idée d'utiliser une autre collation que C lorsque vous ne vous souciez pas vraiment des règles de tri, car C comme une collision surperformera n'importe quelle langue. Collation consciente. Et C est portable entre les systèmes d'exploitation.

➠ Quels sont les noms possibles ICU Collation Noms?

Bien que initdb popule pg_collation Avec une liste de collations prédéfinies, une liste complète serait soumise à une explosion combinatoire, telles que ICU Les noms de collation sont formés en assemblant les balises, comme indiqué ici: http: //unicode.org/reports/tr35/tr35-Collation.html#setting_options =

Actuellement, le doc ne mentionne pas explicitement que vous pouvez faire:

CREATE COLLATION mycoll (locale='my-set-of-tags', provider='icu');

mais je pense que le travail se produit actuellement pour améliorer cela dans le doc.

Un autre problème qui pourrait être désigné comme indiqué est qu'il existe plusieurs ICU Versions majeures et la liste des collations prédéfinies que les instanciates initdb instanciates diffèrent de manière significative entre ces versions, Surtout ICU PRE-53 VERSUS POST-53. Cela a été mis en évidence dans une autre discussion: Rapport d'accident pour certaines valeurs de COLLATED et WORK_MEM d'ICU-52 (DEBIAN8)

EDIT: Dans la version bêta ou RC suivante, la liste de ICU Collations créée par InitDB changera de manière approfondie, comme indiqué dans la présente Discussion . La liste fera en itération sur ICU Locuments plutôt que des collations et, par conséquent, la question "Quel est le possible ICU?" devra être reconsidéré avec les nouvelles valeurs.

3
Daniel Vérité