postgresql 6.5.1 multi-byte (MB) support README July 11 1999 Tatsuo Ishii t-ishii@sra.co.jp http://www.sra.co.jp/people/t-ishii/PostgreSQL/ Перевод выполнил Юрий Козлов, очень рад замечаниям по адресу off@tsinet.ru. Чтв Ноя 18 19:09:53 MSK 1999 Сергиев-Посадская LUG spslug.sposad.ru 0. Введение MB поддержка предназначена для того чтобы позволить PostgreSQL обработку мультисимвольных наборов, таких как EUC(Расширенный код Unix), Unicode и Гибрид внутреннего кода(Mule internal code). С разрешенной MB ты можешь использовать мультисимвольные наборы в regexp, LIKE и некоторых других функциях. Выбор системной кодировки по умолчанию определяется во время инициализации установки PostgreSQL с помощью initdb(1). Заметим, что это можно переделать, во время создания базы данных используя createdb(1) или команду SQL create database. Таким образом можно иметь множество баз данных с различными системами кодировки. MB также решает некоторые проблемы относительно 8-битовых однобайтовых наборов символов, включая ISO8859. (Я не говорю, что все проблемы были решены. Я только подтверждаю, что регрессивные тесты отрабатывают прекрасно и с патчем можно использовать некоторые французские символы. Пожалуйста, дай мне знать, если ты найдешь хоть какую проблему с использованием 8-битных символов) 1. Как использовать запусти configure с опцией mb: % configure --with-mb=encoding_system где encoding_system один из: SQL_ASCII ASCII EUC_JP Японский EUC EUC_CN Китайский EUC EUC_KR Корейский EUC EUC_TW Тайваньский EUC UNICODE Unicode(UTF-8) MULE_INTERNAL Внутренний гибрид LATIN1 ISO 8859-1 English и некоторые европейские языки LATIN2 ISO 8859-2 English и некоторые европейские языки LATIN3 ISO 8859-3 English и некоторые европейские языки LATIN4 ISO 8859-4 English и некоторые европейские языки LATIN5 ISO 8859-5 English и некоторые европейские языки KOI8 KOI8-R WIN Windows CP1251 ALT Windows CP866 Пример: % configure --with-mb=EUC_JP Если MB запрещена, то ничего не изменится, за исключением лучшей поддержки для 8-битных однобайтовых наборов символов. 2. Как установить кодировку команда initdb определяет кодировку по умолчанию для установки PostgreSQL. Например: % initdb -e EUC_JP устанавливает кодировку по умолчанию EUC_JP(Расширенный код Unix для Японии). Заметим, что ты можешь использовать "-pgencoding" вместо "-e", если тебе нравятся длинные строковые опции:-) Если не заданы опции -e или -pgencoding, то используется кодировка, указанная при компиляции. Ты можешь создать базу данных с другой кодировкой. % createdb -E EUC_KR korean создает базу данных под названием "korean" с кодировкой EUC_KR. Другим путем выполнения этого же это использовать команду SQL: CREATE DATABASE korean WITH ENCODING = 'EUC_KR'; Кодировка базы данных представляется в столбце "encoding" в системном каталоге pg_database. datname |datdba|encoding|datpath -------------+------+--------+------------- template1 | 1739| 1|template1 postgres | 1739| 0|postgres euc_jp | 1739| 1|euc_jp euc_kr | 1739| 3|euc_kr euc_cn | 1739| 2|euc_cn unicode | 1739| 5|unicode mule_internal| 1739| 6|mule_internal Номер в столбце encoding это "id кодировки" и может быть переведен в название кодировки с помощью команды pg_encoding. $ pg_encoding 1 EUC_JP Если аргумент pg_encoding не число, то считается за название кодировки и pg_encoding вернет id кодировки. $ pg_encoding EUC_JP 1 3. PGCLIENTENCODING Если определена переменная среды PGCLIENTENCODING в клиенте, то сервером выполняется автоматическая перекодировка. Например, если сервер компилировался с MB=EUC_JP и PGCLIENTENCODING=SJIS(Shift JIS: другая японская система кодирования), то любая строка SJIS, поступающая от клиента будет переведена в EUC_JP перед тем как передаться разборщику. Вывод из сервера будет конечно переводиться в в SJIS. Поддерживаемые кодировки для PGCLIENTENCODING: SQL_ASCII ASCII EUC_JP Японский EUC SJIS Еще одна японская кодировка EUC_CN Китайский EUC EUC_KR Корейский EUC EUC_TW Тайваньский EUC BIG5 Традиционная китайская MULE_INTERNAL Внутренний гибрид LATIN1 ISO 8859-1 English и некоторые европейские языки LATIN2 ISO 8859-2 English и некоторые европейские языки LATIN3 ISO 8859-3 English и некоторые европейские языки LATIN4 ISO 8859-4 English и некоторые европейские языки LATIN5 ISO 8859-5 English и некоторые европейские языки KOI8 KOI8-R WIN Windows CP1251 ALT Windows CP866 WIN1250 Windows CP1250 (Czech) Заметим, что UNICODE не поддерживается(пока). Также заметим, что перевод не всегда возможен. Допустим, если ты выбрал EUC_JP для сервера, LATIN1 для клиента, то некоторые японские символы не могут быть переведены в латинские. В этом случае, символ, которые нельзя представить в латинском символьном наборе, будет преобразован как: (HEXA DECIMAL) 3. Команда SET CLIENT_ENCODING TO Фактическая установка информации о кодировке клиента выполняется новой командой: SET CLIENT_ENCODING TO 'encoding'; где encoding одна из кодировок, которая может быть установлена в PGCLIENTENCODING. Также для этой цели можно использовать синтаксис SQL92 "SET NAMES": SET NAMES 'encoding'; Запросить текущую клиентскую кодировку: SHOW CLIENT_ENCODING; Вернуться к кодировке по умолчанию: RESET CLIENT_ENCODING; Это приведет к сбросу клиентской кодировки в ту же что и на сервере, так что трансляция кодировок выполняться не будет. 4. Ссылки Вот хорошие источники чтобы начать изучать различные характеристики систем кодирования. ftp://ftp.ora.com/pub/examples/nutshell/ujip/doc/cjk.inf Подробно объясняются EUC_JP, EUC_CN, EUC_KR, EUC_TW, показанные в разделе 3.2. Unicode: http://www.unicode.org/ Домашняя страница UNICODE. RFC 2044 Здесь определен UTF-8. 5. История July 11, 1999 * Add support for WIN1250 (Windows Czech) as a client encoding (contributed by Pavel Behal) * fix some compiler warnings (contributed by Tomoaki Nishiyama) Mar 23, 1999 * Add support for KOI8(KOI8-R), WIN(CP1251), ALT(CP866) (thanks Oleg Broytmann for testing) * Fix problem with MB and locale Jan 26, 1999 * Add support for Big5 for fronend encoding (you need to create a database with EUC_TW to use Big5) * Add regression test case for EUC_TW (contributed by Jonah Kuo ) Dec 15, 1998 * Bugs related to SQL_ASCII support fixed Nov 5, 1998 * 6.4 release. In this version, pg_database has "encoding" column that represents the database encoding Jul 22, 1998 * determine encoding at initdb/createdb rather than compile time * support for PGCLIENTENCODING when issuing COPY command * support for SQL92 syntax "SET NAMES" * support for LATIN2-5 * add UNICODE regression test case * new test suite for MB * clean up source files Jun 5, 1998 * add support for the encoding translation between the backend and the frontend * new command SET CLIENT_ENCODING etc. added * add support for LATIN1 character set * enhance 8 bit cleaness April 21, 1998 some enhancements/fixes * character_length(), position(), substring() are now aware of multi-byte characters * add octet_length() * add --with-mb option to configure * new regression tests for EUC_KR (contributed by "Soonmyung. Hong" ) * add some test cases to the EUC_JP regression test * fix problem in regress/regress.sh in case of System V * fix toupper(), tolower() to handle 8bit chars Mar 25, 1998 MB PL2 is incorporated into PostgreSQL 6.3.1 Mar 10, 1998 PL2 released * add regression test for EUC_JP, EUC_CN and MULE_INTERNAL * add an English document (this file) * fix problems concerning 8-bit single byte characters Mar 1, 1998 PL1 released Приложение: [Вот хорошая документация, объясняющая, как использовать WIN1250 на Windows/ODBC от Pavel Behal. Заметим, что установочный шаг 1) не нужен в 6.5.1 -- Tatsuo] Версия: 0.91 for PgSQL 6.5 Автор: Pavel Behal Исправления: Tatsuo Ishii Email: behal@opf.slu.cz Лицензия: Как у PostgreSQL Извините за английский и C, не мои родные :-) !!!!!!!!!!!!!!!!!!!!!!!!! НИКАКИХ ГАРАНТИЙ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Установка: ------------ 1) Измени три влияющих файла в исходных каталогах (У меня не времени создавать правильный diff патч, я не знаю как) 2) Скомпилируй с поддержкой локали и мультисимвольным набором LATIN2 3) Правильно настрой установку, не забудь создать переменные локали в своем profile (среде). Например. (может быть не везде верен): LC_ALL=cs_CZ.ISO8859-2 LC_COLLATE=cs_CZ.ISO8859-2 LC_CTYPE=cs_CZ.ISO8859-2 LC_MONETARY=cs_CZ.ISO8859-2 LC_NUMERIC=cs_CZ.ISO8859-2 LC_TIME=cs_CZ.ISO8859-2 4) Нужно запускать postmaster с установленной локалью! 5) Попробуй чешский язык, с имеет сортировку 5) Установки ODBC драйвер для PgSQL в M$ Windows 6) Правильно задай исходные данные. Включи эту строку в конфигурационном диалоге ODBC в поле "Connect Settings:" : SET CLIENT_ENCODING = 'WIN1250'; 7) Теперь попробуй еще раз, но в Windows с ODBC. Описание: ------------ - Зависит от правильности системной локали, тестировалось на RH6.0 и Slackware 3.6, с локалью cs_CZ.iso8859-2 - Никогда не пытайся правильно настроить сервер с мультисимвольной кодировкой WIN1250, вместо нее всегда используй LATIN2. Это не локаль WIN1250 в Unix - Кодировка WIN1250 используется только для клиентов M$W ODBC. Символы перекодируются на лету, правильно отображаются и возвращаются обратно Важно: ---------- - это изменяет порядок сортировки в зависимости от установки LC_..., так что не смущайтесь регрессивными тестами, они не используют локаль - "ch" правильно сортируется только некоторых новых локалях (Например, RH6.0) - можно вставлять деньги как '162,50' (с запятой и в апострофах!) - хорошо не тестировалось