RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
YandexMoney: 
41001198119846 
E-gold:
5128052

4.6 Локализация и интернационализация MySQL

4.6.1 Набор символов, используемый для данных и сортировки

По умолчанию MySQL использует набор символов ISO-8859-1 (Latin1) с сортировкой согласно шведскому и финскому языкам. Это набор символов, подходящий в США и Западной Европе.

Все стандартные программы MySQL компилируются с поддержкой --with-extra-charsets=complex. Это добавляет код ко всем стандартным программам, чтобы они были способны обработать latin1 и все многобайтные наборы символов. Другие наборы символов будут загружены из файла определения набора символов тогда, когда это будет необходимо.

Набор символов определяет то, какие символы позволяются в именах, и в каком порядке сортируются инструкции ORDER BY и GROUP BY в операторе выполнения запроса SELECT.

Вы можете менять набор символов опцией --default-character-set при запуске сервера. Наборы символов доступны в зависимости от опций --with-charset=charset и --with-extra-charset=list-of-charset|complex|all в файле configure и файлах конфигурации набора символов, перечисленных в SHAREDIR/charsets/Index. Подробности в разделе "2.3.3 Типичные опции configure ".

Если Вы изменяете набор символов при работе MySQL (это может изменять порядок сортировки), Вы должны выполнить myisamchk -r -q на всех таблицах. Иначе Ваши индексы нельзя упорядочивать правильно.

Когда пользователь соединяется с сервером MySQL, тот посылает заданный по умолчанию набор символов пользователю.

Нужно использовать mysql_real_escape_string() при выходе из строк для запроса SQL. mysql_real_escape_string() идентичен старой функции mysql_escape_string(), за исключением того, что требуется дескриптор подключения MYSQL как первый параметр.

Если клиент компилируется с другими путями, чем те, где сервер установлен, и администратор, который конфигурировал MySQL, не включал все наборы символов в двоичный файл MySQL, нужно определить для клиента, где он сможет находить дополнительные наборы символов, а это будет требоваться, если сервер выполняется с другим набором символов.

Можно определять это, включая в файл опции MySQL:

[client]
character-sets-dir=/usr/local/mysql/share/mysql/charsets

Где path указывает на то, где сохранены динамические наборы символов MySQL. Можно вынуждать клиента использовать специфический набор символов:

[client]
default-character-set=character-set-name

Но обычно этого не требуется.

4.6.2 Сообщения об ошибках не на английском

mysqld может выдавать сообщения об ошибках на следующих языках: Czech, Danish, Dutch, English (по умолчанию), Estonian, French, German, Greek, Hungarian, Italian, Japanese, Korean, Norwegian, Norwegian-ny, Polish, Portuguese, Romanian, Russian, Slovak, Spanish и Swedish.

Чтобы запустить mysqld для специфического языка, используйте параметр --language=lang или -L lang. Например:

shell> mysqld --language=swedish

или:

shell> mysqld --language=/usr/local/share/swedish

Обратите внимание, что все имена языка определены в нижнем регистре.

Файлы языка размещены (по умолчанию) в каталоге `mysql_base_dir/share/ЯЗЫК'.

Чтобы модифицировать файл сообщений об ошибках, Вы должны редактировать файл errmsg.txt и выполнить следующую команду, чтобы генерировать новую версию файла errmsg.sys:

shell> comp_err errmsg.txt errmsg.sys

Если Вы обновляете версию MySQL, не забудьте повторить Ваши изменения с новым файлом `errmsg.txt'.

4.6.3 Добавление нового набора символов

Чтобы добавить другой набор символов к MySQL, используйте следующую процедуру.

Решите, является ли набор простым или сложным. Если набор символов не должен использовать специальную строку, сопоставляющую подпрограммы для сортировки, и не нуждается в поддержке многобайтных символов, он простой. Если требуется любое из этих свойств, набор считается сложным.

Например, latin1 и danish простые, а вот big5 или czech сложные наборы символов.

В следующем разделе я предположил, что Вы называете Ваш набор символов MYSET.

Для простого набора символов делают следующее:

  1. Добавьте MYSET к концу файла sql/share/charsets/Index. Назначьте новому набору уникальный код.
  2. Создайте файл sql/share/charsets/MYSET.conf. Вы можете использовать sql/share/charsets/latin1.conf как базу для этого. Синтаксис для файла очень простой:
    • Комментарии начинаются с символа # и действуют до конца строки.
    • Слова отделяются произвольными количествами пробелов.
    • При определении набора символов, каждое слово должно быть пронумеровано обязательно в шестнадцатеричном формате
    • Массив ctype принимает первые 257 слов. После этого массивы to_lower, to_upper и sort_order берут по 256 слов каждый.
    Подробности в разделе "4.6.4 Массивы определения символов".
  3. Добавьте имя набора символов к CHARSETS_AVAILABLE и спискам COMPILED_CHARSETS в configure.in.
  4. Реконфигурируйте, перекомпилируйте и посмотрите, что получилось.

