Mysql интерфейс с perl (mysql perl api)


Содержание

Как установить libdbd-mysql-perl в Ubuntu / Debian

Установка:

Для установки libdbd-mysql-perl в Ubuntu / Linux Mint / Debian, введите в Терминал :

Подробная информация о пакете:

Интерфейс базы данных Perl5 в базе данных MariaDB/MySQL

DBD :: mysql — это интерфейс интерфейса базы данных Perl5 для базы данных MariaDB/MySQL. Другими словами: DBD :: mysql — это интерфейс между языком программирования Perl и API программирования MySQL, который поставляется с системой управления реляционными базами данных MariaDB/MySQL. Большинство функций, предоставляемых этим API программирования, поддерживаются. Некоторые редко используемые функции отсутствуют, главным образом потому, что никто их не просил. Однако поддерживаемые функции включают: сжатие данных между сервером и клиентом; таймауты; SSL; поддержка подготовленных заявлений; администрирование сервера, например создание и удаление баз данных и перезапуск сервера; автоматическое переподключение; utf8; угадать тип привязки; связывать метки комментариев; автоматические вставки; сделки; множество наборов результатов и многопоточность.

Зависимости:

Библиотека GNU C: общие библиотеки

Интерфейс базы данных Perl (DBI)

Клиентская библиотека базы данных MySQL

Практический язык извлечения и отчета Ларри Уолла

Введение в MySQL (используя Perl DBI)

MySQL — это реляционная база данных. MySQL основана на технологии client/server. Все примеры команд MySQL в этой статье могут быть введены прямо в командную строку MySQL. MySQL поддерживает многострочные команды и использует точку с запятой, как разделитель между командами.

Почему же MySQL, а ни другая база данных SQL?

Хотя бы потому, что она бесплатна, быстра и имеет хорошую поддержку.

Данные организуются как ряды и колонки, образующие матрицу. С точки зрения SQL, матрица называется таблицей.

Лучший способ для C программиста понять что же это такое:

Каждый ряд — это структурная ссылка.

Каждая колонка — это член этой структуры.

Вот обычная структура (класс, объявленный с ключевым словом struct) в C:

Это выглядит как информация, собранная Web-сайтом о пользователе.

А вот MySQL версия этой структуры:

Несколько похоже, не так ли?

Вот как будет выглядеть ряд в MySQL:

Что же тогда матрица? Вот данные в таблице(матрице) о трёх гипотетических пользователях:

Фактически эти таблицы — это то, что вы увидете, если введёте в MySQL следующую команду:

select * from users;

Звёздочка означает, что мы выбираем все колонки из таблицы.

Таблица — это структурная основа многомиллиардной годовой индустрии баз данных, которая включает в себя такие компании, как Oracle и Informix.

Простейшие команды MySQL

Давайте быстро «пробежим» по простейшим командам MySQL. Вы уже занете команду create.

А что же делать, если хотим увидеть только прозвища и любимые числа пользователей?

Данная команда даст нам:

А если хотим вывести прозвища пользователей, но с условием, что носков у них меньше, чем 10 пар и их любимое число больше, чем 100?

Как же ввести данные в таблицу? Это просто.

Да , но мы забыли добавить поле пароля в таблицу!

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

Результат будет следующим:

Но подождите! Мы не определили id! Оно также not null.

В этом случае колонку >

Мы забыли ввести любимое число пользователя Cowlick. Которое, между прочим, -1. Для этого мы будем использовать команду update.

Также можем выполнить это следующим образом:

Но вдруг у нас появится больше чем один пользователь с прозвищем Cowlick? В нашем примере этого быть не может, т.к. в командеcreate table мы определили:

Если мы попробуем ввести ещё одного пользователя с прозвищем Cowlick, то мы получим ошибку от MySQL.

Предположим Вы имеете проблемы с пользователем Javier. Длугие члены вашего общества также считают, что этому пользователю не место среди них, Вы можете сделать следующее

Если же Вы хотите удалить всю таблицу, то необходимо будет сделать следующее.

Определение таблицы и все данные после вышеописанной команды будут удалены. Будьте осторожны с этой командой.

Типы MySQL и primary key

Мы не говорили о директиве primary key в команде create table.

Создаётся первичный ключ. Первичный ключ — это особый ключ, который может быть только один для данной таблицы для каждой аблицы. По сути, первичный ключ — это уникальный (UNIQUE) ключ с именем «PRIMARY». Несмотря на привелегированный статус, он функционирует как другой уникальный ключ. Но

MySQL ограничен маленькими типами данных? Если, конечно, Вы считаете, что 4 гигабайта — это мало, то да. Это размер, который может быть помещён в поля типов LongBlob и LongText.

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

Этот пример предоставил нам два новых типа: datetime и text.

Данные колонки datetime структуированы следующим образом: «YYYY-MM-DD hh:mm:ss». В данном примере поdatetime могут быть отсортированы сообщения. Для нас это всего лишь строка.

Типtextможет содержать данные до 64Kb, что более чем достаточно для сообщения.

Колонка user_id является реляционной частью Реляционной Системы Управления Базой Данных (РСУБД).

Вот пример ряда (message_body может быть более длинным):

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

В этом примере колонка vote может содержать одно из двух: либо ‘good’, либо ‘bad’.

Для поиска голосования сообщения можно будет сделать следующее:

, что будет быстрее, чем:

Но самым быстрым поиском голосования по сообщению будет:

Теперь мы готовы к взаимодействию DBI и MySQL.

Использование Perl DBI как интерфейс для MySQL

Почему PERL? Почему не PHP? Как-никак, но считается, что PHP4 достаточно быстр за счёт нового интерпретатора?

Я отвечу, потому, что Perl — это язык, который наиболее часто сейчас используется. А я люблю идти в ногу со стандартами индустрии. Perl имеет большую поддержку online и большинство книг написано о нём. Существует CPAN, the Comprehensive Perl Archive Network, где Вы можете найти модули для исполнения Ваших самых сокровенных желаний, относительно программирования, конечно :-). DBI даёт Вам интерфейс, который будет работать как с самой примитивной БД, так и с самой последней версией Oracle РСУБД.

Давайте начнём с соединения с базой данных:

Давайте предположим, что мы получили из формы логин и пароль пользователя. Итак,

Естественно наше желание проверить действительно ли введёный пароль соответствует введёному логину в нашей БД.

Отмечу отсутствие точки с запятой. При одной команде она не обязательна.

Как же мы получим результат? Т.к. мы ожидаем всего один ряд то,

Что же делать если результат — более одной строки? Продолжающиеся запросы к

Если же мы хотим сохранить все результаты для последующего использования

Ссылка для программистов на C может быть расценена как указатель. Матрица теперь является массивом массивов ссылок или же двумерным массивов ссылок.

Вы можете достать ряд $i при помощи:

Или, достать нужный ряд и колонку ($i, $j) в таблице:

Для операций MySQL, которые не возвращают результатов можно использовать метод do вместо prepare для того, чтобы выполнить SQL-команду.

И, наконец, чтобы окончить работу с базой — рассоединение:

Mysql интерфейс с perl (mysql perl api)

Для использования интерфейсов rnSQL и MySQL к модулям DataBase Dependent/DataBase

Independent (DBI/DBD) или MsqlPerl и MysqlPerl необходимо иметь следующие компоненты :

В вашей системе должны быть установлены работающие экземпляры Perl 5. Ко времени

написания этой книги последний релиз Perl имел номер 5.005_02. Следует пользоваться по

меньшей мере Perl 5.004, поскольку в более ранних версиях были ошибки , связанные с

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

Независимую от базы данных часть модуля DBI/DBD можно загрузить из Comprehensive Perl

Archive Network (CPAN). На момент написания книги последней версией был DBI-0.90. Он

находится на http://www.perl.com/CPAN/authors/id/TIMB/DBI/DBI-l.06.tar.gz.

Модуль Data::ShowTable упрощает отображение больших объемов данных . Это требуется для

модулей Msql-MysqL Последняя версия — Data-ShowTable-З ., ее можно найти по адресу : http://

В главе 3 «. » подробно рассказано о том , как получить и установить серверы баз

данных mSQL и MySQL.

компилятор С и сопутствующие средства

Для модулей MsqlPerl и MysqlPerl необходим ANSI-совместимый компилятор С , а также

обычные сопутствующие средства , такие как make, Id и т . д . Вам должно хватить тех средств , с

помощью которых вы собрали Perl. Если у вас нет этих инструментов , компилятор GNU С и все

необходимые поддерживающие программы можно бесплатно получить на ftp://ftp.gnu.org/pub/gnu/.

В настоящее время модули Msql-Mysql поддерживает Йохен Видман (Jochen Wiedmann), чье ID в CPAN

выглядит как JWIED. Поэтому текущие модули Msql-Mysql всегда можно найти на http://www.perl.com/

authors/id/JWIED. На момент написания книги текущей версией была Msql-Mysql-modules-1 .20 7.tar.gz.

После загрузки пакета разархивируйте его :

tar xvzf Msql-Mysql-modules-1.2020.tar.gz cd Msql-Mysql-modules-1.2020

В каталоге дистрибутива есть файл INSTALL, содержащий несколько советов по установке . Сначала

нужно выполнить файл Make file.PL:

Эта команда сначала спрашивает , желаете ли вы установить модули для mSQL, MySQL или те и

другие . Можно установить модули для любого установленного вами сервера баз данных .

После проверки системы программа запрашивает местоположение установки mSQL. Это каталог ,

содержащий подкаталоги lib и include, в которых расположены библиотеки и включаемые

файлы mSQL. По умолчанию этим каталогом является /usr/local/Hughes, но обязательно

проверьте это , поскольку во многих системах используется /usr/local или даже /usr/local/Minerva.

Затем сценарий установки запрашивает путь к MySQL. Как и в случае mSQL, это каталог ,

содержащий надлежащие подкаталоги lib и include, по умолчанию — /usr/local. Это расположение

верно для большинства установок , но следует обязательно проверить , не используются ли другие

каталоги ..После установки сценарий создает соответствующие make-файлы и завершается . Затем нужно

запустить make и скомпилировать файлы .

Если вы правильно установили Perl, mSQL и / MySQL, то команда make должна пройти без

ошибок . После завершения ее работы будут созданы все модули , и единственное , что останется —

это протестировать и установить их .

Во время выполнения по экрану пробегает ряд отладочных имен , за каждым из которых должно

следовать . . . ok. И наконец , нужно установить модули .

У вас должно быть разрешение записи в каталог установки Perl. Кроме того , необходимо иметь

разрешение на запись в системный каталог для программ (. /usr/local/bin или /usr/bin), чтобы

установить поставляемые с модулем вспомогательные программы pmsql, pmysql и dbimon.

DBI API является стандартным API баз данных в Perl. Поэтому , хотя MsqPerl и MysqlPerl могут быть

более распространены в унаследованных программах , новые программы следует писать с

Следует объявлять во всех программах Perl, использующих модуль DBI.

DBI::available_drivers возвращает список имеющихся драйверов DBD. Функция выполняет это ,

осуществляя поиск модулей DBD в дистрибуции Perl. Если в аргументе не передано значение true, то

при обнаружении двух одноименных модулей DBD выводится предупреждение . В текущем

дистрибутиве Msql-Mysql драйвер для mSQL называется ‘mSQL’, а драйвер для MySQL — ‘mysq’.

my @drivers = DBI->available_drivers;

print » Доступны следующие драйверы :\n» . join(«\n»,@drivers) . «\n Но нас интересуют только mSQL и mysql. :)\n»;

$result = $statement_handle->bind_col($col_num, \$c61_variable, \%unused);

DBI::bind_col связывает колонку команды SELECT с переменной Perl. При всяком чтении или изменении

колонки изменяется значение соответствующей переменной . Первым аргументом является номер колонки

в команде , при этом колонки нумеруются с 1 . Второй аргумент — ссылка на переменную Perl, которая

должна быть привязана к колонке . Необязательный третий аргумент ссылается на хэш атрибутов . В DBD:

:mysql и DBD: :mSQL он не используется . При невозможности в силу каких -. причин сделать привязку

функция возвращает неопределенное значение undef .

my $db = DBI->Gonnect(1 DBI:mSQL:mydata’,undeffundef);.my $query = «SELECT name, date FROM myothertable»;

my $myothertable_output = $db->prepare($query);

# Теперь $name и $date привязаны к соответствующим полям выходных данных ,

# Каждый раз $name и $date автоматически изменяются ,

print » Имя : $name Дата : $date\n»;

$result = $statement_handle->bind_columns(\%unused, @list_of_refs_to_vars);

DBI::bind_columns привязывает весь список скалярных ссылок к значениям соответствующих полей в выдаче .

Первый аргумент функции — ссылка на хэш атрибутов , как в DBI::bind_col . DBD::mSQL и DBD::mysql не

используют этот аргумент . Последующие аргументы должны быть ссылками на скаляры . Скаляры можно с

таким же успехом группировать в структуру \($var , $var2) . Ссылок на скаляры должно быть ровно столько ,

сколько полей в выходных результатах , иначе выполнение программы будет прекращено .

my $db = DBI->connect(‘DBI:mSQL:mydata’, undef, undef);

my .Squery — «SELECT name, date FROM myothertable»;’

my $myothertable_output = $db->prepare($query);

$myothertable_output->bind_colufnns(undef, \($name, $date));

# $name и $date теперь привязаны к соответствующим полям в выдаче .

# $name и $date каждый раз автоматически изменяются ,

print » Имя :$пате Дата : $date\n»;

$result = $statement_handle->bind_param($param_number, $bind_value);

$result = $statement_handle->bind_param($param_number, $bind_value, $bind_type);

$result = $statement_handle->bind_param($param_numberj $bind_value, \%bind_type);

DBI: :bind_param подставляет в команды действительные значения вместо меток -. *?’ (. DBI: :

prepare). Первый аргумент — номер метки -. в команде , нумерация начинается с 1 ( напра -. ). Второй аргумент — подставляемое значение . Необязательный третий аргумент задает тип

подставляемого значения . Это может быть скаляр или ссылка на хэш вида < TYPE =>&DBI: :SQL_TYPE >

