Quindi, ho pochi server Debian con PostgreSQL su di esso. Storicamente, quei server e PostgreSQL sono localizzati con il set di caratteri Latin 9 e allora andava bene. Ora dobbiamo gestire cose come il polacco, il greco o il cinese, quindi cambiarlo diventa un problema crescente.
Quando ho provato a creare un database UTF8, ho ricevuto il messaggio:
ERRORE: la codifica UTF8 non corrisponde alla locale fr_FR Dettaglio: L'impostazione LC_CTYPE scelta richiede la codifica LATIN9.
Poche volte ho fatto qualche ricerca sull'argomento con il mio vecchio amico Google, e tutto ciò che ho potuto trovare sono state procedure troppo complicate come l'aggiornamento di Debian LANG
, ricompilare PostgreSQL con il set di caratteri corretto, modificando tutte le LC_
variabili di sistema e altre soluzioni oscure. Quindi, per il momento, lasciamo da parte questo problema.
Di recente, è tornato di nuovo, i greci vogliono le cose e i latini 9 non vogliono. E mentre stavo esaminando di nuovo questo problema, un collega viene da me e mi dice "No, è facile, guarda."
Non ha modificato nulla, non ha fatto trucchi magici, ha solo fatto questa query 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;
E ha funzionato bene.
In realtà non lo sapevo LC_CTYPE='C'
e sono rimasto sorpreso dal fatto che l'utilizzo di questo non fosse sulle prime soluzioni su Google e nemmeno su StackTranslate.it. Mi sono guardato intorno e ho trovato solo una menzione nella documentazione di PostgreSQL.
Quando LC_CTYPE è C o POSIX, è consentito qualsiasi set di caratteri, ma per altre impostazioni di LC_CTYPE esiste un solo set di caratteri che funzionerà correttamente. Poiché l'impostazione LC_CTYPE è bloccata da initdb, la flessibilità apparente di utilizzare codifiche diverse in database diversi di un cluster è più teorica che reale, tranne quando si seleziona la localizzazione C o POSIX (disabilitando in tal modo qualsiasi consapevolezza della locale reale).
Quindi mi sono meravigliato, è troppo facile, troppo perfetto, quali sono gli svantaggi? E faccio fatica a trovare una risposta. Quindi qui vengo a pubblicare qui:
tl; dr: quali sono gli svantaggi dell'utilizzo LC_CTYPE='C'
rispetto a una localizzazione specifica? È male farlo? Cosa dovrei aspettarmi di rompere?