Документация MySQL


Глава 8. Интерфейсы для MySQL
Пред.   След.

Глава 8. Интерфейсы для MySQL

Содержание

8.1. Интерфейс PHP API для MySQL
8.1.1. Общие проблемы MySQL и PHP
8.2. Интерфейс Perl API для MySQL
8.2.1. DBI с помощью DBD::mysql
8.2.2. Интерфейс DBI
8.2.3. Больше информации по DBI/DBD
8.3. Поддержка ODBC в MySQL
8.3.1. Как установить MyODBC
8.3.2. Как заполнять различные поля в Администраторе ODBC
8.3.3. Параметры подключения для MyODBC
8.3.4. Как сообщать о проблемах с MyODBC
8.3.5. Программы, работающие с MyODBC
8.3.6. Как получить значение столбца AUTO_INCREMENT в ODBC
8.3.7. Составление отчетов о проблемах с MyODBC
8.4. Интерфейс C для MySQL
8.4.1. Типы данных C API
8.4.2. Обзор функций интерфейса C
8.4.3. Описание функций интерфейса C
8.4.4. Описания функций C, связанных с потоками
8.4.5. Описания функций C, доступных во встраиваемом сервере
8.4.6. Основные вопросы и проблемы в использовании интерфейса C
8.4.7. Сборка клиентских программ
8.4.8. Как создать клиентскую программу с потоками
8.4.9. libmysqld, встраиваемая библиотека сервера MySQL
8.5. Интерфейсы C++
8.5.1. Интерфейс Borland C++
8.6. Взаимодействие MySQL и Java (JDBC)
8.7. Интерфейсы Python API для MySQL
8.8. Интерфейсы Tcl API для MySQL
8.9. Оболочка Eiffel для MySQL

Эта глава описывает доступные для MySQL интерфейсы, а также разъясняет, где их можно получить и как их использовать. Интерфейс C API охвачен наиболее широко, так как он был разработан командой MySQL и является базой для большинства других интерфейсов.

8.1. Интерфейс PHP API для MySQL

8.1.1. Общие проблемы MySQL и PHP

PHP представляет собой серверный язык программирования скриптов со встраиваемым кодом HTML, который может использоваться для создания динамических веб-страниц. Он содержит поддержку для доступа к нескольким базам данных, включая MySQL. PHP может запускаться как отдельная программа или компилироваться как модуль для использования с веб-сервером Apache.