, где ‘SQL_TYPE’ — тип параметра . На момент написания этой книги DBI поддерживал SQL-типы

(. ) SQL_CHAR, SQL_NUMERIC, SQL_DECIMAL, SQL_INTEGER,

SQL_SMALLINT, SQL_FLOAT, SQL_REAL, SQL_DOUBLE и SQL_VARCHAR.. Соответствие их

фактическим типам , используемым DBD::mSQL и DBD::Mysql, не документировано . Тем не менее в

таблице 2 — приведен список соответствия на данный момент . Если подстановка невозможна , функция

Таблица1 . Соответствие типов SQL

SQL_CHAR CHAR TYPE

SQL_INTEGER INT_TYPE FIELD_TYPE_INT24

SQL_ SMALLINT UINT_TYPE FIELD_TYPE_INT24

SQL_REAL REAL TYPE

SQL_VARCHAR TEXT_TYPE FIELD_TYPE_TINY_BLOB

my $db = DBI->connect(‘DBD:msql:mydata’, ‘me’, ‘mypass’);

my Sstatement = $db->prepare(

«SELECT name, date FROM myothertable WHERE name like ? OR name like ?»);

$statement->bind_param(1I 1 J%’, ‘SQL_CHAR’);

# Теперь команда будет такой :

# SELECT name, date FROM myothertable WHERE name like ‘J%’ or name like %oe%


$db = DBI->connect($data_source, $username, $password);

$db = DBI->connect($data_source, Susername, $password, \%attributes);

DBI::connect требует по крайней мере три аргумента и необязательный четвертый . Через возвращаемый

описатель выполняются все операции с сервером базы данных . Первый аргумент является источником

данных . Список имеющихся источников можно получить с помощью DBI::data_sources . Для mSQL и

MySQL формат источника данных ‘DBI:mSQL:$database:$hostname:$ро rt’ и

‘DBI:mysql:$database:$hostname:$port’ соответственно . Можно опустить :$port при соединении через стан —

порт . Аналогично можно опустить : $hostname; $port при соединении с сервером на локальном узле

с помощью сокета Unix. Имя базы данных указывать обязательно .

Второй и третий аргументы — имя пользователя и пароль для подключения к базе данных . Для mSQL оба

аргумента должны иметь значение ‘undef’. Если они заданы как ‘undef’ при работе с MySQL, то у

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

Последний аргумент необязателен и является ссылкой на ассоциативный массив . Данный хэш позволяет

определить некоторые атрибуты соединения . В настоящее время поддерживаются только атрибуты

PrintError, RaiseError и AutoCommit. Для сброса им нужно придать значение 0, для установки — какое -. истинное значение . По умолчанию PrintError и AutoCommit включены , a RaiseError — сброшен . Поскольку в

данное время ни mSQL, ни MySQL не поддерживают транзакции , атрибут AutoCommit должен быть установлен

(. подробно см . Атрибуты ).

При неудаче соединения возвращается неопределенное значение undef, и в $DBI: errstr помещается ошибка ..

my $db1 = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

# Теперь $db1 представляет соединение с базой данных ‘mydata’ на локальном # сервере mSQL.

my $db2=DBI-> connect (‘DBI:mysql:mydata:myserver.com’,’me’,’mypassword’);

# Теперь $db2 представляет соединение с базой данных ‘mydata1 сервера MySQL

# ‘myserver.com’ через порт по умолчанию .

# При соединении использовались имя пользователя ‘me’ и пароль ‘mypassword’.

my $db3 =. DBI->connect(‘DBI:mSQL:mydata’,undef,undef, 1>);

# Теперь $db3 — такое же соединение , как $db1, за исключением того , что # установлен атрибут ‘RaiseError’.

DBI::data_sources принимает в качестве аргумента имя модуля DBD и возвращает все имеющиеся для этого

драйверы базы данных в формате , пригодном к использованию в качестве источника данных функцией

DBI. connect . Программа заканчивает свое выполнение с ошибкой , если задано неверное имя драйвера DBD.

В текущих версиях модулей Msql-Mysql драйвер для mSQL называется ‘mSQL’, а для MySQL-‘mysql’.

my @msql_data_sources = DBI->data_sources(‘mSOL’);

my @mysql_data_sources — DBI

# Должны быть установлены DBD::mSQL и DBD::mysql, иначе # выполнение программы прекратится .

print «mSQL databases:\n» . join(«\n»,@msql_data_sources) , «\n\n»;

print «MySQL databases:\n» . join(«\n»I@mysql_data_sources) . «\n\n»;

$rows_affected = $db->do($statement, \%unused);

$rows_affected = $db->do($statement, \%unused, @bind_values);

DBI::do непосредственно выполняет SQL-команду , не являющуюся командой SELECT, и возвращает число

измененных строк . Этот способ быстрее , чем пара DBI::prepare/DBI::execute, требующая два вызова функции .

Первый аргумент — сама команда SQL. Второй аргумент не используется в DBD::mSQL и DBD::mysql, но для других

модулей DBD может содержать ссылку на хэш атрибутов . Последний аргумент — массив значений для

подстановки в команду вместо меток — ‘?’. Подстановка происходит слева направо . Дополнительно

DBI::do автоматически заключит подставляемые строковые значения в кавычки .

my $db = DBI->connect(‘DBI:mSGL:mydata’,undef,undef);

