Мигрируем с Microsoft Access и Microsoft SQL Server на MySQL

Для организаций сделать переход на свободный софт безболезненным может постепенное замещение используемых коммерческих программ их свободными кроссплатформными аналогами под Windows. После привыкания к свободному софту под Windows при переходе на Linux культурный шок будет минимальным. Начать можно например с СУБД т.к. ее мало кто видит :) Для поддержки MySQL в программе, работающей с Access или Microsoft SQL Server, необходимо учесть следующее...

Различия в синтаксисе SQL-запросов Access/MS SQL Server и MySQL

Если программа работает с Access или MS SQL Server, то для правильной работы со свободной базой данных MySQL необходимо поправить SQL-запросы следующим образом:

  • Эскейпинг названий полей и таблиц (если есть) заменяем с квадратных скобок [] на "обратные палочки" `` (это не одиночная кавычка!);
  • Формат даты меняем с 'm/d/yyyy' на 'yyyy-mm-dd'.

Для Access:

  • Тип поля COUNTER заменяем на INT AUTO_INCREMENT PRIMARY KEY или INT AUTO_INCREMENT UNIQUE KEY;
  • Тип поля LOGICAL заменяем на TINYINT(1);
  • Тип поля SHORT заменяем на SMALLINT;
  • Тип поля DATE заменяем на DATETIME;
  • Символ для обёртывания дат в запросах меняем с диеза # на одиночную кавычку '.

Для Microsoft SQL Server:

  • Тип поля INT IDENTITY заменяем на INT AUTO_INCREMENT PRIMARY KEY или INT AUTO_INCREMENT UNIQUE KEY;
  • Если версия MySQL < 5.0.3, то тип поля BIT заменяем на TINYINT(1);
  • Тип поля FLOAT заменяем на DOUBLE;
  • Тип поля VARCHAR с длинной более 255 заменяем на TEXT.

MySQL через ADO с помощью MyODBC

Если Access или MS SQL Server используется через ADO (Visual Basic, Delphi dbGo), то MySQL подключаем через коннектор MyODBC.

Используем строку подключения вида: "DRIVER={MySQL ODBC 3.51 Driver};SERVER=localhost;DATABASE=history;USER=root;stmt=set names cp1251;OPTION=10", читаем про остальные параметры коннектора MyODBC. Если при сохранении измененной записи появляется ошибка "Row cannot be located for updating. Some values may have been changed since it was last read (Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени последнего чтения)" то нужно установить параметр 2 (Return Matching Rows).

Далее читаем про особенности реализации курсоров и блокировок в MySQL+MyODBC. Курсор типа adOpenDynamic по умолчанию отключен из за тормознутости и включается параметром 32 (Enable Dynamic Cursor). RecordCount может не работать там, где он работал раньше, AUTO_INCREMENT поля после вставки записей не обновляются на клиенте сами. Можно попробовать установку свойства 'Update Resync' после открытия соединения, либо выполнять запрос SELECT LAST_INSERT_ID(), либо обновлять рекордсет.

Из за бага в MyODBC запросы с параметрами типа ftDateTime будут приходить в MySQL c нулевым временем, поэтому даты вставляем строками в формате "YYYY-MM-DD HH-NN-SS".

Там где через ADO был доступ к булевским полям или проверка их типов необходимо обращаться к ним как к целочисленным (0 - False, 1 - True) или проверять на тип ftSmallint.

Блог: RU Linux

ODBC-драйвер SELTA@Etersoft переписывает SQL-запросы к Microsoft SQL Server в понятный для свободной СУБД PostgreSQL вид.

Вообще то по лицензии использовать бесплатно MySql server можно только с web server apache.

MySQL можно использовать по лицензии GPL с любым софтом: http://www.mysql.com/about/legal/licensing/opensource-license.html

Очень надо

На текущий момент не удалось корректно связаться через АДО с МуСКЛ 5.1. Большую часть полей воспринимать отказывается. Нормально выдает числовые (целые) и Даты. Флоат не проверял. Текстовые и Мемо - ругается. При попытках установить связь в Акцесс с таблицами Мускула, Акцесс просто падает. Забил болт, пытаюсь разобраться с ZeosDBO и AnyDAC.