2.5.3 Модернизация с версии 3.22 до версии 3.23
В версии 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
. Для таблиц 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()
будут укорачивать результирующую строку, если она длиннее, чем
аргумент длины.
Add your own comment.