$db->do(«UPDATE mytable SET name-‘Joe’ WHERE name-‘Bob'»);

print «$rows_affected Joe заменены на Bob’s\n»;

$db->do(«INSERT INTO mytable (name) VALUES (?)», <>,'(«Sheldon’s Cycle»>);

# После заключения в кавычки и подстановки # серверу базы данных посылается команда
#INSERT INTO mytable (name) VALUES (‘Sheldon’s Cycle’).

DBI::disconnect отсоединяет описатель базы данных от сервера баз данных . Для mSQL и MySQL в этом обычно

нет необходимости , поскольку эти базы данных не поддерживают транзакций , и неожиданное отсоединение

не причинит вреда . Однако от баз данных , поддерживающих транзакции , нужно отсоединяться явным

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

перед выходом . При ошибке во время отсоединения возвращается ненулевое значение , и в $DBI::ег rst

my $db1 = DBI->connect(‘DBI:mSQL:mydata», undef, undef);

my $db2 = DBI->connect(‘DBI:mSQL:mydata2’,undef,undef);

# Соединение ‘mydata’ разорвано . Соединение с ‘mydata2’

$neat_rows = DBI:dump_results($statement_handle, $niaxlen);

$neat_rows = DBI::dump_results($’statement_handle, $maxlen, $line_sep);

$neat_rows — DBI::dump_results($statenient_handle, $maxlen, $line_sep, $field_sep);

$neat_rows = DBI::dump_results($statement_handle, $maxlen, $line_sep, $f i el d_sep, $f i l e_handle);

DBI. dump_results выводит содержание описателя команды в удобном и упорядоченном виде , применяя к

каждой строке DBI::neat_string. Функцию удобно использовать для быстрой проверки результатов за -. во время разработки программы . Единственный обязательный аргумент — описатель команды .

Второй аргумент , если имеется , задает максимальный размер полей в таблице , по умолчанию равный 35.

Третий аргумент задает строку , используемую для разграничения строк данных , по умолчанию — \.

Четвертый аргумент задает строку , используемую для разделения значений полей в строке , по умолчанию

используется запятая . Последний аргумент задает ссылку на глобальный описатель файла , в который

выводятся результаты . По умолчанию это STDOUT. Если невозможно прочесть описатель команды ,

возвращается значение undef.

my $db = DBI->connect( ‘DBI:mSQL:mydata’, undef, undef);

my $query = «SELECT name, date FROM myothertable»;

my $myothertable_output = $db->prepare($query);

# Вывести результаты в аккуратной таблице .

open (MYOTHERTABLE, «myothertable»);

print DBI::dump_results($myothertable_output, undef, undef, undef, \*MYOTHERTABLE);

# Снова вывести результаты в файл ‘myothertable’.

$DBI::e r r возвращает код последней по времени ошибки DBI. Код ошибки соответствует сообщению об

ошибке , возвращаемому функцией $DBI::errstr . Переменная $DBI::err выполняет ту же задачу . Эта функция

применима с описателями как баз данных , так и команд ..

my $db = DBI->connect(‘DBI:mysql:mydata’,’webuser’,’super_secret_squirrel’);

# Этот запрос имеет синтаксическую ошибку .

my $output = $db->prepare(‘SLECT * from mydata’);

print «Error $DBI:err: $DBI:errstr\n»;

Эта функция возвращает сообщение о последней происшедшей ошибке DBI. Значение сохраняется до

возникновения новой ошибки , когда оно будет заменено . Если во время данного сеанса ошибок не было ,

функция возвращает undef. Переменная $DBI::errstr выполняет ту же задачу . Эта функция применима с

описателями как баз данных , так и команд .

my $db = DBI->connect(‘DBI:mysql:mydata’,’webuser’,’super_secret_squirrel’);

my $error = $db->errstr;

warn («Вот последняя ошибка DBI: $error»);

DBI::execute выполняет SQL-команду , содержащуюся в описателе команды . Для запроса , не являющегося

SELECT, функция возвращает число измененных строк . Функция возвращает -, если число строк неиз -. Для запроса типа SELECT при успехе возвращается истинное значение . Если заданы аргументы , они

используются для подстановки имеющихся в команде меток — (. DBI. p r epar e).

my $db = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

my $statement_handle = $db->prepare(«SELECT * FROM mytable»);

my $statementjiandle2 = $db->prepare(«SELECT name, date FROM myothertable

WHERE name like ?»);

# Выполнена первая команда . К значениям можно # обращаться через описатель .

# Выполнена вторая команда следующего содержания :

# SELECT name, date FROM myothertable WHERE name like ‘J%’

DBI::fetchall_arrayref возвращает все оставшиеся данные в описателе команды в виде ссылки на

массив . Каждая строка массива — ссылка на другой массив , в котором содержатся данные этой строки .

Если в описателе команды нет данных , функция возвращает неопределенное значение undef. Если с

этим описателем команды уже выполнялись функции DBI: :fetchrow_ *, то DBI: :fetchall_arrayref

возвращает все данные , оставшиеся после последнего обращения к DBI: : fetchrow_ *..

my $db = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

my $query = «SELECT name, date FROM myothertable»;

my $output = $db->prepare($query);

my $data = $output->fetchall_arrayref;

# Теперь $data является ссылкой на массив массивов . Каждый элемент #’ главного ‘ массива сам является ссылкой на массив , содержащий строку данных .

print » Четвертой строкой данных в таблице является : » , $data->[3][1] . «\п «;

# Элемент 3 ‘ главного ‘ массива является массивом , содержащим четвертую # строку данных .

# Элемент 1 этого массива является датой .

DBI : :fetchrow возвращает очередную строку данных из описателя команды , созданного DBI: :execute .

Каждое последующее обращение к DBI : :fetchrow возвращает очередную строку данных . Когда данных

больше нет , функция возвращает неопределенное значение u n d e f . Порядок элементов в результирующем

массиве определяется исходным запросом . Если запрос имел вид SELECT * FROM . . . , то элементы следуют в

том порядке , в котором они были определены в таблице .

my $db = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

my $query = «SELECT name, date FROM myothertable WHERE name LIKE ‘Bob%'»;

my $myothertable_output = $db->prepare($query).;

# Это первая строка из $myothertable_output.

($name, $date) = $myothertable_output->fetchrow_array;

# Это следующая строка .

($name, $date) = $myothertable_output->.fetchrow_array;

my @name_and_date = $myothertable_output->fetchrow_array;

DBI::fetchrow_arrayref и ее псевдоним DBI. fetch работают точно так же , как DBI::fetchrow_array , но

возвращают не фактический массив , а ссылку на него .

my $db = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

my $query = «SELECT name, date FROM myothertable WHERE name LIKE ‘Bob%'»;

my $myothertable_output — $db->prepare($query);

my $name1 = $myothertable_output->fetch->[0]

# Это поле ‘name’ из первой строки данных ,

my $date2 = $myothertable_output->fetch->[1]

# Это поле ‘date’ из второй строки данных ,.my ($name3, $date3) = @<$myothertable_output->fetch>;

# Это целиком третья строка данных .

# возвращает ссылку на массив . Можно ‘ преобразовать ‘ ее в действительный # массив , используя конструкцию @<>.

DBI::fetchrow_hashref работает так же , как DBI::fetchrow_arrayref , но возвращает ссылку на

ассоциативный , а не на обычный массив . Ключами хэша являются имена полей , а значениями — значения в

этой строке данных .

my $db = DBI->connect(‘DBI:mSQL:mydata’, undef, undef);

my $query = «SELECT * FROM mytable»;

my $mytable_output = $db->prepare($query);

my %row1 = $mytable_ouput->fetchrow_hashref;

my @field_names = keys %row1;

# @field_names содержит — теперь имена всех полей в запросе .

# Это делается только один раз . Во всех следующих строках будут те же поля .

my @row1 = values %row1;

DBI::finish освобождает все данные в описателе команды , чтобы можно было уничтожить описатель или

снова подготовить его . Некоторым серверам баз данных это необходимо для освобождения соответству —

ресурсов . DBD::mSQL и DBD::mysql не нуждаются в этой функции , но для переносимости кода

следует использовать ее по окончании работы с описателем команды . Функция возвращает неопределенное

значение undef, если описатель не удается освободить .

my $db — DBI->connect(‘DBI:mysql:mydata’, ‘me’,’mypassword’);

my $query = «SELECT * FROM mytable»;

my $mytable_output — $db->prepare($query);

# Теперь можно переназначить $mytable_output или подготовить для него # другую команду SQL.

@dbs = $db->func(«$hostname», ‘_ListDBs’);

@dbs = $db->func(«$hostname:Sport», ‘_ListDBs’);

>func( $database, ‘_CreateDB’ );

$result = $drh->func( $database, ‘_DropDB’ );

DBI::func вызывает специализированные непереносимые функции , включенные в различные драйверы

DBD. Она используется с описателем базы данных или описателем команды , в зависимости от назначения

специализированной функции . По возможности следует использовать равносильную переносимую функцию .

При использовании специализированной функции сначала передаются ее аргументы как скаляр , а затем — имя.функции . DBD::mSQL и DBD::mysql реализуют следующие функции :

Функция _ListDBs принимает имя узла и необязательный номер порта и возвращает список

имеющихся у сервера баз данных . Лучше использовать переносимую функцию DBI::data_sources .

Функция _ListTables возвращает список таблиц , имеющихся в текущей базе данных .

Функция _CreateDB принимает в качестве аргумента имя базы данных и пытается создать эту базу

данных на сервере . Для работы с этой функцией необходимо иметь право создания баз данных .

Функция возвращает — в случае неудачи и 0 в случае успеха .

Функция _DropDB принимает в качестве аргумента имя базы данных и пытается удалить с сервера

эту базу данных . Данная функция не выводит пользователю сообщений и при успешном выполнении

удаляет базу данных навсегда . Для работы с этой функцией необходимо иметь право удаления баз

данных . Функция возвращает — в случае неудачи и 0 в случае успеха .

my $db = DBI->connect(‘DBI:mysql:mydata’,’me 1 , ‘mypassword’);

my @tables = $db->func(‘_ListTables’);

# @tables содержит теперь список таблиц в ‘mydata’.

$neat_string.= DBI::neat($string); $neat_string — DBI: :neat(.$string, $maxlen);

DBI::neat принимает в качестве аргументов строку и необязательную длину . Затем строка форматируется для

аккуратного вывода . Вся строка заключается в одиночные кавычки . Непечатаемые символы заменяются


точками . Если задан аргумент длины , все символы после максимальной длины удаляются , а строка

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

my $string = » Это очень , очень длинная строка , в которой много чего написано .»;

my $neat_string = DBI::neat($string,14);

# Теперь $neat_string такая :’ Это очень , оче . «

$neat_string = DBI;:neat_list(\@listref, Smaxlen);

$neat_string = DBI::neat_list(\@listref, $maxlen, $fi§ld_seperator);

DBI: :neat_list принимает три аргумента и возвращает аккуратно отформатированную строку , пригодную для

вывода . Первый аргумент содержит ссылку на список выводимых значений . Второй аргумент —

длина каждого поля . Последний аргумент — строка , используемая для разделения полей . Для каждого

элемента списка вызывается DBI:: neat с использованием заданной максимальной длины . В результирующих

строках для разделения полей используется последний аргумент . Если последний аргумент не задан , в

качестве разделителя применяется запятая .

my @list = (‘Bob’, ‘Joe’, ‘Frank’);.my $neat_string = DBI::neat_list(\@list, 3);

# Теперь $neat_string такая : ‘Bob’, ‘Joe’, ‘Fra. ‘

$statement_handle = $db->prepare($statement); $statement_handle = $db->

DBI::prepare принимает в качестве аргумента SQL-команду , которую некоторые модули баз данных

переводят во внутреннюю компилированную форму , исполняемую быстрее при вызове DBI:: execute . Эти мо —

DBD ( DBD::mSQL или DBD::mysql) принимают также ссылку на хэш необязательных атрибутов .

Серверы mSQL и MySQL в настоящее время не реализуют концепцию подготовки команд , поэтому DBI::

prepa re просто запоминает команду . По желанию вместо значений данных в команду можно вставить любое

количество символов ‘?’. Эти символы известны как метки — (placeholders). Функция DBI:

;bincLparam осуществляет подстановку действительных значений вместо меток -. Если по какой -. причине команду нельзя подготовить , функция возвращает undef.

my $db = DBI->connect(‘DBI:mysql:mydata’, ‘me’,’mypassword’);

my $statement_handle = $db->prepare(‘SELECT * FROM mytable’);

# Теперь эта команда готова к выполнению .

My $statement_handle = $db->prepare(

‘SELECT name, date FROM myothertable WHERE name like ?’);

# Эта команда будет готова к выполнению после подстановки # с использованием функции DBI::bind_param.

DBI : : quote принимает строку для использования в качестве запроса SQL и возвращает ее копию с правильно

расставленными для ввода в запрос кавычками , в том числе расставляя корректные кавычки по концам

my $db1 = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

my $db2 = DBI->connect(‘DBI:mysql:myotherdata’, ‘me’,’mypassword’);

my Sstring = «Sheldon’s Cycle»;

my $qs1 = $db1->quote($string);

# $qs1: ‘Sheldon\’s Cycle’ ( включая наружные кавычки )

my $qs2 = $db2->quote($string);

# $qs2 : ‘Sheldon’s Cycle’ ( включая наружные кавычки ).

# Теперь обе строки годятся для использования в командах для своих # соответствующих серверов баз данных .

DBI: : rows возвращает число строк данных , содержащихся в описателе команды . Для DBD::mSQL и DBD::mysql

эта функция дает точное число для всех команд , включая SELECT. Для многих других драйверов , которые не

хранят в памяти сразу все результаты , эта функция надежно работает только для команд , не являющихся

SELECT. Это следует учитывать при написании переносимых программ . Функция возвращает -, если по

какой -. причине число строк неизвестно . Переменная $DBI: ; rows выполняет ту же задачу .

my $db = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

my $query = «SELECT name, date FROM myothertable WHERE name=’Bob'»;

my $myothertable_output = $db->prepare($query);

my $rows = $myothertable_output->rows;

print » В таблице ‘myothertable’ есть $rows строк ‘ ВоЬ ‘\n»;

DBI. state возвращает код ошибки SQL SQLSTATE последней по времени ошибки DBI. В данное время

DBD::mSQL и DBD;:mysql сообщают ‘S 000’ для всех ошибок . Эта функция доступна для описателей баз

данных и команд . Переменная $DBI::state выполняет ту же задачу .

my $db = DBI->connect(‘DBI:mysql:mydata’, ‘webuser’, ‘super_secret_squirrel’);

my $sql_error = $db->state;

warn(“Bor последняя по времени ошибка DBI SQL: $sql_error»);

DBI::trace используется в основном для отладки . Если уровень трассировки установлен равным 2, выводится

полная отладочная информация . Установка уровня 0 отключает трассировку . DBI->trace осуществляет

трассировку для всех описателей , a $handle->trace — только для данного описателя — базы данных или команды .

При наличии DBI->trace или $handle->trace второго аргумента отладочная информация выводится в

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

DBI_TRACE. Если переменная окружения установлена равной числу ( настоящее время 0 или 2), включается

трассировка всех описателей на этом уровне . При другом значении переменной уровень трассировки

устанавливается равным 2, а само значение используется в качестве имени файла для вывода отладочной

my $db1 = DBI->connect(‘DBI:mysql:mydata’, ‘webuser’,’super_secret_squirrel’);

my $db2 = DBI->connect(‘DBI:mSQL:myotherdata’,undef,undef);

# Включена трассировка для всех описателей на уровне 2.

# Отключена трассировка для $db2, но продолжает действовать для $db1

# Теперь включена трассировка для всех описателей на уровне 2, выдача # посылается в файл ‘DBI.trace’.

$result = $db->rollback;.$result = $db->ping;

DBI::commit и DBI::rollback полезны только при работе с серверами , поддерживающими транзакции . При

работе с DBD::mSQL и DBD::mysql они не оказывают никакого эффекта . DBD: :ping пытается проверить ,

запущен ли сервер базы данных . В DBD::mSQL и DBD: :mysql она не реализована .

$statement_handle-> ( MySQL è mSQL 1.x

В DBI.pm API определено несколько атрибутов , которые можно читать и устанавливать в любой

момент . Присвоение значения атрибуту может определенным образом изменить поведение текущего

соединения . Присвоение любого отличного от нуля значения атрибуту устанавливает его . Присвоение

значения 0 атрибуту сбрасывает его . Некоторые значения определены только для конкретных баз

данных и непереносимы . Ниже следуют атрибуты , применимые как к описателям баз данных , так и к

Этот атрибут оказывает влияние на поведение серверов баз данных , поддерживающих транзакции .

Для mSQL и MySQL он всегда должен быть установлен ( по умолчанию ). Попытка

изменить его прерывает выполнение программы .

При установке этого атрибута отсекаются все ведущие и замыкающие пробелы в данных ,

возвращаемых запросом (, при вызове DBI::fetch row ).. Все производные от данного описатели

наследуют значение этого атрибута . Значение по умолчанию — «. ».

Назначение этого атрибута — сохранить процесс при ветвлении (fork), чтобы дочерний процесс мог

пользоваться родительским описателем . Его следует установить в родительском или дочернем

процессе , но не в обоих . Значение по умолчанию — «. ».

При установке этого атрибута выводятся все предупредительные сообщения . При сброшенном.атрибуте доступ к ошибкам осуществляется только через $DBI::errstr. Все производные от данного

описатели наследуют значение этого атрибута . Значение по умолчанию -«установлен ».

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

прерывая ее выполнение , если не определен обработчик ‘_DIE_’. Все описатели , производные от

этого , наследуют значение этого атрибута . Значение по умолчанию -«сброшен ».

При установке этого атрибута выводятся предупредительные сообщения о неудачных приемах

программирования (. пережитках Perl 4). Сброс этого атрибута отключает предупреждения

DBI, что допустимо только при полной уверенности в своем мастерстве . Все производные от данного

описатели (, описатель команды , происходящий от описателя базы данных ) наследуют

значение этого атрибута . Значение по умолчанию — «. ».

Непереносимый атрибут , определенный только для DBD::mysql. Он возвращает из таблицы текущее

значение поля auto_increment ( таковое имеется ). Если поле auto_increment не существует ,

атрибут возвращает undef.

Это непереносимый атрибут , определенный только для DBD::mysql. Атрибут возвращает ссылку на

массив булевых значений , указывающих для каждого из содержащихся в описателе команды полей ,

имеет ли оно тип BLOB. Для описателя команды , который был создан не выражением SELECT,

$statement_handle-> возвращает undef.

Непереносимый атрибут , определенный только для DBD::mysql. Он возвращает ссылку на массив

булевых значений , указывающих для каждого из содержащихся в описателе команды полей ,

определено ли оно как KEY. Для описателя команды , который был создан не выражением SELECT,

$statement_handle-> возвращает undef.

Это непереносимый атрибут , определенный только для DBD::mSQL и DBD::mysql. Он возвращает

ссылку на массив булевых значений , указывающих для каждого из содержащихся в описателе

команды полей , определено ли оно как ‘NOT NULL’ . Для описателя команды , который был создан не

выражением SELECT, данный атрибут возвращает undef. Того же результата можно достичь в

переносимом виде , используя $statement_handle-> .

Это непереносимый атрибут , определенный только для DBD::mSQL и DBD::mysql. Атрибут

возвращает ссылку на массив булевых значений , указывающих для каждого из содержащихся в

описателе команды полей , имеет ли оно числовой тип . Для описателя команды , созданного не

выражением SELECT, $ s t at ement _handl e-> возвращает undef.

Это непереносимый атрибут , определенный только для DBD::mSQL и DBD::mysql. При

использовании с DBD::mSQL он оказывает влияние только для серверов mSQLl.x, поскольку mSQL2.x

не использует первичные ключи . Атрибут возвращает ссылку на массив булевых значений ,

указывающих для каждого из содержащихся в описателе команды полей , является ли оно первичным

Для описателя команды , созданного не выражением SELECT, данный атрибут возвращает undef.

$statenent_handle->.Непереносимый атрибут , определенный только для DBD::mSQL и DBD::mysql. Этот атрибут

Илон Маск рекомендует:  Что такое код memccpy

возвращает ссылку на список максимально допустимых размеров полей , содержащихся в описателе

команды . Для описателя команды , который был создан не выражением SELECT, $statement_handle-><

length> возвращает undef.

Это непереносимый атрибут , определенный только для DBD::mysql. Атрибут возвращает ссылку на

список фактических максимальных размеров полей , содержащихся в описателе команды . Для

описателя команды , который был создан не выражением SELECT, данный атрибут возвращает undef.

Атрибут возвращает ссылку на список имен полей , содержащихся в описателе команды . Для

описателя команды , который был создан не выражением SELECT, $staternent_handle-> возвращает

Этот атрибут возвращает ссылку на массив булевых значений , указывающих для каждого из

содержащихся в описателе команды полей , может ли оно иметь значение NULL. Поле , определенное как

‘NOT NULL’ , даст в списке значение 0. Остальные поля дадут значение 1 . Для описателя команды ,

созданного не выражением SELECT, атрибут возвращает undef.

Атрибут возвращает число колонок данных , содержащихся в описателе команды . Для описателя

команды , который был создан не выражением SELECT, $statement_handle-> возвращает

Этот атрибут возвращает число меток — в описателе команды . Метки —

обозначаются в команде символом ‘?’. Для подстановки вместо меток — надлежащих

значений используется функция DBI:: bind_values .

Это непереносимый атрибут , определенный только для DBD: rmSQL и DBD::mysql. Атрибут

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

использовать для SELECT с соединением нескольких таблиц .

Непереносимый атрибут , определенный только для DBD::mSQL и DBD::mysql. Он возвращает

ссылку на список типов полей , содержащихся в описателе команды . Для описателя команды , создан -.

не выражением SELECT, $statement_handle-> возвращает undef. Значениями списка

являются целые числа , соответствующие перечислению в заголовочном файле С mysql_com.h из

дистрибутива MySQL. Сейчас способа доступа к именам этих типов из DBI не существует . Но доступ

к типам возможен через функцию &Mysql::FIELD_TYPE_ * в Mysql.pm. В DBD::mysql имеется также недоку -. атрибут $statement_handle->, идентичный

$statement_handle->, за исключением того , что вместо целых чисел возвращает SQL-

Perl MySQL Connect

Summary: in this tutorial, we will show you step by step how to connect to and disconnect from a MySQL database using Perl DBI API.

Let’s get started by creating a simple database in MySQL named perlmysqldb for the demonstration.

Connecting to MySQL database

When you connect to a MySQL database, you need to specify the following information:

  • First, you need to tell DBI where to find the MySQL database server. This information is called data source name or DSN. The data source name specifies which driver to use, what database that you want to connect to. Perl requires the data source name to begin with dbi: and the name of the driver, in this case, it is mysql , followed by another colon : e.g., dbi:mysql: , and then the database name e.g., dbi:mysql:perlmysqldb .
  • Second, you need to provide the username and password of the MySQL account that you connect to the database.
  • Third, the optional connection attributes specify the way DBI handles exceptions that may occur when it connects to the MySQL database.

The syntax for creating a connection to the MySQL database is as follows:

The connect() method returns a database handle if the connection to the database established successfully. For example to connect to the perlmysqldb , you use the following script:

Mysql интерфейс с perl (mysql perl api)

Унифицированные методы 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 описаны в следующих разделах. Возвращаемые переменные:

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

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

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

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

connect($data_source, $username, $password)

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

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

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

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

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

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

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

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

Н апример, если вы не хотите явно указывать имя пользователя и пароль в программе, использующей DBI , можно внести эту информацию в файл '

/.my.cnf', написав вызов connect . Это делается следующим образом:

Д анный пример считает настройки из группы [client] файла '


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Трассировку 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 . Ниже указаны возможные стандартные альтернативы, если они существуют:

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

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

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

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

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

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

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

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

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

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

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

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

Mysql интерфейс с perl (mysql perl api)

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

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

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

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

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

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

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

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

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

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

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

Если у вас уже установлены модули MySQL, то вы можете найти информацию о специфике функциональности 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 описаны в следующих разделах. Возвращаемые переменные:

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

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

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

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

connect($data_source, $username, $password)

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

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

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

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

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

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

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

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

Например, если вы не хотите явно указывать имя пользователя и пароль в программе, использующей DBI , можно внести эту информацию в файл

/.my.cnf , написав вызов connect . Это делается следующим образом:

Данный пример считает настройки из группы [client] файла

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Трассировку 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 . Ниже указаны возможные стандартные альтернативы, если они существуют:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 можно получить следующую ошибку:

Проблема здесь заключается в том, что некоторая другая программа в это же время использует 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 (Готово).

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

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

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

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

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

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

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

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

Значением поля 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() .

Параметр Величина по умолчанию Комментарий
user ODBC (под Windows) Имя пользователя, используемое для подключения к MySQL.
server localhost Имя хоста сервера MySQL.
database База данных по умолчанию.
option Целое число, с помощью которого можно указать, как должен работать драйвер MyODBC (см. ниже).
port 3306 Используемый порт 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 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# . Обходное решение заключается в следующем:

Илон Маск рекомендует:  Mdi многодокументный интерфейс

Добавьте еще один пустой столбец с 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 API и MyODBC необходимо обратить внимание на некоторые исходные свойства, которые не поддерживаются сервером MySQL. Например, использование свойства CursorLocation как adUseServer будет возвращать для свойства RecordCount результат -1. Чтобы получить правильную величину, необходимо установить данное свойство в adUseClient , как показано в коде VB ниже:

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

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

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

Чтобы заставить их работать, следует установить флаги опций 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.

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

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

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

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

Для извлечения данных из 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Проверьте трассировочный файл 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

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

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

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

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

Буфер связи должен быть достаточно большим, чтобы вмещать целую SQL-команду (для потока клиент-сервер) и целую строку возвращенных данных (для потока сервер-клиент). Буфер связи для каждого из потоков динамически увеличивается до максимального значения, чтобы обработать любой запрос или строку. Например, для данных типа BLOB объемом до 16 Mб необходим предел буфера связи по меньшей мере в 16 Mб (как для сервера, так и для клиента). Максимальное значение по умолчанию для клиента составляет 16 Mб, а для сервера максимум по умолчанию равен 1Mб. Можно увеличить этот объем, изменив величину параметра max_allowed_packet при запуске сервера (see Раздел 5.5.2, «Настройка параметров сервера»).

Сервер MySQL сжимает каждый буфер связи до величины net_buffer_length байтов после каждого запроса. Для клиентов размер буфера, связанного с соединением, не уменьшается, пока не будет закрыто данное соединение и при этом не будет освобождена выделенная клиенту память.

Программирование с учетом потоков описано в разделе See Раздел 8.4.8, «Как создать клиентскую программу с потоками». При создании автономного приложения, включающего и «сервер», и «клиент» в одной и той же программе (и не взаимодействующего с внешним сервером MySQL), обращайтесь к разделу See Раздел 8.4.9, «libmysqld, встраиваемая библиотека сервера MySQL».

8.4.1. Типы данных C API

Данная структура представляет дескриптор соединения с базой данных. Используется почти во всех функциях MySQL.

Эта структура содержит результат запроса, возвратившего строки ( SELECT , SHOW , DESCRIBE , EXPLAIN ). Возвращенная из запроса информация далее в этом разделе называется результирующим набором данных.

Является «типобезопасным» представлением данных одной строки. В настоящее время этот тип реализован как массив строк с фиксированным количеством байтов (их нельзя трактовать как строки с нулевым символом в конце, если величины полей могут содержать двоичные данные, поскольку они могут содержать ноль байтов). Строки можно получить вызовом функции mysql_fetch_row() .

Данная структура содержит информацию об отдельном поле таблицы: имя поля, тип и его размер. Элементы данной структуры детально описаны в этом разделе ниже. Для каждого поля можно получить структуру MYSQL_FIELD , последовательно вызывая функцию mysql_fetch_field() . Величины полей не являются частью данной структуры, они содержатся в структуре MYSQL_ROW .

«Типобезопасное» представление позиции поля в списке полей MySQL. (используется функцией mysql_field_seek() ). Позиции представляют собой номера полей внутри строки, причем нумерация начинается с нуля.

Данный тип используется для возврата количества строк, а также в функциях mysql_affected_rows() , mysql_num_rows() и mysql_insert_id() . Этот тип обеспечивает диапазон изменений величин от 0 до 1.84e19. Может не работать в некоторых системах при выводе величины типа my_ulonglong . Для вывода подобной величины следует преобразовать ее в тип unsigned long и использовать формат %lu . Пример:

Структура MYSQL_FIELD содержит следующие перечисленные ниже элементы:

Имя данного поля, заданное строкой с нулевым символом в конце.

Имя таблицы, содержащей это поле, если оно невычисляемое. Для полей, получаемых в результате вычислений, величина table представляет собой пустую строку.

Значение по умолчанию этого поля, заданное строкой с нулевым символом в конце. Задается только при использовании функции mysql_list_fields() .

enum enum_field_types type

Тип данного поля. Величина type может быть одной из следующих:

Тип величины Описание типа
FIELD_TYPE_TINY Поле TINYINT
FIELD_TYPE_SHORT Поле SMALLINT
FIELD_TYPE_LONG Поле INTEGER
FIELD_TYPE_INT24 Поле MEDIUMINT
FIELD_TYPE_LONGLONG Поле BIGINT
FIELD_TYPE_DECIMAL Поле DECIMAL или NUMERIC
FIELD_TYPE_FLOAT Поле FLOAT
FIELD_TYPE_DOUBLE Поле DOUBLE или REAL
FIELD_TYPE_TIMESTAMP Поле TIMESTAMP
FIELD_TYPE_DATE Поле DATE
FIELD_TYPE_TIME Поле TIME
FIELD_TYPE_DATETIME Поле DATETIME
FIELD_TYPE_YEAR Поле YEAR
FIELD_TYPE_STRING Строка поля ( CHAR или VARCHAR )
FIELD_TYPE_BLOB BLOB или TEXT поле (используется max_length для определения максимальной длинны)
FIELD_TYPE_SET Поле типа SET
FIELD_TYPE_ENUM Поле типа ENUM
FIELD_TYPE_NULL Поле типа NULL
FIELD_TYPE_CHAR Не рекомендуется; лучше использовать FIELD_TYPE_TINY

Можно использовать макрос IS_NUM() для проверки, является ли тип поля числовым. В макросе IS_NUM() следует указать величину type и, если поле имеет числовой тип, будет возвращено значение TRUE :

unsigned int length

Размер данного поля в том виде, в каком он указан в определении таблицы.

unsigned int max_length

Максимальный размер данного поля в результирующем наборе данных (длина самой большой величины поля для строк в текущем результирующем наборе данных). При использовании mysql_store_result() или mysql_list_fields() данная переменная содержит максимальную длину для данного поля. При использовании mysql_use_result() значение этой переменной равно нулю.

unsigned int flags

Различные двоичные флаги для данного поля. Величина flags может иметь ноль или больше двоичных значений следующего набора флагов:

Значение флага описание флага
NOT_NULL_FLAG Поле не может содержать значение NULL
PRI_KEY_FLAG Поле является частью первичного ключа
UNIQUE_KEY_FLAG Поле является частью уникального ключа
MULTIPLE_KEY_FLAG Поле является частью не уникального ключа
UNSIGNED_FLAG Поле имеет атрибут UNSIGNED
ZEROFILL_FLAG Поле имеет атрибут ZEROFILL
BINARY_FLAG Поле имеет атрибут BINARY
AUTO_INCREMENT_FLAG Поле имеет атрибут AUTO_INCREMENT
ENUM_FLAG Поле имеет тип ENUM (не рекомендуется)
SET_FLAG Поле имеет тип SET (не рекомендуется)
BLOB_FLAG Поле имеет тип BLOB или TEXT (не рекомендуется)
TIMESTAMP_FLAG Поле имеет тип TIMESTAMP (не рекомендуется)

Использование флагов BLOB_FLAG , ENUM_FLAG , SET_FLAG и TIMESTAMP_FLAG не рекомендуется, поскольку они указывают скорее тип поля, чем атрибут этого типа. Вместо этого более предпочтительно определять тип поля описанным выше способом field->type в отношении полей FIELD_TYPE_BLOB , FIELD_TYPE_ENUM , FIELD_TYPE_SET или FIELD_TYPE_TIMESTAMP . Следующий пример иллюстрирует типичное использование величины flags :

Можно использовать следующие возможности макросов для определения булевого значения величины flags :

Статус флага Описание
IS_NOT_NULL(flags) Возвращает TRUE, если данное поле определено как NOT NULL
IS_PRI_KEY(flags) Возвращает TRUE, если данное поле является первичным ключом
IS_BLOB(flags) Возвращает TRUE, если данное поле имеет тип BLOB или TEXT (не рекомендуется; более предпочтительно field->type )

unsigned int decimals

Возвращает число десятичных знаков для числовых полей.

8.4.2. Обзор функций интерфейса C

В приведенной ниже таблице перечислены доступные в интерфейсе C функции. Более детально они описаны в следующем разделе (see Раздел 8.4.3, «Описание функций интерфейса C»).

Функция Описание
mysql_affected_rows() Возвращает количество строк, измененных/удаленных/вставленных последним запросом UPDATE , DELETE или INSERT .
mysql_change_user() Переключает пользователя и базу данных для открытого соединения.
mysql_character_set_name() Возвращает название кодировки, установленной для данного соединения.
mysql_close() Закрывает соединение с сервером.
mysql_connect() Создает соединение с сервером баз данных MySQL. Данная функция не рекомендуется; вместо нее следует использовать функцию mysql_real_connect() .
mysql_create_db() Создает базу данных. Данная функция не рекомендуется; вместо нее следует использовать команду SQL CREATE DATABASE .
mysql_data_seek() Ищет произвольную строку в результирующем наборе запроса.
mysql_debug() Выполняет отладочные операции DBUG_PUSH с заданной строкой.
mysql_drop_db() Удаляет базу данных. Эта функция не рекомендуется; вместо нее следует использовать команду SQL DROP DATABASE .
mysql_dump_debug_info() Заставляет сервер записывать отладочную информацию в журнал.
mysql_eof() Определяет, была ли данная строка последней из прочитанных в результирующем наборе данных. Эта функция не рекомендуется; mysql_errno() или mysql_error() могут быть использованы вместо нее.
mysql_errno() Возвращает номер ошибки для последней запущенной функции MySQL.
mysql_error() Возвращает сообщение об ошибке для последней запущенной функции MySQL.
mysql_escape_string() Экранирует специальные символы в строке, чтобы ее было возможно использовать в команде SQL.
mysql_fetch_field() Возвращает тип следующего поля таблицы.
mysql_fetch_field_direct() Возвращает тип поля таблицы по заданному номеру поля.
mysql_fetch_fields() Возвращает массив структур, содержащих информацию обо всех полях.
mysql_fetch_lengths( ) Возвращает массив длин всех столбцов в текущей строке.
mysql_fetch_row() Извлекает следующую строку из результирующего набора.
mysql_field_seek() Устанавливает курсор столбцов на заданный столбец.
mysql_field_count() Возвращает количество столбцов в результате для последнего запроса.
mysql_field_tell() Возвращает значение положения курсора поля для последнего вызова mysql_fetch_field() .
mysql_free_result( ) Освобождает память, использованную для результирующего набора.
mysql_get_client_info() Возвращает информацию о версии клиента.
mysql_get_host_info() Возвращает строку, описывающую параметры текущего соединения.
mysql_get_server_version() Возвращает номер версии сервера как целое число (новое с 4.1)
mysql_get_proto_info() Возвращает версию протокола, используемого для данного соединения.
mysql_get_server_info() Возвращает номер версии сервера баз данных.
mysql_info() Возвращает информацию о последнем выполненном запросе.
mysql_init() Выделяет или инициализирует какую-либо структуру MYSQL.
mysql_insert_id() Возвращает идентификатор, сгенерированный для столбца AUTO_INCREMENT предыдущим запросом.
mysql_kill() Уничтожает заданный поток.
mysql_list_dbs() Возвращает имена баз данных, совпадающие с простым регулярным выражением.
mysql_list_fields() Возвращает имена полей, совпадающих с простым регулярным выражением.
mysql_list_processes() Возвращает список текущих потоков на сервере.
mysql_list_tables() Возвращает имена таблиц, совпадающих с простым регулярным выражением.
mysql_num_fields() Возвращает количество столбцов в результирующем наборе.
mysql_num_rows() Возвращает количество строк в результирующем наборе.
mysql_options() Устанавливает параметры соединения для mysql_connect() .
mysql_ping() Проверяет, работает ли данное соединение с сервером, и восстанавливает соединение при необходимости.
mysql_query() Выполняет SQL-запрос, заданный в виде строки с нулевым символом в конце.
mysql_real_connect() Создает соединение с сервером баз данных MySQL.
mysql_real_escape_string() Экранирует специальные символы в строке, чтобы обеспечить возможность использования ее в команде SQL, с учетом установленной для данного соединения кодировки.
mysql_real_query() Выполняет SQL-запрос, заданный в виде фиксированной строки.
mysql_reload() Предписывает серверу перегрузить таблицы привилегий.
mysql_row_seek() Устанавливает курсор на заданную строку в результирующем наборе, используя величину, возвращенную из mysql_row_tell() .
mysql_row_tell() Возвращает положение курсора строки.
mysql_select_db() Выбирает базу данных.
mysql_shutdown() Останавливает сервер баз данных.
mysql_stat() Возвращает информацию о текущем статусе сервера баз данных в виде строки.
mysql_store_result() Извлекает полный результирующий набор для данного клиента.
mysql_thread_id() Возвращает идентификатор текущего потока.
mysql_thread_safe() Возвращает 1, если клиенты скомпилированы как поддерживающие потоки.
mysql_use_result() Инициализирует построчное извлечение результирующего набора.

При подсоединения к серверу необходимо вызвать функцию mysql_init() для инициализации дескриптора соединения, затем с этим дескриптором вызвать функцию mysql_real_connect() (которая содержит такую информацию, как имя данного хоста, имя пользователя и пароль). После соединения функция mysql_real_connect() устанавливает флаг reconnect (часть данной структуры MYSQL) в значение 1 . Этот флаг указывает, что в случае, если запрос не может быть выполнен из-за потери соединения, следует попытаться восстановить соединение с сервером до окончательного отказа от него. Для закрытия соединения вызывается функция mysql_close() .

При активном соединении клиент может посылать SQL-запросы на сервер, используя функции mysql_query() или mysql_real_query() . Разница между этими двумя функциями состоит в том, что mysql_query() работает с запросом, представленным в виде строки с нулевыми окончаниями, в то время, как mysql_real_query() работает со строками фиксированной длины. Если данная строка содержит двоичные данные (которые могут состоять из нуля байтов), то необходимо использовать mysql_real_query() .

Для каждого запроса без выборки данных (т.е. не вида SELECT , а, например, INSERT , UPDATE , DELETE ) можно узнать количество измененных (затронутых) строк путем вызова функции mysql_affected_rows() .

Для запросов SELECT можно извлечь выбранные строки как результирующий набор. (Следует учитывать, что некоторые команды сходны с SELECT в том смысле, что они тоже возвращают строки. Это команды SHOW , DESCRIBE и EXPLAIN . Они должны трактоваться тем же образом, что и команды SELECT .)

Для клиента существует два способа обработки результирующих наборов данных. Первый состоит в извлечении сразу всего результирующего набора целиком вызовом функции mysql_store_result() . Эта функция забирает с сервера все строки, возвращенные запросом, и хранит их в данном клиенте. Второй способ заключается в инициализации для клиента построчного извлечения результирующего набора путем вызова функции mysql_use_result() . Эта функция инициализирует указанное извлечение, но фактически не получает с сервера ни одной строки.

В обоих случаях доступ к строкам происходит с помощью функции mysql_fetch_row() . Совместно с mysql_store_result() mysql_fetch_row() осуществляет доступ к строкам, уже извлеченным с сервера. Совместно с mysql_use_result() mysql_fetch_row() реально получает данную строку с сервера. Информацию о размере данных в каждой строке можно получить вызовом функции mysql_fetch_lengths() .

После выполнения операций с результирующим набором необходимо вызвать функцию mysql_free_result() , чтобы освободить использованную для этого память.

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

Преимущество функции mysql_store_result() состоит в том, что, поскольку все строки выбраны и находятся у клиента, то возможен не только последовательный доступ к строкам. В результирующем наборе данных можно перемещаться назад и вперед в, используя функции mysql_data_seek() или mysql_row_seek() , чтобы изменить положение текущей строки внутри результирующего набора. Можно также узнать количество находящихся в нем строк, вызвав функцию mysql_num_rows() . С другой стороны, для mysql_store_result() требования к памяти могут быть очень высокими для обширных результирующих наборов, что может привести к нехватке памяти.

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

Благодаря интерфейсу клиенты получают возможность соответствующим образом реагировать на запросы (извлекать строки только при необходимости) без уточнения, являлся или нет данный запрос выборкой. Это можно делать, вызывая функцию mysql_store_result() после каждого вызова mysql_query() (или mysql_real_query() ). Если вызов результирующего набора был успешным, то данный запрос принадлежал к виду SELECT и можно производить чтение строк. Если вызов результирующего набора не удался, можно вызвать функцию mysql_field_count() для определения, можно ли было действительно ожидать результат. Если mysql_field_count() возвращает нуль, то данный запрос не возвратил никаких данных (это указывает, что запрос был вида INSERT , UPDATE , DELETE и т.д.), и не следовало ожидать возвращенных строк. Если функция mysql_field_count() является ненулевой, данный запрос должен был возвратить результат, но не сделал этого. Это указывает, что данный запрос был типа SELECT , но его выполнение оказалось неуспешным (см. пример в описании функции mysql_field_count() ).

Как mysql_store_result() так и mysql_use_result() позволяют получить информацию о полях, составляющих результирующий набор (количество полей, их имена и типы и т.д.). Можно получить последовательный доступ к информации о полях внутри строки путем повторного вызова функции mysql_fetch_field() или к номеру поля внутри строки с помощью функции mysql_fetch_field_direct() . Текущее положение курсора поля может быть изменено вызовом функции mysql_field_seek() . Установка курсора производится последующим вызовом функции mysql_fetch_field() . Можно также получить информацию для всех полей сразу с помощью функции mysql_fetch_fields() .

Для обнаружения ошибок и сообщения о них MySQL обеспечивает доступ к информации об ошибках посредством функций mysql_errno() и mysql_error() . Они возвращают код ошибки или сообщение об ошибке для последней запущенной функции (которая может быть успешной или не выполниться), позволяя определить место возникновения и характер ошибки.

8.4.3. Описание функций интерфейса C

В приведенных здесь описаниях параметр или возвращаемая величина, обозначенная как NULL , означает NULL в терминах языка программирования C, а не величину NULL в MySQL.

Функции, возвращающие величину, обычно возвращают указатель или целое число. Если не указано иначе, то функции, возвращающие указатель, возвращают величину не- NULL при успешном выполнении или величину NULL , указывающую на ошибку, а функции, возвращающие целое число, возвращают нуль при успешном выполнении или ненулевую величину при возникновении ошибки. Следует учитывать, что термин «ненулевая величина» означает именно это. Если в описании функции не сказано иначе, то не следует пробовать интерпретировать эту величину иначе, чем нуль:

Если функция возвращает ошибку, то возможные типы ошибок представлены в ее описании в подраздел Ошибки . Вызвав функцию mysql_errno() , можно узнать, какие именно ошибки произошли. Строковое представление ошибки можно получить, вызывая функцию mysql_error() .

8.4.3.1. mysql_affected_rows()

my_ulonglong mysql_affected_rows(MYSQL *mysql)

Описание

Возвращает количество строк, измененных последней командой UPDATE , удаленных последней командой DELETE или вставленных последней командой INSERT . Может быть вызвана немедленно после mysql_query() для команд UPDATE , DELETE или INSERT . Для команд SELECT mysql_affected_rows() работает аналогично mysql_num_rows() .

Возвращаемые значения

Целое число больше нуля равно количеству строк, подвергшихся воздействию или извлеченных. Нуль указывает, что ни одна из записей не была обновлена для команды UPDATE , ни одна из строк не совпала с утверждением WHERE в данном запросе или что ни один запрос еще не был выполнен. Значение -1 показывает, что данный запрос возвратил ошибку или что для запроса SELECT функция mysql_affected_rows() была вызвана прежде вызова функции mysql_store_result() .

Ошибки

Пример

Если указывается флаг CLIENT_FOUND_ROWS при подключении к mysqld , то mysql_affected_rows() возвратит количество строк, соответствующих выражению WHERE для команд UPDATE .

Следует отметить, что при использовании команды REPLACE функция mysql_affected_rows() возвратит значение 2, если новая строка заменила старую. Это происходит по той причине, что в данном случае одна строка была внесена после того как дублирующая была удалена.

8.4.3.2. mysql_change_user()

my_bool mysql_change_user(MYSQL *mysql, const char *user, const char *password, const char *db)

Описание

Изменяет пользователя и устанавливает базу данных, указанную в аргументе db в качестве текущей по базы данных для соединения, заданного в аргументе mysql . В последующих запросах эта база данных является текущей по умолчанию для табличных ссылок, которые не содержат явного указателя базы данных.

Эта функция была введена в версию MySQL 3.23.3.

Функция mysql_change_user() не выполняется, если подключенный пользователь не может быть аутентифицирован или если он не имеет разрешения на использование этой базы данных. В таком случае данный пользователь и база данных не изменяются.

Параметр db может быть установлен в NULL , если база данных по умолчанию не нужна.

Начиная с версии 4.0.6 будет всегда производить откат любой начатой транзакции, закрывать все временные таблицы, снимать блокировку со всех заблокированных таблиц и переустанавливать состояние, если произошло новое соединение. Это будет происходить даже в том случае, если имя пользователя не изменится.

Возвращаемые значения

Нуль при успешном выполнении. Ненулевая величина, если возникла ошибка.

Ошибки

Те же, что и для mysql_real_connect() .

Команды были выполнены в ненадлежащем порядке.

Сервер MySQL неожиданно завершил работу.

Соединение с сервером прервалось в процессе данного запроса.

Произошла неизвестная ошибка.

Сервер MySQL не обеспечивает выполнение этой команды (возможно, старая версия сервера)

Пользователь или пароль ошибочны.

Данная база данных не существует.

Данный пользователь не имеет прав доступа к этой базе данных.

Имя базы данных было слишком длинным.

Пример

8.4.3.3. mysql_character_set_name()

const char *mysql_character_set_name(MYSQL *mysql)

Описание

Возвращает установленную кодировку для текущего подключения.

Возвращаемые значения

Кодировка, установленная по умолчанию.

Ошибки

8.4.3.4. mysql_close()

void mysql_close(MYSQL *mysql)

Описание

Закрывает ранее открытое соединение. Функция mysql_close() также освобождает дескриптор данного соединения, указанный в mysql , если данный дескриптор был выделен автоматически функциями mysql_init() или mysql_connect() .

Возвращаемые значения

Ошибки

8.4.3.5. mysql_connect()

MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd)

Описание

Данная функция не рекомендуется. Вместо нее предпочтительно использовать функцию mysql_real_connect() .

mysql_connect() пытается установить соединение с сервером баз данных MySQL , работающим на хосте host . До успешного завершения функции mysql_connect() нельзя выполнять никакие другие функции интерфейса, за исключением mysql_get_client_info() .

Значения параметров являются теми же самыми, что и для соответствующих параметров функции mysql_real_connect() , с той разницей, что параметр соединения может быть NULL . В этом случае интерфейс C автоматически выделяет память для структуры соединения и освобождает ее при вызове функции mysql_close() . Недостаток данного подхода состоит в том, что при падении соединения нельзя получить сообщение об ошибке (чтобы получить информацию об ошибке из функций mysql_errno() или mysql_error() , необходимо обеспечить адекватный указатель структуры MYSQL).

Возвращаемые значения

Те же, что и для mysql_real_connect() .

Ошибки

Те же, что и для mysql_real_connect() .

8.4.3.6. mysql_create_db()

int mysql_create_db(MYSQL *mysql, const char *db)

Описание

Создает базу данных, указанную в параметре db .

Данная функция не рекомендуется. Вместо нее предпочтительно использовать функцию mysql_query() для выполнения SQL-команды CREATE DATABASE .

Возвращаемые значения

Нуль, если база данных создана успешно. Ненулевая величина, если произошла ошибка.

Ошибки

Команды были выполнены в ненадлежащем порядке.

Сервер MySQL неожиданно завершил работу.

Соединение с сервером прервалось в процессе данного запроса.

Mysql интерфейс с perl (mysql perl api)


This documentation is for an older version. If you’re using the most current version, select the documentation for that version with the version switch in the upper right corner of the online documentation, or by downloading a newer PDF or EPUB file.

20.8В MySQL Perl API

The Perl DBI module provides a generic interface for database access. You can write a DBI script that works with many different database engines without change. To use DBI with MySQL, install the following:

The DBD::mysql module. This is the DataBase Driver (DBD) module for Perl.

Optionally, the DBD module for any other type of database server you want to access.

Perl DBI is the recommended Perl interface. It replaces an older interface called mysqlperl , which should be considered obsolete.

These sections contain information about using Perl with MySQL and writing MySQL applications in Perl:

For installation instructions for Perl DBI support, see Section 2.22, “Perl Installation Notes”.

For some Perl-specific environment variables, see Section 2.21, “Environment Variables”.

For considerations for running on OS X, see Section 2.11, “Installing MySQL on OS X”.

For ways to quote string literals, see Section 9.1.1, “String Literals”.

DBI information is available at the command line, online, or in printed form:

Once you have the DBI and DBD::mysql modules installed, you can get information about them at the command line with the perldoc command:

You can also use pod2man , pod2html , and so on to translate this information into other formats.

Mysql интерфейс с perl (mysql perl api)

Для использования интерфейсов rnSQL и MySQL к модулям DataBase Dependent/DataBase

Independent (DBI/DBD) или MsqlPerl и MysqlPerl необходимо иметь следующие компоненты :

В вашей системе должны быть установлены работающие экземпляры Perl 5. Ко времени

написания этой книги последний релиз Perl имел номер 5.005_02. Следует пользоваться по

меньшей мере Perl 5.004, поскольку в более ранних версиях были ошибки , связанные с

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

Независимую от базы данных часть модуля DBI/DBD можно загрузить из Comprehensive Perl

Archive Network (CPAN). На момент написания книги последней версией был DBI-0.90. Он

находится на http://www.perl.com/CPAN/authors/id/TIMB/DBI/DBI-l.06.tar.gz.

Модуль Data::ShowTable упрощает отображение больших объемов данных . Это требуется для

модулей Msql-MysqL Последняя версия — Data-ShowTable-З ., ее можно найти по адресу : http://

В главе 3 «. » подробно рассказано о том , как получить и установить серверы баз

данных mSQL и MySQL.

компилятор С и сопутствующие средства

Для модулей MsqlPerl и MysqlPerl необходим ANSI-совместимый компилятор С , а также

обычные сопутствующие средства , такие как make, Id и т . д . Вам должно хватить тех средств , с

помощью которых вы собрали Perl. Если у вас нет этих инструментов , компилятор GNU С и все

необходимые поддерживающие программы можно бесплатно получить на ftp://ftp.gnu.org/pub/gnu/.

В настоящее время модули Msql-Mysql поддерживает Йохен Видман (Jochen Wiedmann), чье ID в CPAN

выглядит как JWIED. Поэтому текущие модули Msql-Mysql всегда можно найти на http://www.perl.com/

authors/id/JWIED. На момент написания книги текущей версией была Msql-Mysql-modules-1 .20 7.tar.gz.

После загрузки пакета разархивируйте его :

tar xvzf Msql-Mysql-modules-1.2020.tar.gz cd Msql-Mysql-modules-1.2020

В каталоге дистрибутива есть файл INSTALL, содержащий несколько советов по установке . Сначала

нужно выполнить файл Make file.PL:

Эта команда сначала спрашивает , желаете ли вы установить модули для mSQL, MySQL или те и

другие . Можно установить модули для любого установленного вами сервера баз данных .

После проверки системы программа запрашивает местоположение установки mSQL. Это каталог ,

содержащий подкаталоги lib и include, в которых расположены библиотеки и включаемые

файлы mSQL. По умолчанию этим каталогом является /usr/local/Hughes, но обязательно

проверьте это , поскольку во многих системах используется /usr/local или даже /usr/local/Minerva.

Затем сценарий установки запрашивает путь к MySQL. Как и в случае mSQL, это каталог ,

содержащий надлежащие подкаталоги lib и include, по умолчанию — /usr/local. Это расположение

Илон Маск рекомендует:  Что такое код icap_store_event

верно для большинства установок , но следует обязательно проверить , не используются ли другие

каталоги ..После установки сценарий создает соответствующие make-файлы и завершается . Затем нужно

запустить make и скомпилировать файлы .

Если вы правильно установили Perl, mSQL и / MySQL, то команда make должна пройти без

ошибок . После завершения ее работы будут созданы все модули , и единственное , что останется —

это протестировать и установить их .

Во время выполнения по экрану пробегает ряд отладочных имен , за каждым из которых должно

следовать . . . ok. И наконец , нужно установить модули .

У вас должно быть разрешение записи в каталог установки Perl. Кроме того , необходимо иметь

разрешение на запись в системный каталог для программ (. /usr/local/bin или /usr/bin), чтобы

установить поставляемые с модулем вспомогательные программы pmsql, pmysql и dbimon.

DBI API является стандартным API баз данных в Perl. Поэтому , хотя MsqPerl и MysqlPerl могут быть

более распространены в унаследованных программах , новые программы следует писать с

Следует объявлять во всех программах Perl, использующих модуль DBI.

DBI::available_drivers возвращает список имеющихся драйверов DBD. Функция выполняет это ,

осуществляя поиск модулей DBD в дистрибуции Perl. Если в аргументе не передано значение true, то

при обнаружении двух одноименных модулей DBD выводится предупреждение . В текущем

дистрибутиве Msql-Mysql драйвер для mSQL называется ‘mSQL’, а драйвер для MySQL — ‘mysq’.

my @drivers = DBI->available_drivers;

print » Доступны следующие драйверы :\n» . join(«\n»,@drivers) . «\n Но нас интересуют только mSQL и mysql. :)\n»;

$result = $statement_handle->bind_col($col_num, \$c61_variable, \%unused);

DBI::bind_col связывает колонку команды SELECT с переменной Perl. При всяком чтении или изменении

колонки изменяется значение соответствующей переменной . Первым аргументом является номер колонки

в команде , при этом колонки нумеруются с 1 . Второй аргумент — ссылка на переменную Perl, которая

должна быть привязана к колонке . Необязательный третий аргумент ссылается на хэш атрибутов . В DBD:

:mysql и DBD: :mSQL он не используется . При невозможности в силу каких -. причин сделать привязку

функция возвращает неопределенное значение undef .

my $db = DBI->Gonnect(1 DBI:mSQL:mydata’,undeffundef);.my $query = «SELECT name, date FROM myothertable»;

my $myothertable_output = $db->prepare($query);

# Теперь $name и $date привязаны к соответствующим полям выходных данных ,

# Каждый раз $name и $date автоматически изменяются ,

print » Имя : $name Дата : $date\n»;

$result = $statement_handle->bind_columns(\%unused, @list_of_refs_to_vars);

DBI::bind_columns привязывает весь список скалярных ссылок к значениям соответствующих полей в выдаче .

Первый аргумент функции — ссылка на хэш атрибутов , как в DBI::bind_col . DBD::mSQL и DBD::mysql не

используют этот аргумент . Последующие аргументы должны быть ссылками на скаляры . Скаляры можно с

таким же успехом группировать в структуру \($var , $var2) . Ссылок на скаляры должно быть ровно столько ,

сколько полей в выходных результатах , иначе выполнение программы будет прекращено .

my $db = DBI->connect(‘DBI:mSQL:mydata’, undef, undef);

my .Squery — «SELECT name, date FROM myothertable»;’

my $myothertable_output = $db->prepare($query);

$myothertable_output->bind_colufnns(undef, \($name, $date));

# $name и $date теперь привязаны к соответствующим полям в выдаче .

# $name и $date каждый раз автоматически изменяются ,

print » Имя :$пате Дата : $date\n»;

$result = $statement_handle->bind_param($param_number, $bind_value);

$result = $statement_handle->bind_param($param_number, $bind_value, $bind_type);

$result = $statement_handle->bind_param($param_numberj $bind_value, \%bind_type);

DBI: :bind_param подставляет в команды действительные значения вместо меток -. *?’ (. DBI: :

prepare). Первый аргумент — номер метки -. в команде , нумерация начинается с 1 ( напра -. ). Второй аргумент — подставляемое значение . Необязательный третий аргумент задает тип

подставляемого значения . Это может быть скаляр или ссылка на хэш вида < TYPE =>&DBI: :SQL_TYPE >

, где ‘SQL_TYPE’ — тип параметра . На момент написания этой книги DBI поддерживал SQL-типы

(. ) SQL_CHAR, SQL_NUMERIC, SQL_DECIMAL, SQL_INTEGER,

SQL_SMALLINT, SQL_FLOAT, SQL_REAL, SQL_DOUBLE и SQL_VARCHAR.. Соответствие их

фактическим типам , используемым DBD::mSQL и DBD::Mysql, не документировано . Тем не менее в

таблице 2 — приведен список соответствия на данный момент . Если подстановка невозможна , функция

Таблица1 . Соответствие типов SQL

SQL_CHAR CHAR TYPE

SQL_INTEGER INT_TYPE FIELD_TYPE_INT24

SQL_ SMALLINT UINT_TYPE FIELD_TYPE_INT24

SQL_REAL REAL TYPE

SQL_VARCHAR TEXT_TYPE FIELD_TYPE_TINY_BLOB

my $db = DBI->connect(‘DBD:msql:mydata’, ‘me’, ‘mypass’);

my Sstatement = $db->prepare(

«SELECT name, date FROM myothertable WHERE name like ? OR name like ?»);

$statement->bind_param(1I 1 J%’, ‘SQL_CHAR’);

# Теперь команда будет такой :

# SELECT name, date FROM myothertable WHERE name like ‘J%’ or name like %oe%

$db = DBI->connect($data_source, $username, $password);

$db = DBI->connect($data_source, Susername, $password, \%attributes);

DBI::connect требует по крайней мере три аргумента и необязательный четвертый . Через возвращаемый

описатель выполняются все операции с сервером базы данных . Первый аргумент является источником

данных . Список имеющихся источников можно получить с помощью DBI::data_sources . Для mSQL и

MySQL формат источника данных ‘DBI:mSQL:$database:$hostname:$ро rt’ и

‘DBI:mysql:$database:$hostname:$port’ соответственно . Можно опустить :$port при соединении через стан —

порт . Аналогично можно опустить : $hostname; $port при соединении с сервером на локальном узле

с помощью сокета Unix. Имя базы данных указывать обязательно .

Второй и третий аргументы — имя пользователя и пароль для подключения к базе данных . Для mSQL оба

аргумента должны иметь значение ‘undef’. Если они заданы как ‘undef’ при работе с MySQL, то у

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

Последний аргумент необязателен и является ссылкой на ассоциативный массив . Данный хэш позволяет

определить некоторые атрибуты соединения . В настоящее время поддерживаются только атрибуты

PrintError, RaiseError и AutoCommit. Для сброса им нужно придать значение 0, для установки — какое -. истинное значение . По умолчанию PrintError и AutoCommit включены , a RaiseError — сброшен . Поскольку в

данное время ни mSQL, ни MySQL не поддерживают транзакции , атрибут AutoCommit должен быть установлен

(. подробно см . Атрибуты ).

При неудаче соединения возвращается неопределенное значение undef, и в $DBI: errstr помещается ошибка ..

my $db1 = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

# Теперь $db1 представляет соединение с базой данных ‘mydata’ на локальном # сервере mSQL.

my $db2=DBI-> connect (‘DBI:mysql:mydata:myserver.com’,’me’,’mypassword’);

# Теперь $db2 представляет соединение с базой данных ‘mydata1 сервера MySQL

# ‘myserver.com’ через порт по умолчанию .

# При соединении использовались имя пользователя ‘me’ и пароль ‘mypassword’.

my $db3 =. DBI->connect(‘DBI:mSQL:mydata’,undef,undef, 1>);

# Теперь $db3 — такое же соединение , как $db1, за исключением того , что # установлен атрибут ‘RaiseError’.

DBI::data_sources принимает в качестве аргумента имя модуля DBD и возвращает все имеющиеся для этого

драйверы базы данных в формате , пригодном к использованию в качестве источника данных функцией

DBI. connect . Программа заканчивает свое выполнение с ошибкой , если задано неверное имя драйвера DBD.

В текущих версиях модулей Msql-Mysql драйвер для mSQL называется ‘mSQL’, а для MySQL-‘mysql’.

my @msql_data_sources = DBI->data_sources(‘mSOL’);

my @mysql_data_sources — DBI

# Должны быть установлены DBD::mSQL и DBD::mysql, иначе # выполнение программы прекратится .

print «mSQL databases:\n» . join(«\n»,@msql_data_sources) , «\n\n»;

print «MySQL databases:\n» . join(«\n»I@mysql_data_sources) . «\n\n»;

$rows_affected = $db->do($statement, \%unused);

$rows_affected = $db->do($statement, \%unused, @bind_values);

DBI::do непосредственно выполняет SQL-команду , не являющуюся командой SELECT, и возвращает число

измененных строк . Этот способ быстрее , чем пара DBI::prepare/DBI::execute, требующая два вызова функции .

Первый аргумент — сама команда SQL. Второй аргумент не используется в DBD::mSQL и DBD::mysql, но для других

модулей DBD может содержать ссылку на хэш атрибутов . Последний аргумент — массив значений для

подстановки в команду вместо меток — ‘?’. Подстановка происходит слева направо . Дополнительно

DBI::do автоматически заключит подставляемые строковые значения в кавычки .

my $db = DBI->connect(‘DBI:mSGL:mydata’,undef,undef);

$db->do(«UPDATE mytable SET name-‘Joe’ WHERE name-‘Bob'»);

print «$rows_affected Joe заменены на Bob’s\n»;

$db->do(«INSERT INTO mytable (name) VALUES (?)», <>,'(«Sheldon’s Cycle»>);

# После заключения в кавычки и подстановки # серверу базы данных посылается команда
#INSERT INTO mytable (name) VALUES (‘Sheldon’s Cycle’).

DBI::disconnect отсоединяет описатель базы данных от сервера баз данных . Для mSQL и MySQL в этом обычно

нет необходимости , поскольку эти базы данных не поддерживают транзакций , и неожиданное отсоединение

не причинит вреда . Однако от баз данных , поддерживающих транзакции , нужно отсоединяться явным

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

перед выходом . При ошибке во время отсоединения возвращается ненулевое значение , и в $DBI::ег rst

my $db1 = DBI->connect(‘DBI:mSQL:mydata», undef, undef);

my $db2 = DBI->connect(‘DBI:mSQL:mydata2’,undef,undef);

# Соединение ‘mydata’ разорвано . Соединение с ‘mydata2’

$neat_rows = DBI:dump_results($statement_handle, $niaxlen);

$neat_rows = DBI::dump_results($’statement_handle, $maxlen, $line_sep);

$neat_rows — DBI::dump_results($statenient_handle, $maxlen, $line_sep, $field_sep);

$neat_rows = DBI::dump_results($statement_handle, $maxlen, $line_sep, $f i el d_sep, $f i l e_handle);

DBI. dump_results выводит содержание описателя команды в удобном и упорядоченном виде , применяя к

каждой строке DBI::neat_string. Функцию удобно использовать для быстрой проверки результатов за -. во время разработки программы . Единственный обязательный аргумент — описатель команды .

Второй аргумент , если имеется , задает максимальный размер полей в таблице , по умолчанию равный 35.

Третий аргумент задает строку , используемую для разграничения строк данных , по умолчанию — \.


Четвертый аргумент задает строку , используемую для разделения значений полей в строке , по умолчанию

используется запятая . Последний аргумент задает ссылку на глобальный описатель файла , в который

выводятся результаты . По умолчанию это STDOUT. Если невозможно прочесть описатель команды ,

возвращается значение undef.

my $db = DBI->connect( ‘DBI:mSQL:mydata’, undef, undef);

my $query = «SELECT name, date FROM myothertable»;

my $myothertable_output = $db->prepare($query);

# Вывести результаты в аккуратной таблице .

open (MYOTHERTABLE, «myothertable»);

print DBI::dump_results($myothertable_output, undef, undef, undef, \*MYOTHERTABLE);

# Снова вывести результаты в файл ‘myothertable’.

$DBI::e r r возвращает код последней по времени ошибки DBI. Код ошибки соответствует сообщению об

ошибке , возвращаемому функцией $DBI::errstr . Переменная $DBI::err выполняет ту же задачу . Эта функция

применима с описателями как баз данных , так и команд ..

my $db = DBI->connect(‘DBI:mysql:mydata’,’webuser’,’super_secret_squirrel’);

# Этот запрос имеет синтаксическую ошибку .

my $output = $db->prepare(‘SLECT * from mydata’);

print «Error $DBI:err: $DBI:errstr\n»;

Эта функция возвращает сообщение о последней происшедшей ошибке DBI. Значение сохраняется до

возникновения новой ошибки , когда оно будет заменено . Если во время данного сеанса ошибок не было ,

функция возвращает undef. Переменная $DBI::errstr выполняет ту же задачу . Эта функция применима с

описателями как баз данных , так и команд .

my $db = DBI->connect(‘DBI:mysql:mydata’,’webuser’,’super_secret_squirrel’);

my $error = $db->errstr;

warn («Вот последняя ошибка DBI: $error»);

DBI::execute выполняет SQL-команду , содержащуюся в описателе команды . Для запроса , не являющегося

SELECT, функция возвращает число измененных строк . Функция возвращает -, если число строк неиз -. Для запроса типа SELECT при успехе возвращается истинное значение . Если заданы аргументы , они

используются для подстановки имеющихся в команде меток — (. DBI. p r epar e).

my $db = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

my $statement_handle = $db->prepare(«SELECT * FROM mytable»);

my $statementjiandle2 = $db->prepare(«SELECT name, date FROM myothertable

WHERE name like ?»);

# Выполнена первая команда . К значениям можно # обращаться через описатель .

# Выполнена вторая команда следующего содержания :

# SELECT name, date FROM myothertable WHERE name like ‘J%’

DBI::fetchall_arrayref возвращает все оставшиеся данные в описателе команды в виде ссылки на

массив . Каждая строка массива — ссылка на другой массив , в котором содержатся данные этой строки .

Если в описателе команды нет данных , функция возвращает неопределенное значение undef. Если с

этим описателем команды уже выполнялись функции DBI: :fetchrow_ *, то DBI: :fetchall_arrayref

возвращает все данные , оставшиеся после последнего обращения к DBI: : fetchrow_ *..

my $db = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

my $query = «SELECT name, date FROM myothertable»;

my $output = $db->prepare($query);

my $data = $output->fetchall_arrayref;

# Теперь $data является ссылкой на массив массивов . Каждый элемент #’ главного ‘ массива сам является ссылкой на массив , содержащий строку данных .

print » Четвертой строкой данных в таблице является : » , $data->[3][1] . «\п «;

# Элемент 3 ‘ главного ‘ массива является массивом , содержащим четвертую # строку данных .

# Элемент 1 этого массива является датой .

DBI : :fetchrow возвращает очередную строку данных из описателя команды , созданного DBI: :execute .

Каждое последующее обращение к DBI : :fetchrow возвращает очередную строку данных . Когда данных

больше нет , функция возвращает неопределенное значение u n d e f . Порядок элементов в результирующем

массиве определяется исходным запросом . Если запрос имел вид SELECT * FROM . . . , то элементы следуют в

том порядке , в котором они были определены в таблице .

my $db = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

my $query = «SELECT name, date FROM myothertable WHERE name LIKE ‘Bob%'»;

my $myothertable_output = $db->prepare($query).;

# Это первая строка из $myothertable_output.

($name, $date) = $myothertable_output->fetchrow_array;

# Это следующая строка .

($name, $date) = $myothertable_output->.fetchrow_array;

my @name_and_date = $myothertable_output->fetchrow_array;

DBI::fetchrow_arrayref и ее псевдоним DBI. fetch работают точно так же , как DBI::fetchrow_array , но

возвращают не фактический массив , а ссылку на него .

my $db = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

my $query = «SELECT name, date FROM myothertable WHERE name LIKE ‘Bob%'»;

my $myothertable_output — $db->prepare($query);

my $name1 = $myothertable_output->fetch->[0]

# Это поле ‘name’ из первой строки данных ,

my $date2 = $myothertable_output->fetch->[1]

# Это поле ‘date’ из второй строки данных ,.my ($name3, $date3) = @<$myothertable_output->fetch>;

# Это целиком третья строка данных .

# возвращает ссылку на массив . Можно ‘ преобразовать ‘ ее в действительный # массив , используя конструкцию @<>.

DBI::fetchrow_hashref работает так же , как DBI::fetchrow_arrayref , но возвращает ссылку на

ассоциативный , а не на обычный массив . Ключами хэша являются имена полей , а значениями — значения в

этой строке данных .

my $db = DBI->connect(‘DBI:mSQL:mydata’, undef, undef);

my $query = «SELECT * FROM mytable»;

my $mytable_output = $db->prepare($query);

my %row1 = $mytable_ouput->fetchrow_hashref;

my @field_names = keys %row1;

# @field_names содержит — теперь имена всех полей в запросе .

# Это делается только один раз . Во всех следующих строках будут те же поля .

my @row1 = values %row1;

DBI::finish освобождает все данные в описателе команды , чтобы можно было уничтожить описатель или

снова подготовить его . Некоторым серверам баз данных это необходимо для освобождения соответству —

ресурсов . DBD::mSQL и DBD::mysql не нуждаются в этой функции , но для переносимости кода

следует использовать ее по окончании работы с описателем команды . Функция возвращает неопределенное

значение undef, если описатель не удается освободить .

my $db — DBI->connect(‘DBI:mysql:mydata’, ‘me’,’mypassword’);

my $query = «SELECT * FROM mytable»;

my $mytable_output — $db->prepare($query);

# Теперь можно переназначить $mytable_output или подготовить для него # другую команду SQL.

@dbs = $db->func(«$hostname», ‘_ListDBs’);

@dbs = $db->func(«$hostname:Sport», ‘_ListDBs’);

>func( $database, ‘_CreateDB’ );

$result = $drh->func( $database, ‘_DropDB’ );

DBI::func вызывает специализированные непереносимые функции , включенные в различные драйверы

DBD. Она используется с описателем базы данных или описателем команды , в зависимости от назначения

специализированной функции . По возможности следует использовать равносильную переносимую функцию .

При использовании специализированной функции сначала передаются ее аргументы как скаляр , а затем — имя.функции . DBD::mSQL и DBD::mysql реализуют следующие функции :

Функция _ListDBs принимает имя узла и необязательный номер порта и возвращает список

имеющихся у сервера баз данных . Лучше использовать переносимую функцию DBI::data_sources .

Функция _ListTables возвращает список таблиц , имеющихся в текущей базе данных .

Функция _CreateDB принимает в качестве аргумента имя базы данных и пытается создать эту базу

данных на сервере . Для работы с этой функцией необходимо иметь право создания баз данных .

Функция возвращает — в случае неудачи и 0 в случае успеха .

Функция _DropDB принимает в качестве аргумента имя базы данных и пытается удалить с сервера

эту базу данных . Данная функция не выводит пользователю сообщений и при успешном выполнении

удаляет базу данных навсегда . Для работы с этой функцией необходимо иметь право удаления баз

данных . Функция возвращает — в случае неудачи и 0 в случае успеха .

my $db = DBI->connect(‘DBI:mysql:mydata’,’me 1 , ‘mypassword’);

my @tables = $db->func(‘_ListTables’);

# @tables содержит теперь список таблиц в ‘mydata’.

$neat_string.= DBI::neat($string); $neat_string — DBI: :neat(.$string, $maxlen);

DBI::neat принимает в качестве аргументов строку и необязательную длину . Затем строка форматируется для

аккуратного вывода . Вся строка заключается в одиночные кавычки . Непечатаемые символы заменяются

точками . Если задан аргумент длины , все символы после максимальной длины удаляются , а строка

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

my $string = » Это очень , очень длинная строка , в которой много чего написано .»;

my $neat_string = DBI::neat($string,14);

# Теперь $neat_string такая :’ Это очень , оче . «

$neat_string = DBI;:neat_list(\@listref, Smaxlen);

$neat_string = DBI::neat_list(\@listref, $maxlen, $fi§ld_seperator);

DBI: :neat_list принимает три аргумента и возвращает аккуратно отформатированную строку , пригодную для

вывода . Первый аргумент содержит ссылку на список выводимых значений . Второй аргумент —

длина каждого поля . Последний аргумент — строка , используемая для разделения полей . Для каждого

элемента списка вызывается DBI:: neat с использованием заданной максимальной длины . В результирующих

строках для разделения полей используется последний аргумент . Если последний аргумент не задан , в

качестве разделителя применяется запятая .

my @list = (‘Bob’, ‘Joe’, ‘Frank’);.my $neat_string = DBI::neat_list(\@list, 3);

# Теперь $neat_string такая : ‘Bob’, ‘Joe’, ‘Fra. ‘

$statement_handle = $db->prepare($statement); $statement_handle = $db->

DBI::prepare принимает в качестве аргумента SQL-команду , которую некоторые модули баз данных

переводят во внутреннюю компилированную форму , исполняемую быстрее при вызове DBI:: execute . Эти мо —

DBD ( DBD::mSQL или DBD::mysql) принимают также ссылку на хэш необязательных атрибутов .

Серверы mSQL и MySQL в настоящее время не реализуют концепцию подготовки команд , поэтому DBI::

prepa re просто запоминает команду . По желанию вместо значений данных в команду можно вставить любое

количество символов ‘?’. Эти символы известны как метки — (placeholders). Функция DBI:

;bincLparam осуществляет подстановку действительных значений вместо меток -. Если по какой -. причине команду нельзя подготовить , функция возвращает undef.

my $db = DBI->connect(‘DBI:mysql:mydata’, ‘me’,’mypassword’);

my $statement_handle = $db->prepare(‘SELECT * FROM mytable’);

# Теперь эта команда готова к выполнению .

My $statement_handle = $db->prepare(

‘SELECT name, date FROM myothertable WHERE name like ?’);

# Эта команда будет готова к выполнению после подстановки # с использованием функции DBI::bind_param.

DBI : : quote принимает строку для использования в качестве запроса SQL и возвращает ее копию с правильно

расставленными для ввода в запрос кавычками , в том числе расставляя корректные кавычки по концам

my $db1 = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

my $db2 = DBI->connect(‘DBI:mysql:myotherdata’, ‘me’,’mypassword’);

my Sstring = «Sheldon’s Cycle»;

my $qs1 = $db1->quote($string);

# $qs1: ‘Sheldon\’s Cycle’ ( включая наружные кавычки )

my $qs2 = $db2->quote($string);

# $qs2 : ‘Sheldon’s Cycle’ ( включая наружные кавычки ).

# Теперь обе строки годятся для использования в командах для своих # соответствующих серверов баз данных .

DBI: : rows возвращает число строк данных , содержащихся в описателе команды . Для DBD::mSQL и DBD::mysql

эта функция дает точное число для всех команд , включая SELECT. Для многих других драйверов , которые не

хранят в памяти сразу все результаты , эта функция надежно работает только для команд , не являющихся

SELECT. Это следует учитывать при написании переносимых программ . Функция возвращает -, если по

какой -. причине число строк неизвестно . Переменная $DBI: ; rows выполняет ту же задачу .

my $db = DBI->connect(‘DBI:mSQL:mydata’,undef,undef);

my $query = «SELECT name, date FROM myothertable WHERE name=’Bob'»;

my $myothertable_output = $db->prepare($query);

my $rows = $myothertable_output->rows;

print » В таблице ‘myothertable’ есть $rows строк ‘ ВоЬ ‘\n»;

DBI. state возвращает код ошибки SQL SQLSTATE последней по времени ошибки DBI. В данное время

DBD::mSQL и DBD;:mysql сообщают ‘S 000’ для всех ошибок . Эта функция доступна для описателей баз

данных и команд . Переменная $DBI::state выполняет ту же задачу .

my $db = DBI->connect(‘DBI:mysql:mydata’, ‘webuser’, ‘super_secret_squirrel’);

my $sql_error = $db->state;

warn(“Bor последняя по времени ошибка DBI SQL: $sql_error»);

DBI::trace используется в основном для отладки . Если уровень трассировки установлен равным 2, выводится

полная отладочная информация . Установка уровня 0 отключает трассировку . DBI->trace осуществляет

трассировку для всех описателей , a $handle->trace — только для данного описателя — базы данных или команды .

При наличии DBI->trace или $handle->trace второго аргумента отладочная информация выводится в

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

DBI_TRACE. Если переменная окружения установлена равной числу ( настоящее время 0 или 2), включается

трассировка всех описателей на этом уровне . При другом значении переменной уровень трассировки

устанавливается равным 2, а само значение используется в качестве имени файла для вывода отладочной

my $db1 = DBI->connect(‘DBI:mysql:mydata’, ‘webuser’,’super_secret_squirrel’);


my $db2 = DBI->connect(‘DBI:mSQL:myotherdata’,undef,undef);

# Включена трассировка для всех описателей на уровне 2.

# Отключена трассировка для $db2, но продолжает действовать для $db1

# Теперь включена трассировка для всех описателей на уровне 2, выдача # посылается в файл ‘DBI.trace’.

$result = $db->rollback;.$result = $db->ping;

DBI::commit и DBI::rollback полезны только при работе с серверами , поддерживающими транзакции . При

работе с DBD::mSQL и DBD::mysql они не оказывают никакого эффекта . DBD: :ping пытается проверить ,

запущен ли сервер базы данных . В DBD::mSQL и DBD: :mysql она не реализована .

$statement_handle-> ( MySQL è mSQL 1.x

В DBI.pm API определено несколько атрибутов , которые можно читать и устанавливать в любой

момент . Присвоение значения атрибуту может определенным образом изменить поведение текущего

соединения . Присвоение любого отличного от нуля значения атрибуту устанавливает его . Присвоение

значения 0 атрибуту сбрасывает его . Некоторые значения определены только для конкретных баз

данных и непереносимы . Ниже следуют атрибуты , применимые как к описателям баз данных , так и к

Этот атрибут оказывает влияние на поведение серверов баз данных , поддерживающих транзакции .

Для mSQL и MySQL он всегда должен быть установлен ( по умолчанию ). Попытка

изменить его прерывает выполнение программы .

При установке этого атрибута отсекаются все ведущие и замыкающие пробелы в данных ,

возвращаемых запросом (, при вызове DBI::fetch row ).. Все производные от данного описатели

наследуют значение этого атрибута . Значение по умолчанию — «. ».

Назначение этого атрибута — сохранить процесс при ветвлении (fork), чтобы дочерний процесс мог

пользоваться родительским описателем . Его следует установить в родительском или дочернем

процессе , но не в обоих . Значение по умолчанию — «. ».

При установке этого атрибута выводятся все предупредительные сообщения . При сброшенном.атрибуте доступ к ошибкам осуществляется только через $DBI::errstr. Все производные от данного

описатели наследуют значение этого атрибута . Значение по умолчанию -«установлен ».

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

прерывая ее выполнение , если не определен обработчик ‘_DIE_’. Все описатели , производные от

этого , наследуют значение этого атрибута . Значение по умолчанию -«сброшен ».

При установке этого атрибута выводятся предупредительные сообщения о неудачных приемах

программирования (. пережитках Perl 4). Сброс этого атрибута отключает предупреждения

DBI, что допустимо только при полной уверенности в своем мастерстве . Все производные от данного

описатели (, описатель команды , происходящий от описателя базы данных ) наследуют

значение этого атрибута . Значение по умолчанию — «. ».

Непереносимый атрибут , определенный только для DBD::mysql. Он возвращает из таблицы текущее

значение поля auto_increment ( таковое имеется ). Если поле auto_increment не существует ,

атрибут возвращает undef.

Это непереносимый атрибут , определенный только для DBD::mysql. Атрибут возвращает ссылку на

массив булевых значений , указывающих для каждого из содержащихся в описателе команды полей ,

имеет ли оно тип BLOB. Для описателя команды , который был создан не выражением SELECT,

$statement_handle-> возвращает undef.

Непереносимый атрибут , определенный только для DBD::mysql. Он возвращает ссылку на массив

булевых значений , указывающих для каждого из содержащихся в описателе команды полей ,

определено ли оно как KEY. Для описателя команды , который был создан не выражением SELECT,

$statement_handle-> возвращает undef.

Это непереносимый атрибут , определенный только для DBD::mSQL и DBD::mysql. Он возвращает

ссылку на массив булевых значений , указывающих для каждого из содержащихся в описателе

команды полей , определено ли оно как ‘NOT NULL’ . Для описателя команды , который был создан не

выражением SELECT, данный атрибут возвращает undef. Того же результата можно достичь в

переносимом виде , используя $statement_handle-> .

Это непереносимый атрибут , определенный только для DBD::mSQL и DBD::mysql. Атрибут

возвращает ссылку на массив булевых значений , указывающих для каждого из содержащихся в

описателе команды полей , имеет ли оно числовой тип . Для описателя команды , созданного не

выражением SELECT, $ s t at ement _handl e-> возвращает undef.

Это непереносимый атрибут , определенный только для DBD::mSQL и DBD::mysql. При

использовании с DBD::mSQL он оказывает влияние только для серверов mSQLl.x, поскольку mSQL2.x

не использует первичные ключи . Атрибут возвращает ссылку на массив булевых значений ,

указывающих для каждого из содержащихся в описателе команды полей , является ли оно первичным

Для описателя команды , созданного не выражением SELECT, данный атрибут возвращает undef.

$statenent_handle->.Непереносимый атрибут , определенный только для DBD::mSQL и DBD::mysql. Этот атрибут

возвращает ссылку на список максимально допустимых размеров полей , содержащихся в описателе

команды . Для описателя команды , который был создан не выражением SELECT, $statement_handle-><

length> возвращает undef.

Это непереносимый атрибут , определенный только для DBD::mysql. Атрибут возвращает ссылку на

список фактических максимальных размеров полей , содержащихся в описателе команды . Для

описателя команды , который был создан не выражением SELECT, данный атрибут возвращает undef.

Атрибут возвращает ссылку на список имен полей , содержащихся в описателе команды . Для

описателя команды , который был создан не выражением SELECT, $staternent_handle-> возвращает

Этот атрибут возвращает ссылку на массив булевых значений , указывающих для каждого из

содержащихся в описателе команды полей , может ли оно иметь значение NULL. Поле , определенное как

‘NOT NULL’ , даст в списке значение 0. Остальные поля дадут значение 1 . Для описателя команды ,

созданного не выражением SELECT, атрибут возвращает undef.

Атрибут возвращает число колонок данных , содержащихся в описателе команды . Для описателя

команды , который был создан не выражением SELECT, $statement_handle-> возвращает

Этот атрибут возвращает число меток — в описателе команды . Метки —

обозначаются в команде символом ‘?’. Для подстановки вместо меток — надлежащих

значений используется функция DBI:: bind_values .

Это непереносимый атрибут , определенный только для DBD: rmSQL и DBD::mysql. Атрибут

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

использовать для SELECT с соединением нескольких таблиц .

Непереносимый атрибут , определенный только для DBD::mSQL и DBD::mysql. Он возвращает

ссылку на список типов полей , содержащихся в описателе команды . Для описателя команды , создан -.

не выражением SELECT, $statement_handle-> возвращает undef. Значениями списка

являются целые числа , соответствующие перечислению в заголовочном файле С mysql_com.h из

дистрибутива MySQL. Сейчас способа доступа к именам этих типов из DBI не существует . Но доступ

к типам возможен через функцию &Mysql::FIELD_TYPE_ * в Mysql.pm. В DBD::mysql имеется также недоку -. атрибут $statement_handle->, идентичный

$statement_handle->, за исключением того , что вместо целых чисел возвращает SQL-

Mysql интерфейс с perl (mysql perl api)

Для связи с нами можно использовать:
irc://irc.chatnet.ru:#gfs
icq://546460
email://cobalt[@]gfs-team.ru

Элитный клуб общения с самыми красивыми девушками
pastila.com

© Cobalt 20.05.2006 статья не оптимизирована

© Cobalt 20.05.2006 статья не оптимизирована

А как можно выполнить SQL запросы каторые храняться в файлах?

потратил полчаса чтобы понять что указанный в теме :
$db = Mysql->Connect($host,$database,$password,$user);
неверно
верно:
$db = Mysql->Connect($host,$database,$user,$password);

Введение в MySQL (используя Perl DBI) (perl database mysql example)

Ключевые слова: perl, database, mysql, example, (найти похожие документы)

From: Дмитрий Николаев
Newsgroups: http://perl.dp.ua/
Date: Mon, 24 Jun 2004 18:21:07 +0000 (UTC)
Subject: Введение в MySQL (используя Perl DBI)

Введение в MySQL (используя Perl DBI)

Перевод выполнил Дмитрий Николаев. Оригинал на ангийском лежит
здесь: http://www.danchan.com/feature/2000/10/16/mysql/mysql.htm

Я считаю, что если название статьи не звучит для Вас чуждо, то,
возможно, Вы в нужном месте.

MySQL — это реляционная база данных. MySQL основана на технологии
client/server. Все примеры команд MySQL в этой статье могут быть
введены прямо в командную строку MySQL. MySQL поддерживает
многострочные команды и использует точку с запятой, как разделитель
между командами.

Почему же MySQL, а ни другая база данных SQL?

Хотя бы потому, что она бесплатна, быстра и имеет хорошую поддержку.

Данные организуются как ряды и колонки, образующие матрицу. С точки
зрения SQL, матрица называется таблицей.

Лучший способ для C программиста понять что же это такое:

Каждый ряд — это структурная ссылка.
Каждая колонка — это член этой структуры.

Вот обычная структура (класс, объявленный с ключевым словом struct) в C:

struct users
<
int id;
char nickname[17];
char password[17];
int socks;
int favorite_number;
>;

Это выглядит как информация, собранная Web-сайтом о пользователе.

А вот MySQL версия этой структуры:

create table users
(
id int auto_increment not null,
nickname varchar(16) not null,
password varchar(16) not null,
socks int,
favorite_number int,
primary key (user_id),
unique (nickname)
);

Несколько похоже, не так ли?

Фактически эти таблицы — это то, что вы увидете, если введёте в MySQL
следующую команду:

select * from users;

Звёздочка означает, что мы выбираем все колонки из таблицы.

Таблица — это структурная основа многомиллиардной годовой индустрии
баз данных, которая включает в себя такие компании, как Oracle и
Informix.

Давайте быстро «пробежим» по простейшим командам MySQL. Вы уже занете
команду create.

create table users
(
id int auto_increment not null,
nickname varchar(16) not null,
password varchar(16) not null,
socks int,
favorite_number int,
primary key (user_id),
unique (nickname)
);

А что же делать, если хотим увидеть только прозвища и любимые числа
пользователей?

select nickname, favorite_number from users;

А если хотим вывести прозвища пользователей, но с условием, что носков
у них меньше, чем 10 пар и их любимое число больше, чем 100?

select nickname from users where socks 100;
+———-+
| nickname |
+———-+
| Javier |
+———-+

Как же ввести данные в таблицу? Это просто.

insert into users (nickname, socks) values (‘Cowlick’, 0);

Да , но мы забыли добавить поле пароля в таблицу!

create table users
(
.
password varchar(16) not null,
.
);

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

insert into users (nickname, password, socks) values (‘Cowlick’, ‘udder’, 0);

Но подождите! Мы не определили id! Оно также not null.

create table users
(
id int auto_increment not null,
.
);

В этом случае колонку id мы определили как auto_increment и MySQL сама
создаёт значения для нас, добавляя 1 к наибольшему значению, которое
найдёт в таблице (Rolo имеет >
Мы забыли ввести любимое число пользователя Cowlick. Которое, между
прочим, -1. Для этого мы будем использовать команду update.

update users set favorite_number = -1 where >
Также можем выполнить это следующим образом:

update users set favorite_number = -1 where nickname = ‘Cowlick’;

Но вдруг у нас появится больше чем один пользователь с прозвищем
Cowlick? В нашем примере этого быть не может, т.к. в командеcreate
table мы определили:

create tables users
(
.
unique (nickname)
);

Если мы попробуем ввести ещё одного пользователя с прозвищем Cowlick,
то мы получим ошибку от MySQL.

Предположим Вы имеете проблемы с пользователем Javier. Длугие члены
вашего общества также считают, что этому пользователю не место среди
них, Вы можете сделать следующее

delete from users where nickname = ‘Javier’;

Если же Вы хотите удалить всю таблицу, то необходимо будет сделать
следующее.

drop table users;

Определение таблицы и все данные после вышеописанной команды будут
удалены. Будьте осторожны с этой командой.

Мы не говорили о директиве primary key в команде create table.
create table users
(
.
primary key (user_id),
.
)

Создаётся первичный ключ. Первичный ключ — это особый ключ, который
может быть только один для данной таблицы для каждой аблицы. По сути,
первичный ключ — это уникальный (UNIQUE) ключ с именем «PRIMARY».
Несмотря на привелегированный статус, он функционирует как другой
уникальный ключ. Но

select * from users where user_ >
быстрее, чем

select * from users where favorite_number = 945;

MySQL ограничен маленькими типами данных? Если, конечно, Вы считаете,
что 4 гигабайта — это мало, то да. Это размер, который может быть
помещён в поля типов LongBlob и LongText.

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

create table messages
(
id int auto_increment not null,
user_id int not null,
posting_date datetime not null,
comment_body text
primary key (id)
)

Этот пример предоставил нам два новых типа: datetime и text.

Данные колонки datetime структуированы следующим образом: «YYYY-MM-DD
hh:mm:ss». В данном примере поdatetime могут быть отсортированы
сообщения. Для нас это всего лишь строка.

Типtextможет содержать данные до 64Kb, что более чем достаточно для
сообщения.

Колонка user_id является реляционной частью Реляционной Системы
Управления Базой Данных (РСУБД).

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

create table message_votes
(
message_id int not null,
user_id int not null,
vote enum(‘good’, ‘bad’) not null,
primary key (message_id, user_id)
);

В этом примере колонка vote может содержать одно из двух: либо ‘good’,
либо ‘bad’.

Для поиска голосования сообщения можно будет сделать следующее:

select * from message_votes where message_ >
, что будет быстрее, чем:

select * from message_votes where user_ >
Но самым быстрым поиском голосования по сообщению будет:

select * from message_votes where message_ >
Теперь мы готовы к взаимодействию DBI и MySQL.

Почему PERL? Почему не PHP? Как-никак, но считается, что PHP4
достаточно быстр за счёт нового интерпретатора?

Я отвечу, потому, что Perl — это язык, который наиболее часто сейчас
используется. А я люблю идти в ногу со стандартами индустрии. Perl
имеет большую поддержку online и большинство книг написано о нём.
Существует CPAN (http://www.cpan.org/), the Comprehensive Perl
Archive Network, где Вы можете найти модули для исполнения Ваших
самых сокровенных желаний, относительно программирования, конечно
:-). DBI даёт Вам интерфейс, который будет работать как с самой
примитивной БД, так и с самой последней версией Oracle РСУБД.

Давайте начнём с соединения с базой данных:

my $dsn = ‘DBI:mysql:my_database:localhost’;
my $db_user_name = ‘admin’;
my $db_password = ‘secret’;
my ($id, $password);
my $dbh = DBI->connect($dsn, $db_user_name, $db_password);

Давайте предположим, что мы получили из формы логин и пароль
пользователя. Итак,

$input_nickname = ‘Cowlick’ и $input_password = ‘udder’

Естественно наше желание проверить действительно ли введёный пароль
соответствует введёному логину в нашей БД.

my $sth = $dbh->prepare(qq