В версии MySQL 3.23 поддерживаются таблицы нового типа MyISAM и старого
типа ISAM. Старые таблицы не нуждаются в преобразовании для использования
их в версии 3.23. По умолчанию все новые таблицы будут создаваться с типом
MyISAM (если вы не запускаете mysqld с опцией --default-table-type=isam).
Можно преобразовать таблицу ISAM в таблицу MyISAM при помощи команды
ALTER TABLE table_name TYPE=MyISAM или при помощи Perl-скрипта
mysql_convert_table_format.
Клиенты версий 3.22 и 3.21 должны работать с сервером версии 3.23 без каких-либо проблем.
Ниже перечислены моменты, на которые следует обратить внимание при модернизации до версии 3.23:
Все таблицы, в которых используется кодировка
tis620, должны быть исправлены с помощьюmyisamchk -rилиREPAIR TABLE.При выполнении команды
DROP DATABASEнад базой данных, связанной символической ссылкой, удаляются как данная ссылка, так и исходная база данных (в 3.22 это было не так, поскольку программаconfigureне распознавала системный вызовreadlink).OPTIMIZE TABLEсейчас работает только с таблицамиMyISAM. Для других типов таблиц можно использовать командуALTER TABLEдля оптимизации таблицы. Во время выполнения командыOPTIMIZE TABLEоптимизируемая таблица сейчас заблокирована для других потоков.Клиент
mysqlсервера MySQL сейчас по умолчанию начинает свою работу с опцией--no-named-commands(-g). Данную опцию можно отключить с помощью--enable-named-commands(-G). В некоторых случаях это может вызывать проблемы несовместимости, например, в скриптах SQL, в которых названные команды используются без точки с запятой! Команды большого формата пока еще работают с начала строки.Функции даты, работающие с частью представления даты (такие как
MONTH()), сейчас будут возвращать0для даты0000-00-00(в версии MySQL 3.22 возвращалась величинаNULL).При использовании порядка сортировки символов german необходимо исправить все таблицы с помощью
isamchk -r, так как в порядке сортировки произведены некоторые изменения!Возвращаемый по умолчанию тип выражения
IFтеперь зависит от обоих аргументов, а не только от первого.AUTO_INCREMENTтеперь не будет работать с отрицательными числами; причина в том, что отрицательные числа вызывали проблемы при переходе от-1к0. Для таблицMyISAMAUTO_INCREMENTне обрабатывается на более низком уровне и работает намного быстрее, чем раньше. Для таблицMyISAMстарые автоинкрементные номера также не используются повторно, даже при удалении из таблицы строк.CASE,DELAYED,ELSE,END,FULLTEXT,INNER,RIGHT,THENиWHENсейчас являются зарезервированными словами.FLOAT(X)сейчас является настоящим типом данных с плавающей точкой, а не величиной с фиксированным числом десятичных знаков.При объявлении
DECIMAL(length,dec)аргументlengthбольше не включает в себя место для знака или десятичной точки.Строка
TIMEтеперь должна представлять собой один из следующих форматов:[[[DAYS] [H]H:]MM:]SS[.fraction]или[[[[[H]H]H]H]MM]SS[.fraction].LIKEсейчас сравнивает строки, используя те же правила сравнения символов, что и=. Если необходим старый режим работы, то можно скомпилировать MySQL с флагомCXXFLAGS=-DLIKE_CMP_TOUPPER.Выражение
REGEXPсейчас является независимым от регистра символов для нормальных (не двоичных) строк.При проверке/исправлении таблиц необходимо использовать
CHECK TABLEилиmyisamchkдля таблицMyISAM(.MYI) иisamchkдля таблицISAM(.ISM).Чтобы обеспечить совместимость файлов
mysqldumpмежду версией MySQL 3.22 и версией 3.23, не следует использовать опцию--optили--allдляmysqldump.Проверьте все ваши вызовы функции
DATE_FORMAT(), чтобы убедиться, что перед каждым символом формата имеется '%' (в версии MySQL 3.22 и более поздних этот синтаксис уже допускается).mysql_fetch_fields_directсейчас является функцией (был макрос) и возвращает указатель наMYSQL_FIELDвместоMYSQL_FIELD.Функцию
mysql_num_fields()больше нельзя использовать на объектахMYSQL*(сейчас это функция, принимающаяMYSQL_RES*в качестве аргумента, так что вместо нее следует применятьmysql_field_count()).В версии MySQL 3.22 вывод
SELECT DISTINCT ...почти всегда был отсортированным. Чтобы получить отсортированный вывод в версии 3.23, необходимо использоватьGROUP BYилиORDER BY.Функция
SUM()сейчас возвращаетNULLвместо0при отсутствии сопоставляемых строк: это сделано для соответствия с ANSI SQL.Операторы
ANDилиORс величинамиNULLтеперь будут возвращатьNULLвместо0. В основном, это влияет на запросы, в которых используетсяNOTна выраженияхAND/OR, так какNOT NULL = NULL.LPAD()иRPAD()будут укорачивать результирующую строку, если она длиннее, чем аргумент длины.