MySQL / 9. Получение и использование метаданных

Определение типов таблиц, поддерживаемых сервером

Задача
Вы хотите понять, можно ли создать таблицу указанного типа.

Решение
Спросите у сервера, какие типы таблиц он поддерживает.

Обсуждение
Предложение SHOW VARIABLES может сообщить вам о том, доступен ли определенный тип таблиц. Например, вы можете проверить переменные have_bdb, have_innodb и have_gemini, чтобы посмотреть, поддерживает ли сервер безопасные для транзакций таблицы. Код на PHP показывает, как проверить переменную have_bdb на значение YES, используя двухэтапный подход. Сначала убедимся в том, что переменная существует, проверив результирующее множество на непустоту. (Переменной вообще не будет, если ваша версия MySQLеще не включает поддержку таблиц данного типа.) Затем извлечем значение переменной, чтобы проверить, равно ли оно YES:

$avail = FALSE;
# корректно экранируем имя переменной
$var_name = ereg_replace ("([%_])", "\\\\1", "have_bdb");
if ($result_id = mysql_query ("SHOW VARIABLES LIKE '$var_name'", $conn_id))
{
if ($row = mysql_fetch_row ($result_id))
$avail = ($row == "YES" ? TRUE : FALSE);
mysql_free_result ($result_id);
}

После выполнения кода $avail будет «истиной» или «ложью», показывая, поддерживает ли сервер таблицы BDB. Чтобы проверить поддержку другого типа таблиц, измените код так, чтобы тестировалась соответствующая серверная переменная.

Более общий подход заключается в создании функции, проверяющей все известные дескрипторы и возвращающей список поддерживаемых. Невозможно попросить такой список у сервера напрямую, но если вы знаете все возможные типы, то можете определить, какие из них поддерживаются, следуя таким правилам:

• До версии MySQL 3.23 были доступны только таблицы ISAM.

• Начиная с MySQL 3.23 всегда присутствует тип MyISAM. Могут поддерживаться и другие типы. Для типов ISAM, BDB и Gemini проверяйте серверные переменные have_isam, have_bdb и have_gemini соответственно (ищите значение YES). Доступность таблиц InnoDB определяется переменной have_innodb. Однако какое-то время эта переменная называлась have_innobase, так что проверьте лучше обе.

Эти правила реализуются функцией на Perl get_table_handlers(). Она возвращает список слов, извлеченных из списка bdb, gemini, innodb, isam и myisam, который соответствует поддерживаемым типам таблиц:

sub get_table_handlers
{
my $dbh = shift;
my @types;
my %typemap =
(
"have_bdb" => "bdb",
"have_gemini" => "gemini",
"have_innodb" => "innodb",
"have_innobase" => "innodb", # устаревшая форма have_innodb
"have_isam" => "isam"
);
# получаем номер версии сервера
my $ver_num = (get_server_version ($dbh)); # числовой формат
if ($ver_num < 32300) # до версии 3.23.xx доступен только тип ISAM
{
@types = ("isam");
}
else
{
@types = ("myisam"); # тип MyISAM всегда доступен после 3.23.xx
# создаем запрос SHOW VARIABLES для получения серверных переменных 'have_',
# указывающих на наличие обработчиков таблиц. (Некоторые переменные 'have_'
# не относятся к типам таблиц, но все же эффективнее выдать один запрос,
# чем отдельный запрос для каждой переменной.)
my $sth = $dbh->prepare ("SHOW VARIABLES LIKE 'have\\_%'");
$sth->execute ();
while (my ($var, $val) = $sth->fetchrow_array ())
{
push (@types, $typemap{$var})
if exists ($typemap{$var}) && $val eq "YES";
}
}
return (sort (@types));
}