Отже, у мене декілька серверів Debian з PostgreSQL на ньому. Історично склалося, що ці сервери та PostgreSQL локалізовані з діаграмою Latin 9 і тоді це було добре. Тепер ми маємо поводитися з такими речами, як польська, грецька чи китайська, тому зміна цього питання стає все більшою проблемою.
Коли я спробував створити базу даних UTF8, я отримав повідомлення:
ПОМИЛКА: кодування UTF8 не відповідає локалі fr_FR Детальніше: Вибране налаштування LC_CTYPE вимагає кодування LATIN9.
Кілька разів я робив кілька досліджень на цю тему зі своїм старим партнером Google, і все, що я міг знайти, - це кілька надскладних процедур, таких як оновлення Debian LANG
, перекомпіляція PostgreSQL з правильним набором, редагування всіх LC_
системних змінних та інших незрозумілих рішень. Тож поки що це питання ми відкидаємо.
Нещодавно він знову повернувся, греки хочуть цього матеріалу, а латинська 9 не хоче. І коли я ще раз переглядав це питання, один колега підійшов до мене і сказав: «Ну, легко, дивись».
Він нічого не редагував, не робив магічних трюків, просто робив цей 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;
І це спрацювало чудово.
Я насправді не знав про це, LC_CTYPE='C'
і мене здивувало, що використання цього не було в перших рішеннях в Google і навіть у стеці Overflow. Я озирнувся і знайшов згадку лише в документації PostgreSQL.
Якщо LC_CTYPE дорівнює C або POSIX, будь-який набір символів дозволений, але для інших налаштувань LC_CTYPE існує лише один набір символів, який буде працювати правильно. Оскільки параметр LC_CTYPE заморожено initdb, очевидна гнучкість використання різних кодувань у різних базах даних кластеру є більш теоретичною, ніж реальною, за винятком випадків, коли ви вибираєте C або POSIX-локаль (тим самим вимикаючи будь-яку реальну інформацію про локаль).
Тож мене змусило задуматися, це занадто легко, занадто досконало, які недоліки? І мені ще важко знайти відповідь. Тож ось я приходжу дописи тут:
tl; dr: Які недоліки використання LC_CTYPE='C'
у певній локалізації? Чи погано це робити? Що я повинен розраховувати на розрив?