Опубликован: 16.04.2007 | Уровень: специалист | Доступ: платный
Лекция 13:

Расширение возможностей

< Лекция 12 || Лекция 13: 123

Создание наборов символов

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

# конфигурационный файл для набора символов latinl.
# массив ctype{} (должен содержать 257 элементов).

  00 20 20  20  20  20  20  20  20  20  28  28  28  28  28  28  20  
20 20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20
48  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10
... ... ... ...
02  02  02  02  02  02  02  02  02  02  02  02  02  02  02  02  02
02  02  02  02  02  02  02  02  02  02  02  02  02  02  02  02  02

# Массив to lower (должен содержать 256 элементов).

00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F
10  11  12  13  14  15  16  17  18  19  1A  1B  1C  1D  1E  1F
... ... ... ...
E0  E1  E2  E3  E4  E5  E6  E7  E8  E9  EA  EB  EC  ED  EE  EF
F0  F1  F2  F3  F4  F5  F6  F7  F8  F9  FA  FB  FC  FD  FE  FF

# Массив to upper (должен содержать 256 элементов).

00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F
10  11  12  13  14  15  16  17  18  19  1A  1B  1C  1D  1E  1F
... ... ... ...
E0  E1  E2  E3  E4  E5  E6  E7  E8  E9  EA  EB  EC  ED  EE  EF
D0  D1  D2  D3  D4  D5  D6  F7  D8  D9  DA  DB  DC  DD  DE  FF

# Массив sort order (должен содержать 256 элементов).

00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F
10  11  12  13  14  15  16  17  18  19  1A  1B  1C  1D  1E  1F
... ... ... ...
41  41  41  41  5C  5B  5C  43  45  45  45  45  49  49  49  49
44  4E  4F  4F  4F  4F  5D  F7  D8  55  55  55  59  59  DE  FF

Десятичное значение 	Шестнадцатеричное значение 	Описание 

1				0х01					прописная буква
2				0х02					строчная буква
4				0х04					цифра
8				0х08					символ пробела
16				0х10					знак пунктуации
32				0х20					управляющий символ
64				0х40					пусто
128				0х80					шестнадцатеричная цифра
Листинг 13.2.

Вторая группа значений представляет собой таблицу ASCII, предназначенную для перевода символов в нижний регистр. Например, символ в позиции 0x41 — это прописная буква "A", но ей соответствует значение 0x61, т.е. строчная "a". Третья группа значений определяет таблицу ASCII для перевода символов в верхний регистр. Последняя таблица задает порядок сортировки и обычно совпадает с третьей таблицей.

Если истинный порядок сортировки невозможно отразить в столь простой таблице, то необходимо написать специальные функции сортировки. Для этого нужно создать файл в каталоге strings дерева MySQL. Здесь же находятся файлы всех остальных наборов символов, например, ctype_big5.c. Программа MySQL ищет в этом файле пять функций и четыре массива. Имена всех функций и массивов включают стандартный префикс и название набора. В листинге 13.3 показаны прототипы функций и определения массивов для набора символов big5.

uchar NEAR ctype big5{257}
uchar NEAR to lower big5{}
uchar NEAR to upper{257}
uchar NEAR sort order big5{257}

my bool my like range big5(
	const char *ptr,
	uint ptr length,
	pchar escape,
	uint ers length,
	char *min str,
	char *max str,
	uint *min length,
	uint *max length)

int my strcoll big5(
	const uchar * s1,
	const uchar * s2)

int my strnncoll big5(
	const uchar * s1,
	int len1,
	const uchar * s2
	int len2)

int my strnxfrm big5(
	uchar * dest,
	uchar * src,
	int len,
	int srclen)

int my strxfrm big5(
	uchar * dest,
	uchar * src,
	int len)
Листинг 13.3.

Четыре функции осуществляют сравнение строк. Функция с префиксом my like range находит наименьшую и наибольшую строки (с учетом реестра), соответствующие выражению в операторе LIKE. Само выражение передается в аргументе ptr. Аргумент ptr length определяет длину выражения. Содержимое наименьшей и наибольшей строк заносится в аргументы min str и max str соответственно.

Функции с префиксами my strcoll и my strncoll служат аналогами обычных функций strcoll() и strncoll() языка С, которые, в свою очередь, являются версиями функций strcmp и strncmp, учитывающими региональные установки. Функции с префиксами my strxfrn и my strnxfrn эмулируют стандартные функции strxfrn() и strnxfrn(). Получить о них более подробную информацию можно в man файлах UNIX.

В начало файла нужно добавить комментарий, подобный тому, что показан в листинге 13.4. На основании строк, приведенных в комментарии, сценарий configure включает набор символов в клиентскую библиотеку. Переменная strxfrn multiply набор задается в том случае, когда у набора символов есть свои функции сортировки строк. Она определяет максимальный коэффициент удлинения строки при ее прохождении через функцию с префиксом my strxfrm. Как следует из листинга, строки в кодировке big5 не растягиваются.

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

/*
  Эти строки анализируются сценарием configure при создании файла 
  ctype.c, поэтому не меняйте их без веских оснований.

  .configure. strxfrm multiply big5=1
  .configure. mbmaxlen big5=2
/*
Листинг 13.4.

Все, что осталось теперь сделать, — это добавить имя набора в списки CHARSETS AVAILABLE и COMPILED CHARSETS в файле configure.ini и перекомпилировать программу. Активизировать доступные наборы символов можно с помощью опций командной строки, конфигурационного файла или SQL инструкций.

< Лекция 12 || Лекция 13: 123
Александра Каева
Александра Каева
Дмитрий Черепенин
Дмитрий Черепенин

Какого года данный курс?

Евгений Вершинин
Евгений Вершинин
Россия, Нижний Новгород, Нижегородский государственный технический университет, 2008
Aleksandr Arshinskyi
Aleksandr Arshinskyi
Россия