Как конвертировать инструментальные средства mSQL в MySQL
Согласно нашему опыту, переделать такие инструментальные программы, как msql-tcl и msqljava , созданные на основе C API mSQL для работы с C API MySQL, несложно.
Сделать это можно так:
Пропустите исходный файл через сценарий оболочки msql2mysql . Для этого необходима программа replace , распространяющаяся вместе с MySQL Server.
Откомпилируйте.
Исправьте все найденные компилятором ошибки.
Различия между реализациями C API в mSQL и MySQL заключаются в следующем:
В качестве типа в MySQL используется структура MYSQL (в mSQL в этом качестве применяется int ).
Оператор mysql_connect() принимает в качестве параметра указатель на структуру MYSQL . Такую структуру можно легко объявить как глобальную или создать ее с помощью malloc() . Кроме того, mysql_connect() принимает еще два параметра, в которых указываются имя пользователя и его пароль. Для использования данной структуры по умолчанию этим параметрам нужно присвоить значения NULL , NULL .
mysql_error() принимает в качестве параметра структуру MYSQL . При переносе старого кода достаточно добавить параметр в вызов msql_error() .
Для всех ошибок MySQL возвращает номер ошибки и текстовое сообщение. mSQL же возвращает только текстовое сообщение об ошибке.
Существует некоторая несовместимость, обусловленная тем, что в MySQL Server можно создавать несколько соединений с сервером из одного и того же процесса.
Различия в клиент-серверных коммуникационных протоколах mSQL и MySQL
Различий здесь имеется более чем достаточно для того, чтобы поддержку обоих протоколов одновременно обеспечить было невозможно (или, по меньшей мере, очень сложно).
Ниже приведены наиболее заметные различия между коммуникационными протоколами MySQL и mSQL:
В буфере сообщения может находиться несколько столбцов результатов.
Буферы сообщений динамически увеличиваются, если запрос или результат не умещаются в их текущем объеме, ограничение на объем буфера устанавливается сервером и клиентом.
Все пакеты нумеруются, что позволяет обнаружить среди них повторяющиеся или пропуски.
Все значения столбцов отправляются в виде ASCII. Длины строк и столбцов посылаются в упакованном виде в двоичном виде (1, 2 или 3 байта).
MySQL может считывать результаты без буферизации (без необходимости сохранения всех данных в клиенте).
Если одна операция считывания/записи занимает более 30 секунд, сервер закрывает соединение.
Если соединение бездействует в течение 8 часов, сервер его закрывает.
Различия в синтаксисе SQL между mSQL 2.0 и MySQL
Типы столбцов
MySQL
Имеются следующие дополнительные типы (не считая остальных; see section 6.5.3 Синтаксис оператора CREATE TABLE ):
ENUM - тип для одного набора строк.
SET - тип для нескольких наборов строк.
BIGINT - тип для 64-битовых целых чисел.
Кроме того, MySQL поддерживает следующие атрибуты дополнительных типов:
UNSIGNED - опция для целочисленных столбцов и столбцов чисел с плавающей запятой.
ZEROFILL - опция для целочисленных столбцов.
AUTO_INCREMENT - опция для целочисленных столбцов, являющихся первичными ключами. See section 8.4.3.126 mysql_insert_id() .
DEFAULT - значение для всех столбцов.
mSQL2
Типы столбцов в mSQL соответствуют приведенным в таблице типам MySQL:
Тип в mSQL | Соответствующий тип в MySQL | CHAR(len) | CHAR(len) | TEXT(len) | TEXT(len) . len - максимальная длина. Работает LIKE . | INT | INT . Со множеством опций! | REAL | REAL . Или FLOAT . Имеются как 4-битовые, так и 8-битовые варианты. | UINT | INT UNSIGNED | DATE | DATE . Использует формат ANSI SQL, а не собственный формат mSQL. | TIME | TIME | MONEY | DECIMAL(12,2) . Значение с фиксированной точкой и двумя знаками после нее. |
Создание индексов
MySQL
Индексы могут указываться во время создания таблицы при помощи оператора CREATE TABLE .
mSQL
Индексы создаются после создания таблицы с помощью операторов CREATE INDEX .
Вставка уникального идентификатора в таблицу
MySQL
Для указания типа столбца достаточно использовать AUTO_INCREMENT . See section 8.4.3.126 mysql_insert_id() .
mSQL
Необходимо создать в таблице SEQUENCE и выбрать столбец _seq .
Получение уникального идентификатора для строки
MySQL
Следует добавить к таблице первичный или уникальный ключ и использовать его. Новое в версии 3.23.11: если ключ PRIMARY или UNIQUE состоит только из одного целочисленного столбца, к нему можно обращаться и как к _rowid .
mSQL
Следует использовать столбец _rowid . Нельзя забывать о том, что _rowid может, в зависимости от множества факторов, со временем измениться.
Получение времени последнего изменения столбца
MySQL
Нужно вставить в таблицу столбец TIMESTAMP . Этому столбцу автоматически присваиваются текущая дата и время при вызове операторов INSERT или UPDATE , если ему не присвоить определенного значения или присвоить значение NULL .
mSQL
Следует использовать столбец _timestamp .
Сравнение значений NULL
MySQL
MySQL соответствует стандарту ANSI SQL, поэтому сравнение с NULL всегда возвращает результат NULL .
mSQL
В mSQL выражение NULL = NULL имеет значение TRUE. Поэтому при переводе старого кода из mSQL в MySQL =NULL необходимо заменить на IS NULL , а <>NULL - на IS NOT NULL .
Сравнение строк
MySQL
Обычно сравнение строк проводится без учета регистра символов, с порядком сортировки, который определяется текущим набором символов (ISO-8859-1 Latin1 по умолчанию). Если вам это не подходит, необходимо установить при объявлении столбцов атрибут BINARY , тогда сравнение будет проводиться в соответствии с ASCII-порядком, установленным на сервере MySQL.
mSQL
Все сравнения строк проводятся с учетом регистра символов в ASCII-порядке сортировки.
Поиск без учета регистра символов
MySQL
LIKE может быть как чувствительным, так и нечувствительным к регистру оператором, в зависимости от столбцов, к которым он применяется. По возможности MySQL использует индексы, если аргумент LIKE не начинается с шаблонного символа.
mSQL
Следует использовать CLIKE .
Обработка концевых пробелов
MySQL
Все пробелы в конце столбцов CHAR и VARCHAR удаляются. Если такое поведение нежелательно, используйте столбцы TEXT .
mSQL
Концевые пробелы сохраняются.
Операторы WHERE
MySQL
MySQL правильно определяет приоритеты действий (AND имеет приоритет перед OR ). Заставить MySQL вести себя так, как mSQL, можно при помощи скобок (как можно видеть в соответствующем примере).
mSQL
Все действия производятся слева направо. А это значит, что некоторые логические вычисления, в которых наличествует более трех аргументов, не могут быть выполнены вообще. Кроме того, это означает, что при переносе в MySQL некоторые запросы необходимо менять. Это довольно просто сделать при помощи скобок. Возьмем, к примеру, следующий запрос mSQL:
mysql> SELECT * FROM table WHERE a=1 AND b=2 OR a=3 AND b=4;
Чтобы MySQL вычислил результат этого запроса так же, как это сделал бы mSQL, нужно расставить скобки:
mysql> SELECT * FROM table WHERE (a=1 AND (b=2 OR (a=3 AND (b=4))));
Ограничения доступа
MySQL
Для хранения привилегий для каждого пользователя, удаленного компьютера и базы имеются соответствующие таблицы. See section 4.2.6 Как работает система привилегий.
mSQL
Имеется файл "mSQL.acl", в котором можно определить привилегии чтения/записи для пользователей.
1 2 3 4
8 8 8
| |