Алекс Кочис, старший менеджер по продуктам «Программы добавленной стоимости Windows Genuine», написал в блоге, что к ошибке привела человеческая ошибка. Алекс сказал, что новое программное обеспечение было случайно загружено на сервер, на котором работает WGA. В результате сервер не может работать. работают нормально, и разумные заявки от реальных пользователей программного обеспечения не могут быть обработаны правильно. Базой данных, используемой клиентами, является MySQL, а разработанные продукты поддерживают Oracle. Чтобы клиенты могли платить за нее, мы должны изменить среду базы данных с Oracle на MySQL. В процессе преобразования мы столкнулись со следующими проблемами и надеемся предоставить рекомендации коллегам, столкнувшимся с той же проблемой. Если мы уделяем внимание переносимости базы данных во время первоначального процесса проектирования и кодирования, в этом случае нет необходимости выполнять какую-либо дополнительную работу.
1. Проблемы, возникающие при переходе среды базы данных с Oracle на MySQL.
Поскольку логика остается неизменной, принцип состоит в том, чтобы не менять код приложения, а только sql создания/инициализации таблицы базы данных. Ниже представлены проблемы, с которыми мы столкнулись, и их решения.
1. Различия с учетом регистра (если ОС сервера — Linux).
Oracle обычно не чувствителен к регистру. Иногда мы не обращаем внимания на проблему с регистром при использовании Oracle. Имена таблиц и имена полей не чувствительны к регистру без двойных кавычек. Например: вставка в tableName и вставка в TABLENAME имеют одинаковый эффект. Используйте инструменты для экспорта create/. Скрипт инициализации данных, полученные результаты обычно преобразуются в имена таблиц и полей в верхнем регистре.
Но в MySQL чувствительность к регистру используемой операционной системы определяет чувствительность к регистру имени базы данных и имени таблицы. База данных соответствует каталогу в каталоге данных, а каждая таблица в базе данных соответствует как минимум одному файлу в каталоге базы данных (или нескольким, в зависимости от механизма хранения). Таким образом, использование базы данных или таблицы фактически манипулирует этими файлами (папками), поэтому чувствительность к регистру операционной системы определяет чувствительность к регистру имени базы данных и имени таблицы. В операционных системах с Linux в качестве ядра учитывается регистр.
Решение состоит в том, чтобы имя базы данных MySQL соответствовало регистру Oracle, а имя таблицы соответствовало имени таблицы в строке SQL в приложении. Если имя поля в приложении использует двойные кавычки, измените имя поля. в SQL Регистр имени должен соответствовать символам, заключенным в двойные кавычки. Если имена таблиц и поля, на которые ссылается ваше приложение, не имеют единого регистра, у вас будут большие проблемы.
2. Разница между зарезервированными словами.
Имена функций в языке SQL (например, inteval, show) являются зарезервированными словами. Зарезервированные слова в Oracle могут использоваться в качестве имен таблиц и полей и не влияют на их использование. Однако зарезервированные слова в MySQL не могут использоваться в качестве имен таблиц и полей. Если они используются, будет сообщено о синтаксической ошибке.
Решение состоит в том, чтобы заключить зарезервированные слова в операторе SQL с помощью символа «`», который расположен над клавишей табуляции на клавиатуре. Если это имя поля, существует другой метод имя_таблицы.имя поля; Вот так: вставьте в имя_таблицы (id, `интервал`) значение(….. или вставьте в имя_таблицы (id, имя_таблицы.inteval) значение(….. .
3. Различия в типах данных.
В MySQL нет varchar2 и числа, как в Oracle. В MySQL есть соответствующие типы varchar и numeric. Конечно, в Oracle нет типа времени MySQL.
Решение - замена.
4. Разница между типами автоматического роста.
В Oracle есть последовательность, а в MySQL нет, но есть атрибут auto_increment.
Решение состоит в том, чтобы преобразовать последовательность в Oracle для использования атрибута auto_increment. В некоторых случаях существует способ решить проблему, создав новую независимую таблицу для записи данных автоматического роста.
5. Разница в пределах длины индекса.
Начиная с MySQL 4.1.2, длина индекса таблиц MyISAM и InnoDB поддерживает 1000 байт, что означает, что длина индексного поля не может превышать 1000 байт. Если она превысит, будет сообщено о следующей ошибке: ОШИБКА 1071 (42000): Указанный ключ слишком длинный; максимальная длина ключа — 1000 байт. Если это кодировка UTF-8, ее длина эквивалентна 333 символам (поскольку один символ UTF8 занимает 3 байта). Ограничение длины индекса Oracle намного меньше, чем у MySQL.
Нет необходимости подробно останавливаться на решении: либо изменить определение индекса, либо изменить длину определения поля.
2. На что следует обратить внимание для совместимости баз данных?
Совместимость баз данных должна быть проблемой, на которую следует обратить внимание при проектировании базы данных, поскольку иногда у клиентов есть базы данных, которые уже используются, и они не хотят поддерживать две базы данных одновременно. В этом случае также может возникнуть совместимость с несколькими базами данных. точка продажи продукта.
Ключом к достижению совместимости баз данных является соблюдение стандартов использования.
1. Следуйте стандартному использованию и старайтесь не использовать определенные методы, специфичные для базы данных.
Например, использование символа '`' в msyql,
Другой пример: многие люди используют этот способ: при использовании Oracle для создания последовательности перед вставкой данных в таблицу выберите seq.nextval FROM DUAL, а затем вставьте значение, полученное из запроса, в таблицу в качестве значения. не работает. Он не подходит для баз данных без последовательности. Каждая база данных имеет автоматическое использование роста. Если вам нужно ее использовать, вы должны использовать ее полностью.
Другой пример: в разных базах данных есть расширенные страничные запросы. В Postgresql есть смещение и ограничение, а в Oracle — нет.
2. Избегайте проблем с учетом регистра в базе данных.
Выберите, должны ли имена таблиц и полей базы данных быть в верхнем или нижнем регистре, и быть полностью унифицированными во время проектирования и кодирования базы данных.
3. Зарезервированные слова.
Разработчики баз данных должны стараться не использовать зарезервированные слова для имен таблиц и полей. Многие люди также используют этот метод, добавляя «_» перед именем таблицы и именем поля, например: создать таблицу _tablename (_id целое число). Таким образом, у вас никогда не возникнет проблем, вызванных зарезервированными словами.