Для сложного набора символов делают следующее:

  1. Создайте файл strings/ctype-MYSET.c в каталоге исходников.
  2. Добавьте MYSET к концу файла sql/share/charsets/Index. Назначьте новому набору уникальный код.
  3. Рассмотрите один из существующих файлов ctype-*.c, чтобы увидеть, какие потребности определены, например, strings/ctype-big5.c. Обратите внимание, что массивы в Вашем файле должны иметь имена подобно ctype_MYSET, to_lower_MYSET и так далее. Это соответствует массивам в простом наборе символов.
  4. Ближе к верхней части файла, поместите специальный комментарий подобно:
    /*
     * This comment is parsed by configure to create ctype.c,
     * so don't change it unless you know what you are doing.
     *
     * .configure. number_MYSET=MYNUMBER
     * .configure. strxfrm_multiply_MYSET=N
     * .configure. mbmaxlen_MYSET=N
     */
    
    Программа выбора конфигурации configure использует этот комментарий, чтобы автоматически включить набор символов в библиотеку MySQL. Параметры-строки strxfrm_multiply и mbmaxlen будут подробно объясняться в следующих разделах. Включите их только, если нужны строка, сопоставляющая функции сортировки, или функция многобайтного набора символов соответственно.
  5. Вы должны затем создать некоторые из следующих функций:
    • my_strncoll_MYSET()
    • my_strcoll_MYSET()
    • my_strxfrm_MYSET()
    • my_like_range_MYSET()
    Подробности в разделе "4.6.5 Поддержка сортировки строк".
  6. Добавьте имя набора символов к CHARSETS_AVAILABLE и спискам COMPILED_CHARSETS в файле configure.in.
  7. Реконфигурируйте, перекомпилируйте и посмотрите, что получилось.

Файл sql/share/charsets/README включает дополнительные команды.

Если Вы хотите иметь набор символов, включенный в дистрибутив MySQL, отправьте по почте заплатку на internals@lists.mysql.com.

4.6.4 Массивы определения символов

to_lower[] и to_upper[] представляют собой простые массивы, которые хранят символы нижнего и верхнего регистров, соответствующие каждому члену набора символов. Например:

to_lower['A'] should contain 'a'
to_upper['a'] should contain 'A'

Массив sort_order[] представляет собой карту, указывающую, как символы нужно упорядочивать для целей сортировки и сравнения. Для многих наборов символов это то же самое, что и to_upper[] (что означает: сортировать, не учитывая регистр). MySQL сортирует символы, основанные на значении sort_order[character]. Для более сложных правил сортировки изучите обсуждение сопоставления строк ниже. Подробности в разделе "4.6.5 Сопоставление строк ".

ctype[] представляет собой массив разрядных значений, с одним элементом для одного символа. Обратите внимание, что массивы to_lower[], to_upper[] и sort_order[] индексированы символьным значением, но ctype[] индексирован символьным значением+1. Это старое наследство, чтобы обработать EOF.

Вы можете находить следующие определения bitmask в m_ctype.h:

#define _U 01   /* Uppercase */
#define _L 02   /* Lowercase */
#define _N 04   /* Numeral (digit) */
#define _S 010  /* Spacing character */
#define _P 020  /* Punctuation */
#define _C 040  /* Control character */
#define _B 0100 /* Blank */
#define _X 0200 /* heXadecimal digit */

Запись в ctype[] для каждого символа должна быть объединением применимых значений bitmask, которые описывают символ. Например, 'A' представляет собой символ верхнего регистра (_U) также как шестнадцатеричная цифра (_X), так что ctype['A'+1] должен содержать значение:

_U + _X = 01 + 0200 = 0201

4.6.5 Сопоставление строк

Если правила сортировки для Вашего языка слишком сложны, чтобы быть обработанными таблицей sort_order[], Вы должны использовать строку, сопоставляющую функции.

Сейчас самая лучшая документация по этому вопросу, это наборы символов, которые уже выполнены. Рассмотрите наборы символов big5, czech, gbk, sjis и tis160 для примеров.

Вы должны определить значение strxfrm_multiply_MYSET=N в специальном комментарии наверху файла. N должен быть установлен к максимальному коэффициенту роста строки в ходе выполнения my_strxfrm_MYSET (это должно быть положительное целое число).

4.6.6 Поддержка многобайтных символов

Если нужно добавить поддержку для нового набора символов, который включает многобайтные символы, Вы должны использовать функции многобайтных символов.

Сейчас самая лучшая документация по этому вопросу, это наборы символов, которые уже выполнены. Рассмотрите наборы символов euc_kr, gb2312, gbk, sjis и ujis для примеров. Они выполнены в файлах ctype-'charset'.c в каталоге strings.

Вы должны определить значение mbmaxlen_MYSET=N в специальном комментарии наверху исходного файла. N должен быть установлен в размер в байтах самого большого символа в наборе.

Поиск

 

Найди своих коллег!