Дистрибутив и документацию можно найти на веб-сайте PHP (http://www.php.net/).

8.1.1. Общие проблемы MySQL и PHP

  • Ошибка: "Максимальное время исполнения превышено" ("Maximum Execution Time Exceeded"). Это ограничение PHP; откройте файл php3.ini и измените максимальное время исполнения с 30 секунд на более высокую величину, такую, какая вам необходима. Есть еще один неплохой способ - удвоить разрешенный объем оперативной памяти с 8 Мб до 16 Мб на скрипт.

  • Ошибка: "Неисправимая ошибка: Вызов неподдерживаемой или неопределенной функции mysql_connect() в .." ("Fatal error: Call to unsupported or undefined function mysql_connect() in ..") Это означает, что ваша версия PHP не скомпилирована с поддержкой MySQL. Можно либо скомпилировать динамический модуль MySQL и загрузить его в PHP, либо перекомпилировать PHP со встроенной поддержкой MySQL. Это подробно описывается в руководстве по PHP.

  • Ошибка: "неопределенная ссылка на `uncompress' (несжатый) " ("undefined reference to `uncompress'"). Это означает, что данная клиентская библиотека скомпилирована с поддержкой сжатого клиент-серверного протокола. Устранение этой проблемы заключается в добавлении -lz в конце при линковании с -lmysqlclient.

8.2. Интерфейс Perl API для MySQL

8.2.1. DBI с помощью DBD::mysql
8.2.2. Интерфейс DBI
8.2.3. Больше информации по DBI/DBD

Этот раздел снабжает документами для работы с интерфейсом Perl DBI. Более ранний интерфейс назывался mysqlperl. В настоящее время интерфейс DBI/DBD является рекомендуемым интерфейсом Perl, так что mysqlperl здесь не документируется как устаревший.

8.2.1. DBI с помощью DBD::mysql

DBI представляет собой общий интерфейс для многих баз данных. Это означает, что можно написать скрипт, работающий со многими различными процессорами баз данных без изменения. При этом для каждого типа базы данных необходим определенный драйвер (DBD - это абревиатура DataBase Driver). Для MySQL этот драйвер называется DBD::mysql.

Для более подробной информации об интерфейсе Perl5 DBI, пожалуйста, посетите веб-страницу DBI и прочитайте документацию:

http://dbi.perl.org/ 

Для более подробной информации об объектно ориентированном программировании (OOП), описанном в Perl5, смотрите веб-страницу Perl OOP:

http://language.perl.com/info/documentation.html 

Следует учитывать, что, если вы хотите использовать транзакции с Perl, то необходимо иметь модуль Msql-Mysql-modules версии 1.2216 или новее.

Рекомендуемый модуль для Perl: DBD-mysql-2.1022 или новее.

Инструкции по установке поддержки Perl в MySQL даются в разделе See Раздел 2.7, «Замечания по установке Perl».

Если у вас уже установлены модули MySQL, то вы можете найти информацию о специфике функциональности MySQL при помощи одной из следующих команд:

shell> perldoc DBD/mysql
shell> perldoc mysql

8.2.2. Интерфейс DBI

Унифицированные методы DBI

МетодОписание
connectСоздает соединение с сервером
disconnectРазрывает соединение с сервером
prepareГотовит SQL-запрос к выполнению
executeВыполняет приготовленный запрос
doГотовит и выполняет запрос
quoteЗаключает в символы цитирования строки или BLOB-значения, которые вы собираетесь внести
fetchrow_arrayВозвращает следующую запись как массив
fetchrow_arrayrefВозвращает следующую запись как ссылку на массив
fetchrow_hashrefВозвращает следующую запись как ссылку на хеш
fetchall_arrayrefВозвращает всю информацию как массив массивов
finishЗавершает выражение и освобождает системные ресурсы
rowsВозвращает количество измененных/удаленных строк
data_sourcesВозвращает массив, список баз данных, доступных на сервере
ChopBlanksОпределяет, будут ли методы fetchrow_* убирать начальные и оконечные пробелы
NUM_OF_PARAMSКоличество символов-заполнителей в приготовленном выражении
NULLABLEВозвращает ссылку на массив значений, которые определяют, могут ли столбцы содержать значения NULL. Возможные значения для каждого элемента массива: 0 или пустая строка, если столбец не может быть NULL, 1 - если может, и 2, если статус NULL для столбца неизвестен
traceПроизводит трассировку для отладки

Методы, определенные только для MySQL

МетодОписание
insrtidЗначение AUTO_INCREMENT, которое было присвоено последним
is_blobКакие столбцы имеют тип BLOB
is_keyКакие столбцы являются ключами
is_numКакие столбцы имеют числовой тип
is_pri_keyКакие столбцы являются первичными ключами
is_not_nullСтолбцы, которые НЕ МОГУТ иметь значение NULL. См. NULLABLE
lengthМаксимально допустимые размеры содержимого столбцов
max_lengthМаксимальные размеры столбцов, присутствующих в результате
NAMEИмена столбцов
NUM_OF_FIELDSКоличество полей, возвращенных в результате операции
tableИмена таблиц в результате
typeТипы всех столбцов

Более детально методы Perl DBI описаны в следующих разделах. Возвращаемые переменные:

  • $dbh

    Дескриптор базы данных

  • $sth

    Дескриптор выражения

  • $rc

    Код возврата (часто статус)

  • $rv

    Возвращенное значение (часто количество строк)

Унифицированные методы DBI

  • connect($data_source, $username, $password)

    Метод connect используется для подсоединения к источнику данных (СУБД). Строка $data_source должна начинаться с DBI:имя драйвера:. Примеры вызова connect с драйвером DBD::mysql:

    $dbh = DBI->connect("DBI:mysql:$database", $user, $password);
    $dbh = DBI->connect("DBI:mysql:$database:$hostname", $user,
        $password);
    $dbh = DBI->connect("DBI:mysql:$database:$hostname:$port", $user,
        $password);
    

    Если не определены имя пользователя либо пароль, DBI использует значения переменных окружения DBI_USER и DBI_PASS. Если не указано имя хоста, используется значение по умолчанию - localhost. Если не указан номер порта, также используется значение по умолчанию (3306).

    Начиная с Msql-Mysql-modules версии 1.2009, доступны следующие модификаторы $data_source:

    • mysql_read_default_file=file_name

      Читать файл file_name как файл настроек. За более подробной информацией о файлах настройки обращайтесь к разделу See Раздел 4.1.2, «Файлы параметров my.cnf».

    • mysql_read_default_group=group_name

      По умолчанию используется группа [client] файла настроек. Опцией mysql_read_default_group, группа по умолчанию устанавливается в [group_name].

    • mysql_compression=1

      Использовать сжатие при обмене клиента и сервера (MySQL версий 3.22.3 и выше).

    • mysql_socket=/path/to/socket

      Указывает путь к Unix-сокету, который будет использоваться для соединения с сервером. (MySQL версии 3.21.15 и более поздние).

    Можно указывать не один модификатор, а несколько; при этом каждый должен предваряться точкой с запятой.

    Например, если вы не хотите явно указывать имя пользователя и пароль в программе, использующей DBI, можно внести эту информацию в файл ~/.my.cnf, написав вызов connect. Это делается следующим образом:

    $dbh = DBI -> connect("DBI:mysql:$database",
          ";mysql_read_default_file=$ENV{HOME}/.my.cnf",
            $user, $password);
    

    Данный пример считает настройки из группы [client] файла ~/.my.cnf. Чтобы выполнить те же действия, но с настройками, взятыми из группы [perl], нужно использовать следующую форму записи:

    $dbh = DBI -> connect("DBI:mysql:$database",
          ";mysql_read_default_file=$ENV{HOME}/.my.cnf"
          . ";mysql_read_default_group=perl",
          $user, $password);
    

  • disconnect

    Метод disconnect разрывает соединение с базой данных. Это стоит делать перед выходом из программы. Пример:

    $rc = $dbh->disconnect;
    

  • prepare($statement)

    Подготавливает SQL-запрос $statement к исполнению сервером. Возвращает дескриптор выражения ($sth), который затем используется для вызова метода execute. Обычно работа с запросами типа SELECT (так же, как и аналогичными, такими как SHOW, DESCRIBE, EXPLAIN) сводится к вызову методов prepare и execute. Пример:

    $sth = $dbh -> prepare($statement)
    or die "Не  могу  подготовить $statement: $dbh -> errstr\n";
    

    Если вы хотите считывать большие результаты вашим клиентом, вы можете указать использование mysql_use_result() в Perl:

    my $sth = $dbh->prepare($statement { "mysql_use_result" => 1});
    

  • execute

    Метод execute выполняет приготовленный запрос. Если запрос не SELECT, метод возвращает количество строк, которые были подверглись воздействию запроса. Если таковых нет, execute возвращает "0E0", что Perl интерпретирует как нуль, но воспринимает как значение ``истина'' (true). Если возникает ошибка, execute возвращает undef. Для запросов SELECT метод только инициирует выполнение запроса SQL-сервером и для получения данных необходимо использовать один из методов fetch_*. Пример:

    $rv = $sth -> execute or die "Не могу выполнить: $sth -> errstr";
    

  • do($statement)

    Метод do готовит SQL-запрос к выполнению, выполняет его и возвращает количество строк, подвергшихся воздействию. Если нет ни одной такой строки, как результат возвращается значение "0E0", что Perl интерпретирует как нуль, но воспринимает как значение ``истина'' (true).. Этот метод обычно используется для выражений, не являющихся операторами SELECT, которые не могут быть подготовлены заранее (из-за ограничений драйвера) или же выполняются только один раз (операции вставки, удаления и т.д.). Например:

    $rv = $dbh->do($statement)
    or die "Не могу выполнить: $sth -> errstr";
    

    Обычно использование 'do' существенно быстрей (и предпочтительней) для запросов без параметров, чем пара prepare/execute.

  • quote($string)

    Метод quote используется для экранирования специальных символов в запросе символами экранирования, а также заключения данных в необходимые внешние символы цитирования (например кавычки). Пример:

    $sql = $dbh->quote($string)
    

  • fetchrow_array

    Этот метод выбирает очередную строку данных и возвращает ее как массив значений полей. Пример:

    while(@row = $sth -> fetchrow_array) {
    print qw($row[0]\t$row[1]\t$row[2]\n);
    }
    

  • fetchrow_arrayref

    Этот метод выбирает очередную строку данных и возвращает ссылку на массив значений полей. Пример:

    while($row_ref = $sth -> fetchrow_arrayref) {
    print qw($row_ref -> [0]\t$row_ref -> [1]\t$row_ref ->
    [2]\n);
    }
    

  • fetchrow_hashref

    Этот метод выбирает строку данных и возвращает ссылку на хеш, содержащий пары имя/значение. Данный метод намного менее эффективен, чем использование пописанных выше ссылок на массивы. Пример:

    while($hash_ref = $sth -> fetchrow_hashref) {
    print qw($hash_ref -> {firstname}\t$hash_ref ->
    {lastname}\t$hash_ref ->{title}\n);
    }
    

  • fetchall_arrayref

    Этот метод выдает все данные (все строки), получаемые как результат SQL-запроса. Он возвращает ссылку на массив ссылок на массивы отдельных строк. Соответственно, для обращения к этим данным нужно использовать вложенный цикл. Пример:

    my $table = $sth -> fetchall_arrayref
    or die "$sth -> errstr\n";
    my($i, $j);
    for $i ( 0 .. $#{$table}} ) {
    for $j ( 0 .. $#{$table -> [$i]} )  {
    print "$table -> [$i][$j]\t";
    }
    print "\n";
    }
    

  • finish

    Указывает, что данные этого дескриптора запроса больше не нужны. После вызова этого метода программа освобождает дескриптор запроса и все системные ресурсы, которые используются для работы с ним. Пример:

    $rc = $sth -> finish;
    

  • rows

    Возвращает число измененных/удаленных последней командой (UPDATE, DELETE и т.д.) строк. Это обычно требуется после выполнения метода execute над запросами, не являющимися запросами SELECT. Например:

    $rv = $sth -> rows;
    

  • NULLABLE

    Возвращает ссылку на массив значений, которые указывают, может столбец принимать значения NULL или нет. Возможные значения для каждого элемента массива - это 0 или пустая строка, если столбец не может содержать значения NULL, 1 - если может и 2 - если статус столбца относительно значения NULL не определен.

    Например:

    $null_possible = $sth -> {NULLABLE};
    

  • NUM_OF_FIELDS

    Значение этого атрибута равно числу полей в результате запроса (SELECT или SHOW FIELDS). Его можно использовать его для проверки, возвращает ли запрос результат вообще: нулевое значение соответствует запросам типа INSERT, DELETE, UPDATE - т.е. всем, кроме SELECT. Например:

    $nr_of_fields = $sth -> {NUM_OF_FIELDS};
    

  • data_sources($driver_name)

    Этот метод возвращает массив с именами баз данных, доступных на локальном MySQL-сервере (на localhost). Пример:

    @dbs = DBI->data_sources("mysql");
    

  • ChopBlanks

    Этот атрибут определяет, будут ли методы fetchrow_* убирать начальные и оконечные пробелы из результатов. Пример:

    $sth -> {'ChopBlanks'} = 1;
    

  • trace($trace_level), trace($trace_level, $trace_filename)

    Метод trace разрешает или запрещает трассировку. Если он вызывается как метод класса DBI, он влияет на разрешение трассировки всех дескрипторов. В случае же обращения к нему как к методу дескриптора запроса либо базы данных он разрешает/запрещает трассировку для этой базы данных или этого запроса (и всех будущих потомков). $trace_level указывает уровень детализации трассировочной информации, так установка $trace_level в 2 включает детализированную трассировку. Установка $trace_level в 0 запрещает трассировку. По умолчанию вывод трассировочной информации осуществляется на стандартное устройство вывода ошибок (stderr). Если указан параметр $trace_filename, его значение используется как имя файла, в который выводится трассировочная информация ВСЕХ дескрипторов, для которых разрешена трассировка. Пример:

    DBI->trace(2);                # трассировка всего
    DBI->trace(2,"/tmp/dbi.out"); # трассировка всего в /tmp/dbi.out
    $dth->trace(2);               # трассировка всех запросов к этой базе
    данных
    $sth->trace(2);               # трассировка этого запроса
    

    Трассировку DBI можно также включить при помощи переменной окружения DBI_TRACE. Присвоение числового значения эквивалентно вызову DBI->trace(значение). Строковое значение (имя файла) эквивалентно вызову DBI->trace(2,значение).

Методы, специфичные для MySQL

Описанные здесь методы специфичны для MySQL и не являются частью стандарта DBI. Сейчас считается, что часть из них использовать не стоит: is_blob, is_key, is_num, is_pri_key, is_not_null, length, max_length и table. Ниже указаны возможные стандартные альтернативы, если они существуют:

  • insertid

    Если вы используете специфичную для MySQL функцию AUTO_INCREMENT, здесь будут сохраняться автоматически увеличенные значения. Пример:

    $new_id = $sth->{insertid};
    

    В качестве альтернативы можно использовать $dbh -> {'mysql_insertid'}.

  • is_blob

    Возвращает ссылку на массив булевых значений; для каждого элемента массива значение ``истина'' указывает, что соответствующий столбец имеет тип BLOB. Например:

    $keys = $sth -> {is_blob};
    

  • is_key

    Возвращает ссылку на массив булевых значений; для каждого элемента массива значение ``истина'' указывает, что соответствующий столбец является ключом. Пример:

    $keys = $sth -> {is_key};
    

  • is_num

    Возвращает ссылку на массив булевых значений; для каждого элемента массива, значение ``истина'' указывает, что соответствующий столбец содержит числовые значения. Например:

    $nums = $sth -> {is_num};
    

  • is_pri_key

    Возвращает ссылку на массив булевых значений; для каждого элемента массива, значение ``истина'' указывает, что соответствующий столбец является первичным ключом. Пример:

    $pri_keys = $sth -> {is_pri_key};
    

  • is_not_null

    Возвращает ссылку на массив б булевых значений; для каждого элемента массива значение ``ложь'' указывает на то, что столбец может содержать значения NULL. Например:

    $not_nulls = $sth -> {is_not_null};
    

    is_not_null не рекомендуется к применению; предпочтительно использование NULLABLE (описан ранее), поскольку это стандартный для DBI метод.

  • length, max_length

    Каждый из этих методов возвращает ссылку на массив размеров столбцов. Массив, соответствующий length, содержит максимальные допустимые размеры каждого столбца (из описания таблицы). Массив max_length содержит максимальные размеры элементов, присутствующих в результирующей таблице. Например:

    $lengths = $sth -> {length};
    $max_lengths = $sth -> {max_length};
    

  • NAME

    Возвращает ссылку на массив имен столбцов. Например:

    $names = $sth -> {NAME};
    

  • table

    Возвращает ссылку на массив названий таблиц. Например:

    $tables = $sth -> {table};
    

  • type

    Возвращает ссылку на массив типов столбцов. Пример:

    $types = $sth -> {type};
    

8.2.3. Больше информации по DBI/DBD

Вы можете использовать команду perldoc для получения больше информации по DBI.

perldoc DBI
perldoc DBI::FAQ
perldoc DBD::mysql

Конечно, вы можете использовать pod2man, pod2html и другие утилиты для трансляции в другие форматы.

Самая свежая информация по DBI живет на веб-сайте DBI: http://dbi.perl.org/.

8.3. Поддержка ODBC в MySQL

8.3.1. Как установить MyODBC
8.3.2. Как заполнять различные поля в Администраторе ODBC
8.3.3. Параметры подключения для MyODBC
8.3.4. Как сообщать о проблемах с MyODBC
8.3.5. Программы, работающие с MyODBC
8.3.6. Как получить значение столбца AUTO_INCREMENT в ODBC
8.3.7. Составление отчетов о проблемах с MyODBC

MySQL обеспечивает поддержку для ODBC посредством программы MyODBC. В этом разделе показано, как устанавливать и использовать MyODBC. Здесь также приведен список программ общего применения, о которых известно, что они работают с MyODBC.

8.3.1. Как установить MyODBC

MyODBC 2.50 представляет собой 32-разрядный драйвер ODBC спецификации уровня 0 (с возможностями уровней 1 и 2) для подсоединения совместимого с ODBC приложения к MySQL. MyODBC работает под Windows 9x/Me/NT/2000/XP и на большинстве платформ Unix.

MyODBC 3.51 это усовершенствованная версия ODBC со спецификационным уровнем 1 (полностью ядро API + уровень возможности 2).

MyODBC является свободно доступным. Самую свежую версию можно найти на http://www.mysql.com/downloads/api-myodbc.html.

Обратите внимание, что версии 2.50.х распространяются под LGPL лицензией, тогда как 3.51.х версии под лицензией GPL.

Если существуют проблемы с MyODBC, а программа также работает и с OLEDB, то следует попробовать работать с драйвером OLEDB.

Обычно установка MyODBC требуется только на компьютерах под Windows. Для Unix необходимость в MyODBC возникает только для программ, подобных ColdFusion, которые работают на Unix-машинах и используют ODBC для подключения к базам данных.

Для установки MyODBC на Unix-машину понадобится также программа управления ODBC. MyODBC, как известно, работает с большинством программ управления ODBC для Unix.

Для того чтобы установить MyODBC на Windows, необходимо загрузить соответствующий файл MyODBC .zip, распаковать его с помощью WinZIP или другой подобной программы и выполнить исполняемый файл SETUP.EXE.

При попытке установить MyODBC под Windows/NT/XP можно получить следующую ошибку:

An error occurred while copying C:\WINDOWS\SYSTEM\MFC30.DLL. Restart
Windows and try installing again (before running any applications which
use  ODBC)

Проблема здесь заключается в том, что некоторая другая программа в это же время использует ODBC и из-за конструктивных особенностей Windows в данном случае может оказаться невозможным установить новый драйвер ODBC с помощью поставляемой Microsoft программы установки. В большинстве случаев можно продолжать установку, просто нажимая Ignore для копирования оставшихся файлов MyODBC, при этом заключительная установка должна работать. Если она не работает, то выход состоит в следующем: перезагрузите систему в безопасном режиме (safe mode) (для перехода в этот режим следует нажать F8 непосредственно перед тем, как компьютер начинает запускать Windows во время перезагрузки), установите MyODBC и перезагрузите Windows в обычном режиме.

  • Чтобы установить подсоединение к Unix-компьютеру от Windows-компьютера с помощью приложения ODBC (которое само по себе не поддерживает MySQL), необходимо вначале установить MyODBC на Windows-машине.

  • Данный пользователь и Windows-машина должны обладать привилегиями доступа к серверу MySQL на Unix-машине. Это устанавливается с помощью команды GRANT (see Раздел 4.3.1, «Синтаксис команд GRANT и REVOKE»).

  • Необходимо создать новую запись DSN ODBC следующим образом:

  • Открыть Control Panel (Панель управления) на Windows-компьютере.

  • Выполнить двойной щелчок на пиктограмме ODBC Data Sources 32-bit (Источники данных ODBC (32бит)).

  • Щелкнуть на закладке User DSN (Пользовательский DSN).

  • Щелкнуть на кнопке Add (Добавить).

  • Выбрать MySQL в окне Create New Data Source (Создание нового источника данных) и щелкнуть на кнопке Finish (Готово).

  • Откроется окно конфигурации драйвера MySQL по умолчанию (see Раздел 8.3.2, «Как заполнять различные поля в Администраторе ODBC»).

  • Теперь запустите свое приложение и выберите драйвер ODBC с помощью DSN, заданного вами в Администраторе источников данных ODBC.

Обратите внимание: существуют и другие возможности конфигурации в окне MySQL (трассировка, не подсказывать соединение и так далее), которые вы можете опробовать, если столкнетесь с какими-либо проблемами.

8.3.2. Как заполнять различные поля в Администраторе ODBC

Для Windows 95 существует три возможности задания имени сервера:

  • Использовать IP-адрес сервера.

  • Добавить файл \windows\lmhosts со следующей информацией:

    ip hostname
    

    Например:

    194.216.84.21 my_hostname
    
  • Сконфигурировать ПК для использования DNS.

Пример заполнения при установке ODBC:

Windows DSN name:   test
Description:        This is my test database
MySql Database:     test
Server:             194.216.84.21
User:               monty
Password:           my_password
Port:

Значением поля Windows DSN name может быть любое имя, уникальное для данной установки ODBC.

Не обязательно указывать значения для полей Server, User, Password или Port в окне установки ODBC. Однако если вы это сделали, данные величины в дальнейшем при установке соединения будут использованы как значения по умолчанию. Тогда же можно будет изменить эти значения.

Если номер порта не задан, то используется его значение по умолчанию (3306).

Если задается опция Read options from C:\my.cnf, то группы client и odbc будут читаться из файла C:\my.cnf. Можно применять все опции, используемые в mysql_options() (see Раздел 8.4.3.39, «mysql_options()»).

8.3.3. Параметры подключения для MyODBC

Можно указать следующие параметры для MyODBC в разделе [Servername] файла ODBC.INI или через аргумент InConnectionString при вызове функции SQLDriverConnect().

ПараметрВеличина по умолчаниюКомментарий
userODBC (под Windows)Имя пользователя, используемое для подключения к MySQL.
serverlocalhostИмя хоста сервера MySQL.
database База данных по умолчанию.
option0Целое число, с помощью которого можно указать, как должен работать драйвер MyODBC (см. ниже).
port3306Используемый порт TCP/IP, если значением server не является localhost.
stmt Команда, которая будет выполняться при подключении к MySQL.
password Пароль для комбинации server user.
socket Сокет или канал Windows для подключения.

Аргумент ``option'' используется для указания MyODBC, что данный клиент не на 100% соответствует ODBC. Под Windows обычно устанавливается флаг опций путем переключения различных опций в окне данного соединения, но можно также установить это в аргументе ``option''. Следующие опции перечислены в том же порядке, в котором они перечислены в окне подключения MyODBC:

БитОписание
1Данный клиент не может отследить, что драйвер MyODBC возвращает реальную ширину столбца.
2Данный клиент не может отследить, что драйвер MyODBC возвращает реальную величину подвергшихся воздействию строк. Если этот флаг установлен, то взамен MySQL возвращает ``найденные строки''. Необходима версия MySQL 3.21.14 или более новая, чтобы эта опция работала.
4Создает журнал отладки в c:\myodbc.log. Это то же самое, что задать MYSQL_DEBUG=d:t:O,c::\myodbc.log в AUTOEXEC.BAT
8Не устанавливать никаких пакетных ограничений для результатов и параметров.
16Не выводить подсказки для вопросов, даже если драйвер захотел бы предложить это
32Имитировать драйвер ODBC 1.0 в определенной ситуации.
64Игнорировать использование имени базы данных в database.table.column.
128Заставляет использовать указатели менеджера ODBC (экспериментальная).
256Отключить использование расширенной выборки (экспериментальная).
512Заполнить поля CHAR до полной длины столбца.
1024Функция SQLDescribeCol() будет возвращать полностью уточненные имена столбцов
2048Использовать сжатие в клиент-серверном протоколе
4096Предписывает серверу игнорировать пробел после имени функции и перед ‘(’ (необходимо для PowerBuilder). Это сделает имена всех функций ключевыми словами!
8192Соединяет с именованными каналами сервер mysqld, работающий под NT.
16384Изменяет тип столбцов LONGLONG на INT (некоторые приложения не могут обрабатывать LONGLONG).
32768Возвращает параметр user как Table_qualifier и Table_owner из SQL-таблиц (экспериментальная)
65536Читает параметры из групп client и odbc из файла my.cnf
131072Добавляет некоторые дополнительные проверки безопасности (не должно понадобиться, но...)

Если необходимо иметь много опций, следует добавить вышеуказанные флаги! Например, установка опции в 12 (4+8) дает отладку без ограничений пакетов!

По умолчанию MYODBC.DLL компилируется для оптимальной производительности. Если необходимо отладить MyODBC (например, включить трассировку), следует вместо этого использовать MYODBCD.DLL. Для установки этого файла следует скопировать MYODBCD.DLL поверх установленного файла MYODBC.DLL.

8.3.4. Как сообщать о проблемах с MyODBC

Драйвер MyODBC был протестирован с Access, Admndemo.exe, C++-Builder, Borland Builder 4, Centura Team Developer (первоначально Gupta SQL/Windows), ColdFusion (под Solaris и NT с пакетом обновлений svc pack 5), Crystal Reports, DataJunction, Delphi, ERwin, Excel, iHTML, FileMaker Pro, FoxPro, Notes 4.5/4.6, SBSS, Perl DBD-ODBC, Paradox, Powerbuilder, 32-разрядным Powerdesigner, VC++ и Visual Basic.

Если вам известны какие- либо другие приложения, работающие с MyODBC, пожалуйста, пошлите сообщение об этом по адресу !

При работе с некоторыми программами можно получить ошибку вроде: Another user has modifies the record that you have modified.

В большинстве случаев эту проблему можно устранить одним из следующих способов:

  • Добавить первичный ключ для данной таблицы, если он еще не создан.

  • Добавить столбец TIMESTAMP, если он еще не создан.

  • Использовать поля только с числами с плавающей запятой двойной точности. Некоторые программы могут не срабатывать при сравнении чисел с плавающей запятой одинарной точности.

Если перечисленные выше способы не помогают, необходимо сделать трассировочный файл MyODBC и попробовать определить, в чем дело.

8.3.5. Программы, работающие с MyODBC

Большинство программ должно работать с MyODBC, но для каждой из перечисленных ниже мы либо провели тестирование сами, либо получили подтверждение от пользователей, что она действительно работает:

  • Программа

    Комментарий

  • Access

    Чтобы заставить Access работать:

    • При использовании Access 2000 необходимо установить самую последнюю версию (2.6 или выше) Microsoft MDAC (Microsoft Data Access Components), которую можно найти на http://www.microsoft.com/data/. Это позволит устранить ошибку в Access, которая проявляется в том, что при экспорте данных в MySQL не указываются имена таблиц и столбцов. Еще один способ обойти эту ошибку заключается в модернизации MyODBC до версии 2.50.33 и MySQL до версии 3.23.x - оба апгрейда вместе обеспечивают обход данной ошибки!

      Необходимо также получить и использовать Microsoft Jet 4.0 Service Pack 5 (SP5), который можно найти на http://support.microsoft.com/support/kb/articles/Q 239/1/14.ASP. Это позволит исключить некоторые случаи, когда столбцы в Access отмечаются как #deleted#. Следует учитывать, что при использовании версии MySQL 3.22 необходимо применять патч для MDAC и использовать MyODBC 2.50.32 или 2.50.34 и выше, чтобы обойти эту проблему.

    • Для всех версий Access необходимо включить для MyODBC флаг опции Return matching rows. Для Access 2.0 следует дополнительно включить Simulate ODBC 1.0.

    • Все таблицы, в которых вы хотите иметь возможность обновления, должны содержать столбец типа TIMESTAMP для временных меток. Для максимальной переносимости рекомендуется TIMESTAMP(14) или просто TIMESTAMP вместо других вариантов TIMESTAMP(X).

    • Таблица должна иметь первичный ключ. Если не имеет, то новые или обновленные строки могут выводиться как #DELETED#.

    • Используйте поля с числами с плавающей запятой только двойной точности (типа DOUBLE). Access отказывается работать при сравнении чисел с плавающей запятой одинарной точности. Проявляется это обычно в том, что новые или обновленные строки могут выводиться как #DELETED# или в том, что вы не можете найти или обновить строки.

    • При связывании через MyODBC таблицы, один из столбцов которой имеет тип BIGINT, результат будет выводиться как #DELETED#. Обходное решение заключается в следующем:

      • Добавьте еще один пустой столбец с TIMESTAMP в качестве типа данных, предпочтительно TIMESTAMP(14).

      • Проверьте Change BIGINT columns to INT в диалоговом окне опций подключения в Администраторе источников данных ODBC DSN

      • Удалите данную табличную связь из Access и создайте ее вновь.

      После этого старые записи все равно будут представлены как #DELETED#, а заново добавленные/обновленные записи будут уже выводиться правильно.

    • Если после добавления столбца TIMESTAMP все еще появляется ошибка Another user has changed your data, то, возможно, поможет следующий трюк. Не используйте режим работы ``Таблица''. Вместо этого создайте форму с желаемыми полями и используйте режим работы ``Форма''. Следует установить свойство DefaultValue для столбца TIMESTAMP в NOW(). Возможно, было бы неплохо убрать столбец TIMESTAMP из поля зрения, чтобы не смущать пользователей.

    • В некоторых случаях Access может создавать недопустимые запросы SQL, которые MySQL не может понять. Это можно устранить путем выбора в меню Access опции Query|SQLSpecific|Pass-Through.

    • Access под NT будет сообщать о столбцах BLOB как об объектах OLE. Если вместо этого вы хотите иметь столбцы MEMO, то необходимо изменить тип столбца на TEXT с помощью ALTER TABLE.

    • Access не всегда может правильно обработать столбцы типа DATE. Если с ними возникают проблемы, следует изменить тип этих столбцов на DATETIME.

    • Если Access содержит столбец, определенный как BYTE, то Access будет пытаться экспортировать его как TINYINT вместо TINYINT UNSIGNED. Это будет вызывать проблемы, если величины в данном столбце превышают 127!

  • ADO

    При написании программ с привлечением интерфейса ADO API и MyODBC необходимо обратить внимание на некоторые исходные свойства, которые не поддерживаются сервером MySQL. Например, использование свойства CursorLocation как adUseServer будет возвращать для свойства RecordCount результат -1. Чтобы получить правильную величину, необходимо установить данное свойство в adUseClient, как показано в коде VB ниже:

    Dim myconn As New ADODB.Connection
    Dim myrs As New Recordset
    Dim mySQL As String
    Dim myrows As Long
    
    myconn.Open "DSN=MyODBCsample"
    mySQL = "SELECT * from user"
    myrs.Source = mySQL
    Set myrs.ActiveConnection = myconn
    myrs.CursorLocation = adUseClient
    myrs.Open
    myrows = myrs.RecordCount
    
    myrs.Close
    myconn.Close
    

    Еще один обходной путь состоит в том, чтобы для такого запроса использовать команду SELECT COUNT(*), чтобы получить правильное количество строк.

  • Активные серверные страницы (ASP)

    Необходимо использовать флаг опции Return matching rows.

  • BDE-приложения

    Чтобы заставить их работать, следует установить флаги опций Don't optimize column widths и Return matching rows.

  • Borland Builder 4

    При запуске запроса можно использовать свойство Active или метод Open. Следует учитывать, что Active будет начинать работу при автоматической выдаче запроса SELECT * FROM ..., что может оказаться не так уж и хорошо для больших таблиц!

  • ColdFusion (Под Unix)

    Приведенные далее сведения взяты из документации по ColdFusion. Для применения драйвера unixODBC с источником данных MyODBC следует использовать следующую информацию. Корпорация Allaire подтвердила, что версия MyODBC 2.50.26 работает с версией MySQL 3.22.27 и ColdFusion для Linux (любая более новая версия также должна работать). Драйвер MyODBC можно загрузить с http://www.mysql.com/downloads/api-myodbc.html

    В версии ColdFusion 4.5.1 можно использовать Администратор источников данных ColdFusion для добавления источника данных MySQL. Однако данный драйвер не включен в версию ColdFusion 4.5.1. Чтобы драйвер MySQL появился в выпадающем списке источников данных ODBC, необходимо создать драйвер MyODBC и скопировать его в каталог /opt/coldfusion/lib/libmyodbc.so. Каталог Contrib содержит программу mydsn-xxx.zip, которая позволяет создавать и удалять файл реестра DSN для драйвера MyODBC для приложений Coldfusion.

  • DataJunction

    Необходимо изменить эту программу для вывода VARCHAR вместо ENUM, поскольку экспорт ENUM происходит таким образом, что вызывает неприятности в MySQL.

  • Excel

    Работает. Несколько замечаний:

    • Если существуют проблемы с датами, попробуйте выбирать их как строки, используя функцию CONCAT(). Например:

      select CONCAT(rise_time), CONCAT(set_time)
        from sunrise_sunset;
      

      Величины, извлеченные как строки этим способом, должны корректно распознаваться программой Excel97 как значения времени. Назначение функции CONCAT() в этом примере состоит в том, чтобы ``обмануть'' ODBC, заставив интерпретировать столбец как столбец ``строкового типа''. Без функции CONCAT() ODBC будет считать, что это столбец временного типа, и Excel не распознает его. Следует заметить, что это является ошибкой Excel, поскольку он автоматически преобразует строку в значения времени. Это замечательно если источником является текстовый файл, но это глупо, когда источником является подключение ODBC, дающее точные типы данных для каждого столбца.

  • Word

    Для извлечения данных из MySQL в документы Word/Excel следует использовать драйвер MyODBC и помощь встроенной программы Microsoft Query. Для создания, например, базы данных db с таблицей, содержащей 2 столбца с текстом, необходимо выполнить следующие действия:

    • Вставьте строки, используя командную строку клиента mysql.

    • Создайте файл DSN, используя менеджер ODBC, например, my для созданной выше базы данных db.

    • Откройте приложение Word.

    • Создайте новый пустой документ.

    • Используя панель инструментов вызванной базы данных, нажмите кнопку Insert database.

    • Нажмите кнопку Get Data.

    • В окне Get Data справа нажмите кнопку Ms Query.

    • В окне Ms Query создайте новый источник данных, используя файл DSN my.

    • Выберите новый запрос.

    • Выберите желаемый столбец.

    • Создайте фильтр (при желании).

    • Создайте сортировку (при желании).

    • Выберите Return Data to Microsoft Word.

    • Нажмите кнопку Finish.

    • Нажмите Insert data и выбирайте записи.

    • Нажмите Ok. Вы увидите выбранные строки в своем документе в Word.

  • odbcadmin

    Тестовая программа для ODBC.

  • Delphi

    Необходимо использовать версию BDE 3.2 или более новую. Установите поле опции Don't optimize column width при подключении к MySQL. Кроме того, ниже приводится потенциально полезный код Delphi, который устанавливает вхождения для драйвера MyODBC как в ODBC, так и в BDE. (Запись в BDE требует наличия редактора псевдонимов BDE Alias Editor, который доступен бесплатно на Delphi Super Page. Спасибо за это Брайену Брантону (Bryan Brunton )):

    fReg:= TRegistry.Create;
    fReg.OpenKey('\Software\ODBC\ODBC.INI\DocumentsFab', True);
    fReg.WriteString('Database', 'Documents');
    fReg.WriteString('Description', ' ');
    fReg.WriteString('Driver', 'C:\WINNT\System32\myodbc.dll');
    fReg.WriteString('Flag', '1');
    fReg.WriteString('Password', '');
    fReg.WriteString('Port', ' ');
    fReg.WriteString('Server', 'xmark');
    fReg.WriteString('User', 'winuser');
    fReg.OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources', True);
    fReg.WriteString('DocumentsFab', 'MySQL');
    fReg.CloseKey;
    fReg.Free;
    
    Memo1.Lines.Add('DATABASE NAME=');
    Memo1.Lines.Add('USER NAME=');
    Memo1.Lines.Add('ODBC DSN=DocumentsFab');
    Memo1.Lines.Add('OPEN MODE=READ/WRITE');
    Memo1.Lines.Add('BATCH COUNT=200');
    Memo1.Lines.Add('LANGDRIVER=');
    Memo1.Lines.Add('MAX ROWS=-1');
    Memo1.Lines.Add('SCHEMA CACHE DIR=');
    Memo1.Lines.Add('SCHEMA CACHE SIZE=8');
    Memo1.Lines.Add('SCHEMA CACHE TIME=-1');
    Memo1.Lines.Add('SQLPASSTHRU MODE=SHARED AUTOCOMMIT');
    Memo1.Lines.Add('SQLQRYMODE=');
    Memo1.Lines.Add('ENABLE SCHEMA CACHE=FALSE');
    Memo1.Lines.Add('ENABLE BCD=FALSE');
    Memo1.Lines.Add('ROWSET SIZE=20');
    Memo1.Lines.Add('BLOBS TO CACHE=64');
    Memo1.Lines.Add('BLOB SIZE=32');
    AliasEditor.Add('DocumentsFab','MySQL',Memo1.Lines);
    

  • C++ Builder

    Проведено тестирование с версией BDE 3.0. Единственная обнаруженная проблема состоит в том, что при изменениях схемы таблиц не обновляются поля запросов. Хотя BDE не распознает первичных ключей, а только индекс PRIMARY, тем не менее, это не было проблемой.

  • Vision

    Необходимо использовать флаг опции Return matching rows.

  • Visual Basic

    Чтобы обеспечить возможность обновить таблицу, для нее необходимо определить первичный ключ. Visual Basic с ADO не обрабатывает больших целых чисел. Это означает, что некоторые запросы вроде SHOW PROCESSLIST не будут работать правильно. Для устранения данной проблемы нужно добавить опцию OPTION=16384 в строке подключения ODBC или установить опцию Change BIGINT columns to INT в окне подключения MyODBC. Можно также установить опцию Return matching rows.

  • VisualInterDev

    Если возникает ошибка [Microsoft][ODBC Driver Manager] Driver does not support this parameter, то ее причина может заключаться в том, что результат содержит данные типа BIGINT. Попробуйте установить опцию Change BIGINT columns to INT в окне подключения MyODBC.

  • Visual Objects

    Необходимо использовать флаг опции Don't optimize column widths.

8.3.6. Как получить значение столбца AUTO_INCREMENT в ODBC

Существует распространенная проблема, заключающаяся в том, как получить значение автоматически сгенерированного ID из INSERT. С помощью ODBC можно сделать что-то наподобие следующего (предполагается, что auto представляет собой поле AUTO_INCREMENT ):

INSERT INTO foo (auto,text) VALUES(NULL,'text');
SELECT LAST_INSERT_ID();

Или, если вы просто собираетесь вставить данный ID в другую таблицу, то можно сделать так:

INSERT INTO foo (auto,text) VALUES(NULL,'text');
INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text');

See Раздел 8.4.6.3, «Как получить уникальный идентификатор для последней внесенной строки?».

Для некоторых приложений ODBC (по крайней мере, для Delphi и Access), чтобы найти недавно вставленную строку, можно использовать следующий запрос:

SELECT * FROM tbl_name WHERE auto IS NULL;

8.3.7. Составление отчетов о проблемах с MyODBC

Если встречаются трудности с применением MyODBC, то следует начинать с получения системного журнала менеджера ODBC (журнал, получаемый при затребовании записей в Администраторе ODBC) и журнала MyODBC.

Чтобы получить журнал MyODBC, необходимо выполнить следующие действия:

  1. Убедитесь, что вы используете myodbcd.dll, а не myodbc.dll. Наиболее простой способ - получить файл myodbcd.dll из дистрибутива MyODBC и скопировать его поверх файла myodbc.dll, который должен находиться в вашем каталоге C:\windows\system32 или C:\winnt\system32. Однако после окончания тестирования целесообразно восстановить старый файл myodbc.dll, поскольку он намного быстрее, чем myodbcd.dll.

  2. Включите опцию Trace MyODBC в окне подключения/конфигурации MyODBC. Информация будет записываться в файл C:\myodbc.log. Если опция трассировки не запоминается при возвращении к предыдущему окну, то это означает, что сейчас драйвер myodbcd.dll не используется (см. пункт выше).

  3. Запустите свое приложение и попытайтесь получить отказ в работе.

Проверьте трассировочный файл MyODBC, что бы попытаться выяснить, в чем дело. Можно также найти сделанные вами запросы в файле myodbc.log - поищите в нем строку >mysql_real_query.

Попробуйте также выполнить дублирование этих запросов с помощью монитора mysql или admndemo, чтобы определить, где возникает ошибка - в MyODBC или в MySQL.

Если вы обнаружите какую-либо ошибку, то присылайте, пожалуйста, только строки, имеющие отношение к ней (максимум 40 строк), по адресу . Просьба никогда не присылать полностью весь системный журнал MyODBC или ODBC!

Если у вас нет возможности определить, что именно у вас не так, остается последняя возможность - создать архив (tar или zip), содержащий трассировочный файл MyODBC, системный журнал ODBC и файл README с описанием своей проблемы. Вы можете послать это по адресу ftp://support.mysql.com/pub/mysql/secret/. В MySQL AB только мы будем иметь доступ к присланным вами файлам. Гарантируем, что с ними мы будем обращаться очень осторожно!

Если вы можете создать программу для демонстрации данной проблемы, присылайте, пожалуйста, и ее тоже!

Если эта программа работает с некоторыми другими серверами SQL, следует сделать системный журнал ODBC, где вы делаете в точности то же самое в другом сервере SQL.

Помните, что чем больше информации вы нам предоставите, тем больше вероятность, что мы сможем решить данную проблему!

8.4. Интерфейс C для MySQL

8.4.1. Типы данных C API
8.4.2. Обзор функций интерфейса C
8.4.3. Описание функций интерфейса C
8.4.4. Описания функций C, связанных с потоками
8.4.5. Описания функций C, доступных во встраиваемом сервере
8.4.6. Основные вопросы и проблемы в использовании интерфейса C
8.4.7. Сборка клиентских программ
8.4.8. Как создать клиентскую программу с потоками
8.4.9. libmysqld, встраиваемая библиотека сервера MySQL

Исходный код программного интерфейса (API) C распространяется вместе с MySQL. Он включает в себя библиотеку mysqlclient и обеспечивает возможность доступа к базе данных программам на С.

Многие клиенты исходного дистрибутива MySQL написаны на C. Они являются хорошими примерами для демонстрации использования интерфейса C. Их можно найти их в каталоге clients исходного дистрибутива MySQL.

Большинство других клиентских интерфейсов (за исключением Java) для соединения с сервером MySQL используют библиотеку mysqlclient. Это означает, что, например, можно извлечь определенную выгоду, используя те же переменные окружения, что и в других клиентских программах, поскольку на них есть ссылки из библиотеки (see Раздел 4.8, «Клиентские сценарии и утилиты MySQL», где приведен список этих переменных).

Клиент имеет максимальный размер буфера связи. Начальный размер этого буфера составляет 16 Kб и автоматически увеличивается до максимального значения 16 Mб. Поскольку размеры буфера увеличиваются только при подтверждении запроса на это, то просто увеличение максимального предела по умолчанию само по себе не обеспечит увеличения используемых ресурсов. Проверка этого размера в основном используется для ошибочных запросов и коммуникационных пакетов.

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