Клиенты версий 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
. Для таблиц MyISAM
AUTO_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()
будут укорачивать результирующую строку, если она длиннее, чем аргумент длины.