Donc, j'ai quelques serveurs Debian avec PostgreSQL dessus. Historiquement, ces serveurs et PostgreSQL sont localisés avec le jeu de caractères Latin 9 et à l'époque c'était bien. Maintenant, nous devons gérer des choses comme le polonais, le grec ou le chinois, donc le changer devient un problème croissant.
Lorsque j'ai essayé de créer une base de données UTF8, j'ai reçu le message:
ERREUR: l'encodage UTF8 ne correspond pas aux paramètres régionaux fr_FR Détail: le paramètre LC_CTYPE choisi nécessite l'encodage LATIN9.
À quelques reprises, j'ai fait des recherches sur le sujet avec mon ancien copain Google, et tout ce que j'ai pu trouver était des procédures trop compliquées comme la mise à jour de Debian LANG
, la recompilation de PostgreSQL avec le jeu de caractères correct, l'édition de toutes les LC_
variables système et d'autres solutions obscures. Donc pour l'instant, nous laissons cette question de côté.
Récemment, il est revenu, les Grecs veulent le truc et le Latin 9 ne veut pas. Et pendant que j'examinais à nouveau cette question, un collègue est venu me voir et m'a dit: «Non, c'est facile, regardez.»
Il n'a rien édité, n'a pas fait de tours de magie, il a juste fait cette requête SQL:
CREATE DATABASE my_utf8_db
WITH ENCODING='UTF8'
OWNER=admin
TEMPLATE=template0
LC_COLLATE='C'
LC_CTYPE='C'
CONNECTION LIMIT=-1
TABLESPACE=pg_default;
Et cela a bien fonctionné.
En fait, je ne savais pas LC_CTYPE='C'
et j'étais surpris que l'utilisation de ce n'était pas sur les premières solutions sur Google et même sur Stack Overflow. J'ai regardé autour de moi et je n'ai trouvé qu'une mention sur la documentation PostgreSQL.
Lorsque LC_CTYPE est C ou POSIX, tout jeu de caractères est autorisé, mais pour les autres paramètres de LC_CTYPE, il n'y a qu'un seul jeu de caractères qui fonctionnera correctement. Étant donné que le paramètre LC_CTYPE est figé par initdb, la flexibilité apparente d'utiliser différents codages dans différentes bases de données d'un cluster est plus théorique que réelle, sauf lorsque vous sélectionnez les paramètres régionaux C ou POSIX (désactivant ainsi toute prise de conscience des paramètres régionaux réels).
Alors ça m'a fait me demander, c'est trop facile, trop parfait, quels sont les inconvénients? Et j'ai encore du mal à trouver une réponse. Alors là je viens poster ici:
tl; dr: Quels sont les inconvénients de l'utilisation LC_CTYPE='C'
sur une localisation spécifique? Est-ce mauvais de le faire? À quoi dois-je m'attendre pour casser?
la source
collate "C"
after theorder by
. C'est à vous de déterminer si et où votre application en a besoin. La plupart des applications ne se soucient pas vraiment.COLLATE
spécificateur différent de celui de la base de données.En référence à la réponse acceptée par Daniel à propos du tri à l'aide de classements, veuillez noter que si vous exécutez PostgreSQL sur un Mac, votre classement préféré peut ne pas fonctionner comme prévu en raison de paramètres inadéquats pour certains classements au niveau du système d'exploitation. Vous pouvez en savoir plus sur le problème ici:
http://www.postgresql.org/message-id/[email protected]
Ce n'est pas un problème spécifique à PostgreSQL, en particulier, mais plutôt un problème avec la configuration par défaut de Mac pour les paramètres de classement. Mon système actuel exécute PostgreSQL 9.3 sur OS X El Capitan version 10.11 et souffre de ce problème. Mon système renvoie les mêmes résultats de requête, que j'utilise le classement «fr_FR» ou «en_US». Par exemple:
Utilisation du classement «fr_FR»:
Utilisation du classement «en_US»:
Sur mon système, les paramètres de classement (au niveau du système d'exploitation) sont les mêmes pour «fr_FR» et «en_US» comme démontré dans le shell en exécutant diff:
J'espère que ces informations supplémentaires seront utiles à toute personne lisant ceci qui utilise PostgreSQL sur un Mac qui souffre de ce problème.
la source