|
||||||||||||||
|
||||||||||||||
SQL - это сокращение от Structured Query Language (структурированный язык запросов). SQL создан для работы с реляционными базами данных. Он позволяет пользователям взаимодействовать с базами данных (просматривать, искать, добавлять и управлять данными). MySQL приходит со следующими основными скриптами
Q:Я занимаюсь разработкой на Perl`е движка для создания онлайн магазина. Среди предъявленных заказчиком требований фигурирует пункт о реализации экспорта статистики в таблицы формата *.xls (Microsoft Excel). Подскажи алгоритм конвертирования MySQL таблицы в Excel файл.
A: #!/usr/local/bin/perl
use DBI;
$table = "mssql_table";
$db = "msql_base";
$db_serv = "step.msql.server";
$user = "xakep";
$passwd = "parol";
$c = DBI->connect("DBI:mysql:$db:$db_serv", $user, $passwd);
$statement = "select count(*) from $table";
$cc = $c->prepare($statement);
$ccc = $cc->execute;
@row = $cc->fetchrow_array;
$n = $row[0];
$statement = "select * from $table";
$cc = $c->prepare($statement);
$ccc = $cc->execute;
open F, "$ARGV[0]";
for ($i=0; $i<$n; $i++) {
@row = $cc->fetchrow_array;
print F "$row[0];$row[1];$row[3]\n";
}
Принцип работы этого проверенного временем скрипта предельно прост – ты легко с ним разберешься. Для этого достаточно изучить документацию модуля DBI. Хотя я уверен, ты это уже сделал.
Для его запуска набери следующее:
./MySQL-Excel.pl output.xls, где output.xls – выходной Excel`евский файл.
30.10.2003
Данная статья не является полным руководством по администрированию MySQL-сервера, здесь скорее представлены первичные, самые необходимые данные для новичков. А посему рассматриваться будет сервер для ОС Windows, хотя большинство команд справедливы и для *nix-систем. В работе используется в основном консоль, т.к. команды, вводимые в консоли, можно легко перенести, допустим, в web-интерфейс (например, в PHP для этого существуют специальные функции).
Для чего нужна база данных? Реляционные базы данных представляют собой не что иное, как просто несколько таблиц с записями. СУБД предназначены для управления этими таблицами, т.е. создания новых таблиц, удаления ненужных, вставки в таблицы новых записей, изменения записей и, конечно же, обработки запросов, а также некоторых иных, менее часто используемых функций. Собственно, ведь и базы данных необходимы для того, чтобы оперативно выдавать информацию, причем в определенном порядке. СУБД существует великое множество (хотя бы всем известная Microsoft Access). Но на принципах работы мы останавливаться не будем. Пожалуй, наиболее распространенной СУБД в Интернете является MySQL, которая из-за своей быстроты и удобства в использовании получила широкое распространение. Да, и большое значение имеет то, что она совершенно бесплатная, т.е. распространяется по GNU GPL (в общем это значит, что вы можете скачать исходные коды и откомпилировать их у себя или вообще сделать СУБД "под себя", если, конечно, являетесь достаточно грамотным программистом. Правда, если это так, данная статья не для вас:-)).
Итак, в теперешней "лабораторной работе" понадобится: компьютер, собственно сам сервер СУБД MySQL, ярлык консоли под рукой (собственно, он всегда должен быть под рукой: хоть удобство работы под cmd и значительно уступает работе в консольке в Linux, но очень много вещей можно сделать из консоли быстрее, чем лезть через 3-5 менюшек за нужной опцией). Много вещей будет делаться именно через консоль. Конечно, существует множество "юзеро-ориентированных" программ, предназначенных для управления сервером, но рассматривать какую-либо одну не имеет смысла. Если вы будете знать основные команды, использовать MySQL в web-приложениях станет не просто легко, а очень просто!
Установка MySQL. Устанавливать и использовать мы будем MySQL-сервер 3.23.38. Зачем вообще нужен SQL? На первый взгляд, для создания более-менее приличного сайта не требуется особых наворотов (каковыми некоторые считают PHP и SQL), но даже просто лог счетчика после пары-другой тысяч "оборотов" вам смотреть интересно не будет. Ежели в лог счетчика писать только время-дату, IP и имя компьютера посетителя, то лог в несколько тысяч строчек не только вытягивать каждый раз с сервера надоест, но и оперативно посмотреть, кто был, допустим, в ночь с четверга на пятницу на вашем, безусловно, замечательном сайте, будет очень трудно. А форум писать только, допустим, на PHP не просто довольно сложно, но и "неприятно".
Итак, инсталляция. Как таковая инсталляция не требует особо больших танцев с бубном. Жмем энное количество раз на кнопочку Next — и наслаждаемся. Пару слов о том, как хранятся данные в MySQL. По умолчанию каждая база данных хранится в отдельной папочке, название которой совпадает с названием этой базы данных, которые, в свою очередь, хранятся (опять же, по умолчанию) в папке DATA директории, в которой установлен сервер. Изменить дефолтовое местоположение данных можно следующим образом. Например, вы хотите создать базу данных, которая будет храниться, скажем, в E:/data/database_name, где database_name — имя базы данных. Тогда вы создаете файл database_name.sym в директории DATA и записываете в него всего одну строчку, которая содержит путь к местоположению вашей базы данных: "E:/data/database_name", и сохраняете. Если заглянуть в папки, в которых хранятся данные, то вы увидите там 3 файла. Данные хранятся в "оптимизированном" виде, т.е. не в виде простого текста — так просто их просмотреть не удастся. Итак, три файла: с расширениями .frm — в нем хранится информация о таблицах, содержащихся в БД, .myd — собственно данные и .myi — индексные данные. Теперь займемся безопасностью. Данные о пользователях MySQL хранит в специальной базе данных, которая называется mysql. В ней 5 таблиц, в которых хранятся логины и пароли в зашифрованном виде, а также атрибуты доступа к таблице. Эти таблицы называются:
В таблицах columns_priv, tables_priv хранятся привилегии пользователей для доступа, соответственно, к колонкам и таблицам, в db — привилегии для доступа к базам данных, в host — информация о компьютерах, с которых подключаются юзвери к MySQL, и, наконец, в таблице user хранится информация о пользователях.
Более подробные сведения можно получить из мануала, который есть в установочном пакете (после установки он находится в mysql/Docs). Это почти "двухметровый" документ, в котором написано практически все, что нужно знать на первых порах, и не только на первых:-). Нас интересует, каким образом сменить юзверя с логином root (те, кто знаком с *nux, знают, что это такое, а для остальных поясняю: суперпользователь с неограниченными правами), а также сделать юзверя, из-под имени которого мы будем работать с сервером. В идеале такой пользователь должен быть только один. Остальные пользователи должны быть с ограниченными правами (главный принцип администрирования — что не разрешено, то запрещено). Дело в том, что по умолчанию суперпользователь не имеет пароля!! И если вы, например, занесете в свою базу данных какие-то сверхсекретные сведения, посмотреть, удалить, изменить их сможет каждый:-). Итак, сервер мы установили, начинаем администрирование. Находим директорию, в которую мы установили наш сервер (по умолчанию это C:\mysql). Находим директорию C:\mysql\bin и видим множество "экзешников". Для начала нам потребуется mysql.exe. Запускаем. Да, опции запуска из консоли можно посмотреть, написав что-то вроде C:\mysql\bin\mysql.exe -h, после чего будет выведена справка. Но пока они нам не понадобятся. Все sql-команды вводятся в командной строке и должны завершаться ";" или "\g". Для того, чтобы использовать базу данных, необходимо сначала ее выбрать. Для этого существует команда USE. Нам необходима БД "mysql": "mysql> use mysql;". Для того, чтобы посмотреть, какие базы данных имеются на сервере, существует команда "mysql> show databases;". Просмотр имеющихся таблиц так же прост, как и просмотр имеющихся БД: "mysql> show tables from databaseNAME;", где databaseName — имя базы данных. Посмотрим, кто у нас числится в юзверях нашего сервера. Пишем "mysql> select user,host,password from user;", после чего получим список юзверей с названиями компьютеров, с которых им можно подключаться к серверу. Прежде, чем вы начнете экспериментировать с правами доступа к базам данных, советую вам скопировать папку mysql (с файлами соответствующей базы данных) куда-нибудь в отдаленное место для того, чтобы, если что-то не получится, можно было бы "откатиться".
Команда SELECT — она из самых частоиспользуемых команд. С ее помощью мы можем показать, какие данные нас интересуют, и попросить вывести ее на экран. Синтаксис ее таков: "SELECT интересующие_столбцы_в_таблице FROM название_таблицы <опции>;" Вместо "интересующие_столбцы_в_таблице" можно поставить "*", тогда нам будут выданы значения всех колонок, которые присутствуют в таблице. Чаще всего вместо "<параметры>" пишут еще одно ключевое слово — WHERE. Синтаксис таков: "WHERE название_колонки_таблицы='значение'".
Так, теперь пишем: "mysql>UPDA-TE user SET Password=PASSWORD ('NEWpasword') WHERE user='root';", где NEWpassword — новый пароль для суперпользователя. К слову, таким образом можно изменить пароль для любого юзверя. Немного поясню, что значат эти команды. Функция PASSWORD('string') шифрует строку по определенному алгоритму, а команда UPDATE изменяет значение записи WHERE (где) в таблице user. К слову, все пароли в MySQL хранятся в зашифрованном виде. Теперь нам нужно запретить суперпользователю подключаться с удаленных компьютеров. Для этого удаляем строчки со знаком "%". Пишем "DE-LETE FROM user WHERE Host='%';". Команда DELETE имеет похожий синтаксис с командой SELECT: "SELECT FROM название_таблицы WHERE название_колонки_таблицы='значение';". Я надеюсь, понятно, что команды необходимо набирать без кавычек. Да, последней командой мы также удалили и "пустого" юзверя. Теперь у нас только два пользователя с неограниченными правами: root и mentalzavr, пароль которого, к слову, вы должны были задать при первой загрузке WinMySQLAdmin (теперь он должен висеть в трее этаким светофором, зеленый свет на котором означает нормальную работу сервера, желтый — переходное состояние, а красный — останов сервера). Для того, чтобы наши изменения вступили в силу, необходимо либо перезапустить сервер, либо дать команду "FLUSH PRIVILEGES;". Дело в том, что большинство серверов самого различного назначения читают свой конфиг, где хранится большинство их настроек, только один раз при загрузке. Так и сервер MySQL читает базу данных с параметрами доступа к базам данных при загрузке либо принудительно после специальной команды. Перезапустить сервер можно из панели управления, если вы работаете в Windows NT-серии, к которой относятся Windows XP, 2000 и собственно сама NT:-), либо из той же самой пресловутой командной строки. Сначала посмотрим, как называется наша служба. Для этого воспользуемся так называемой расширенной консолью WMIC (WMI Command-line). Если вы до этого ею не пользовались, система вам ее установит (XP). Это очень мощный инструмент. Но не тема данной статьи:-). Итак, пишем "wmic:root\cli>service list". Видим название службы "MySql". Выходим из WMIC: "wmic:root\cli> exit". Теперь останавливаем службу "C:\>net stop mysql" и стартуем снова: "c:\>net stop mysql". Вы спрашиваете, зачем я все это рассказываю? Одна из причин — таким же образом можно останавливать и запускать любые другие службы. А вторая... Ну, представьте, что у вас стоит сервер MySQL где-нибудь в локальной сети, а ваш компьютер находится в другом здании, и вам необходимо срочно переконфигурировать его. Бежать к серверу и вживую его настраивать? Ну, вы как хотите, а мне лично лень. Коннектимся к серверу и удаленно админим:-). Кстати, программка mysql.exe, которой мы пользовались для подключения к серверу (а именно это мы и делали), может работать и с удаленным сервером. Это легко увидеть, запустив mysql.exe следующим образом: "c:\>mysql -h IP_adresss", где вместо "IP_address" — либо имя компьютера, к которому мы подключаемся, либо его IP-адрес:-). Ну вот, сервер мы перезапустили (или просто написали "FLUSH PRIVILEGES;"). Теперь, ежели все правильно, вы не сможете подключиться к своему серверу, просто запустив mysql.exe. Необходимо ввести пароль. Делается это таким образом: "c:\>mysql -u root -p". Вас попросят ввести пароль на root, которые мы с вами задавали выше. Если все нормально, появится приглашение "mysql>", как и ранее. Теперь попробуем создать еще юзверей. Делается это так. Создадим троих юзверей с разными правами:
"
mysql> GRANT ALL PRIVILEGES ON *.* TO ferst@localhost
IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO ferst@"%"
IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
mysql> GRANT USAGE ON *.* TO doom@localhost;
"
Кстати, если вы дадите команду "mysql> status", сервер вам выдаст некоторое количество полезной информации. Итак, мы создали трех юзверей. Первый — ferst — получает все права и может подключаться к серверу как с локального компьютера, так и удаленно, пароль для доступа ему назначен sam_pass. Второй юзверь — admin — получает права на reload и refresh, но может подключаться только с локального компьютера (что означает значок "%"), пароль на вход не назначен. Третий юзверь с именем doom может подключаться с локального компьютера, и он создан, так сказать, "бесправным", т.е. все глобальные привилегии ему не даны. То же самое можно было бы сделать по-другому. Например, вот так:
"
mysql> INSERT INTO user VALUES ('localhost','ferst',PASSWORD('some_pass'),
'Y','Y','Y','Y','Y','Y','Y', 'Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user VALUES('%','ferst',PASSWORD('some_pass'),
'Y','Y','Y','Y','Y','Y','Y', 'Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user SET Host='localhost',User='admin',
Reload_priv='Y', Process_priv= 'Y';
mysql> INSERT INTO user(Host, User,Password)
VALUES('localhost','doom','');
mysql> FLUSH PRIVILEGES;
"
Наверное, необходимо пояснить, что это значит. Команда INSERT вставляет строчку в таблицу, название которой следует после слова INTO, в скобках даны названия столбцов, имеющихся в этих таблицах. После VALUES следуют значения, которые заносятся в соответствующие колонки. Значения необходимо заключать в кавычки. Последняя команда обновляет права доступа. Буква 'Y' означает включение соответствующей привилегии, 'N' — соответственно выключение. Таблица user имеет следующие столбцы (даны в том же порядке, что и в реальности):
"| Host | User | Password | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv | Index_priv | Alter_priv |"
Я думаю, что в пояснениях данная таблица не нуждается. Названия колонок говорят сами за себя (если вы, конечно, знаете английский, как я — на уровне 5-го класса хотя бы:-)). Естественно, что, ежели в предыдущих командах буквы 'Y' заменить на 'N', соответствующий пользователь соответствующего права и не получит:-). Теперь разберемся, каким образом можно изменять права юзверей при подключении к базе данных. Для этого существует команда GRANT.
"
mysql> GRANT SELECT,INSERT,UPDATE, DELETE,CREATE,DROP
ON bankaccount.*
TO custom@localhost
IDENTIFIED BY 'stupid';
mysql> GRANT SELECT,INSERT,UPDATE, DELETE,CREATE,DROP
ON expenses.*
IDENTIFIED BY 'stupid';
mysql> GRANT SELECT,INSERT,UPDATE, DELETE,CREATE,DROP
ON customer.*
TO custom@'%'
IDENTIFIED BY 'stupid';
"
Поясню, что делают эти команды. После команды GRANT следует список привилегий, которые необходимо предоставить юзверю custom. После слова ON идет название базы данных, после точки можно указать конкретную таблицу в этой базе данных, а звездочка означает "любая". А после слова TO идет имя_юзверя@имя_ компьютера, с которого этот юзверь сможет подключаться. Знак процентов означает "любой_компьютер". После слов IDENTIFIED BY следует указать в кавычках пароль, который будет требоваться у юзверя при входе. В данном случае это 'stupid'. Конечно, подобного результата можно добиться и непосредственной модификацией таблицы user. Например, вот так:
"
mysql> INSERT INTO user (Host,User, Password)
VALUES('localhost','custom', PASSWORD('stupid'));
"
Я думаю, понятно, что делает данная команда. Она вставляет в таблицу user запись со значениями в столбцах, которые записаны после слова VALUES. Соответствующей модификацией этой команды можно достичь тех же результатов, что и использованием команд, изложенных выше. И не забудьте после того, как внесете изменения, дать команду FLUSH PRIVILEGES;. Теперь, после того, как вы успешно создали юзеров, переходим к более интересной части — собственно созданию базы данных. Для создания базы данных необходимо из той же директории, что и программу mysql.exe, запустить программу mysqladmin.exe. Если вы запустите эту программу просто без опций, она выдаст вам список параметров запуска. Собственно, и все использование этой программы сводится к запуску ее с соответствующими опциями. Итак, нас прежде всего интересует создание и удаление баз данных, а также подключение через логин и пароль к удаленному серверу (лень — воистину двигатель прогресса!). Подключаемся к удаленному серверу hostname с использованием логина root пароля, который у нас после спросят.
"C:\mysql\bin>mysqladmin -h hostname -u root -p OPTIONS". Вместо OPTIONS необходимо написать собственно то, что мы хотим сделать. Создание базы данных с именем database_name "C:\mysql\bin>mysqladmin -h mentalzavr -u mentalzavr -p create database_name". Удаление базы данных database_name после подтверждения и ввода пароля: "C:\mysql\bin>mysqladmin -h mentalzavr -u mentalzavr -p drop database_name". Существуют также и другие параметры запуска, на которых мы особо останавливаться не будем, хотя они не менее важны. Сведения о них вы получите, как я вам уже сказал, запустив mysqladmin без опций. Итак, мы создали базу данных. Теперь необходимо создать таблицы, в которых, собственно, и будут храниться данные. Любая таблица должна относиться к какой-либо базе данных. Поэтому запускаем mysql.exe и выбираем только что созданную базу данных "mysql> use database_name" Для создания таблицы существует команда CREATE. Синтаксис таков: "mysql>create table table_name(name int(3),name char(15));", где table_name — имя таблицы, после которой в скобках через запятую указаны последовательно имя столбца и его тип. Конечно, столбцов может быть и больше, чем два. Цифры в столбцах показывают размер значения в столбце. Ну, и для того, чтобы удалить таблицу, соответственно, необходимо написать: "mysql>drop table table_name" Таблиц в базе данных может быть несколько. Теперь вкратце остановимся на типах данных в таблице. Их довольно много, и поэтому я думаю на первых порах (а данная статья предназначена для предоставления только НАЧАЛЬНЫХ сведений об администрировании СУБД MySQL, и ни в коем разе не является полным руководством) ограничиться нижеизложенным. Пожалуй, наиболее часто встречающимся полем в таблицах является порядковый номер. Это довольно удобно. Так, в MySQL существует возможность создать таблицу со столбцом, значение которого будет изменяться на единицу с каждой новой записью. Теперь о том, как это делается. Как обычно, пишете в консоли:
"
mysql>use test;
mysql> CREATE TABLE table_name (No-mer int auto_increment,text char (10),key (Nomer));
"
Данные команды выбирают в качестве текущей базу данных test и создают таблицу с именем table_name с двумя колонками. Первая колонка имеет атрибут Extra "auto_increment". Это значит, что при добавлении записи в эту таблицу значение (число) в этом столбце будет автоматически увеличиваться на единицу. Посмотреть свойства колонок таблицы можно следующим образом (дав соответствующую команду): "mysql> desc table_name;".
Так, теперь коснемся остальных типов данных. Числовые. Их присутствует большое количество, основными являются (на мой взгляд) INT и FLOAT. Те, кто знаком хотя бы немного с языком программирования С++, поймут сразу же, что первый из них — это целочисленный тип данных. FLOAT — тип данных, используемый для хранения чисел с плавающей точкой. Типы данных даты и времени. К ним относятся DATA, TIME, YEAR, а также некоторые другие. Формат хранения данных в типе DATA — "YYYY-MM-DD", в типе TIME — "HH:MM:SS", в типе YEAR — "YYYY". И практически основным типом данных является CHAR. К текстовым типам также относятся TEXT (65535 символов максимально) и некоторые другие.
И в заключение я хотел бы дать несколько полезных команд, которые помогут вам использовать консоль более эффективно. Все советы действительны для cmd.exe — командного процессора Windows. Для начала вам необходимо включить использование мыши в консоли. Для этого щелкните правой кнопкой мыши на заголовке открытого окна консоли и выберите Свойства. И на первой закладке поставьте галочки напротив пунктов Выделение мышью и Быстрая вставка, а также напротив Отбрасывать повторения. Теперь вы можете в консоли использовать все прелести работы с буфером обмена. Выделение мышью происходит как обычно, копирование в буфер обмена — при нажатии на правую кнопку. Вставка производится в место нахождения курсора также правой кнопкой. Пара слов об автоматизации процесса первичного занесения данных в таблицы. Если вы создаете базу данных с нуля, то никаких проблем практически не возникает (ну, если не считать большого количества организационной работы и непосредственно кодинга, в процесс которого входит создание хотя бы web-интерфейса:-). Конечно, пару-другую строчек можно занести и в консоли. Ну, а ежели у вас имеется какой-то текстовый файл с записями, данные из которых нужно перевести в БД MySQL? Тут воевать только буфером обмена с бесконечным повторением действий "копирование-вставка" может только ну очень большой… трудоголик. Ну, а мы как умные люди можем поступить проще (правда, все в этом мире относительно). Дело в том, что можно в качестве аргумента в команде "mysql> \. File_name" передать имя файла "File_name", и этот файл будет выполнен. Что он собой представляет? Это просто последовательный список SQL-команд. Теперь нам остается только сгенерировать такой файл, что в каждом отдельно взятом случае делается по-разному — тут нужно смотреть по обстановке. Конечно, можно пойти еще дальше и написать программу для автоматического занесения данных в БД. Но для простых задач можно просто даже текстовый файл с написанными в нем командами скопировать в буфер и вставить в приглашение MySQL. "Вводы" будут восприниматься как знак завершения команды. Только не забывайте ставить в конце каждой строчки ";", ведь в mysql.exe команды можно вводить и в многострочном режиме, поэтому могут случаться накладки. Правда, есть и альтернативный способ. Если у вас есть текстовый файл с записями в виде таблицы, и они в нем разделены при помощи запятых и знаков окончания строки либо каких-то иных символов (тогда следует внести изменения в параметры следующей команды, заменив запятую и "\n" на соответствующие знаки), можно использовать команду "mysql> LOAD DATA INFILE "data.txt" INTO TABLE my_table FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';". Результатом данной команды должна явиться таблица. В файле поля должны быть разделены запятыми, а каждая запись — начинаться с новой строки. Следует помнить еще и о такой вещи, как кодировка. Если все данные вносить через консоль, то они будут храниться в DOS-кодировке, и при выводе таких данных — например, если в html-странице используют PHP — вы увидите "абракадабру". Чтобы этого не происходило, заносите данные только в одной кодировке или перекодируйте их с помощью специальных функций (для PHP это функция $text_after=convert_cyr_string ($text,"w","d"), где два последних параметра указывают соответственно на то, что исходная кодировка — Windows, а конечная после перекодировки — DOS). И напоследок. Гораздо приятней работать с консолью, так всеми нелюбимой, ежели сделать что-то вроде этого: "C:\>title LINUX".
Эта статья посвящена теме базы данных MySQL, а именно использования всей мощности этой БД в своих приложениях, написанных на языках С/C++. В статье будут описаны некоторые интересные хинты, которые были освоены в процессе работы с mysql-API.
//===( 0x1 :: Предисловие )=====================================================
mysql это реляционная база данных. Реляционная от слова "реляции", то есть таблицы. Это значит что вся
информация в БД представлена в виде таблиц. mysql считается самой распространенной БД. Сложно найти хостера, который не поддерживает mysql. Почти каждый нормальный движок для сайта пользует для своих нужд БД, зачастую это mysql. Но так повелось что услугами этой мощнейшей БД пользуются или при
разработке web-интерфейсов и приложений или же в клиент-серверных приложениях,используя интерфейс ODBC и всякие ацтойные ODBC-драйвера. Но мы пойдем другим путем. Мы будем работать с данной БД на самом низком уровне.
Так вот, все mysql client's, интерфейсы для администрирования и пр.,включая интерфейс для тех же PHP и Perl пользуются так называемым MYSQL API, это самый низкий уровень, на который мы можем опуститься, программируя свою тулзу для работы с БД.
//===( 0x2 :: Библиотека libmysql )=============================================
В предыдущем разделе я упомянул про MySQL API. Итак, что такое MySQL API? API -application programming interface. То есть это набор функций, которые предоставлены самими разработчиками данной БД. MYSQL API содержат большое количество функций и встроенных типов данных. С помощью этих функций мы можем
делать все что только прийдет в голову. Подавать любые запросы, выставлять права доступа к БД, создавать и удалять БД, таблицы, в общем ВСЕ! Все эти функции находятся в библиотеке libmysql. Можете ковырнуть их при помощи dumpbin/etc и заглянуть в истоки mysql API, посмотреть на их сигнатуры 8) Есть две библиотеки:
динамическая libmysql.dll и статическая libmysql.lib Данные библиотеки доступны с сервера mysql.com.
//===( 0x3 :: Что необходимо для работы )======================================
Для того чтобы приступить к написанию своей программы необходимо следующее:
[x] динамическая библиотека libmysql.dll
[x] статическая библиотека libmysql.lib для статической линковки
[x] заголовочные файлы, в стандартной поставке есть следующее файло:
- DBUG.H
- ERRMSG.H
- Libmysql.def
- M_CTYPE.H
- M_STRING.H
- MY_LIST.H
- my_pthread.h
- MY_SYS.H
- Mysql.h
- mysql_com.h
- mysql_version.h
- mysqld_error.h
- RAID.H
[x] ну и конечно же С-компилятор, я пользую Visual C++ 6.0
//===( 0x4 :: Перечень основных функций и типов данных )========================
Перечислять все функции с сигнатурами и все типы данных в рамках одной статьи просто нереально. Я приведу список ОСНОВНЫХ функций, которыми приходится пользоваться при написании ПО и основных встроенных типов данных и структур. Если кто заинтересуется темой статьи и решит серьезно заняться разработкой программ с использованием MySQL API - смотрите в разделе [0x7] перечень линков,
по которым можно найти массу инфы по данной теме.
Итак. Есть три основных типа данных:
MYSQL
Эта структура является своеобразным дескриптором базы данных для текущего соединения. Ей приходится пользоваться почти во всех функциях.
MYSQL_RES
Эта структура содержит результат запроса, который возвращает строки (SELECT,SHOW, DESCRIBE, EXPLAIN). То есть если вы запросили select * from mytable -структура будет содержать таблицу с данными, которые вернул сервер mysql. ну ит.п.
MYSQL_ROW
Этот тип используется для доступа к отдельной строке таблицы, которую мы получили от сервера в ответ на запрос. Этот тип реализован как массив строк с фиксированным количеством байтов (их нельзя трактовать как строки с нулевым символом в конце, если величины полей могут содержать двоичные данные, поскольку
они могут содержать ноль байтов). Строки можно получить вызовом функции mysql_fetch_row().
Ну и вот список функций, сигнатуры и более детальная информация есть в хедерах и мануале, которые доступны с mysql.com.
mysql_affected_rows()
mysql_change_user()
mysql_character_set_name()
mysql_close()
mysql_connect()
mysql_create_db()
mysql_data_seek()
mysql_debug()
mysql_drop_db()
mysql_dump_debug_info()
mysql_eof()
mysql_errno()
mysql_error()
mysql_escape_string()
mysql_fetch_field()
mysql_fetch_field_direct()
mysql_fetch_fields()
mysql_fetch_lengths()
mysql_fetch_row()
mysql_field_count()
mysql_field_seek()
mysql_field_tell()
mysql_free_result()
mysql_get_client_info()
mysql_get_host_info()
mysql_get_proto_info()
mysql_get_server_info()
mysql_info()
mysql_init()
mysql_insert_id()
mysql_kill()
mysql_list_dbs()
mysql_list_fields()
mysql_list_processes()
mysql_list_tables()
mysql_num_fields()
mysql_num_rows()
mysql_options()
mysql_ping()
mysql_query()
mysql_real_connect()
mysql_real_escape_string()
mysql_real_query()
mysql_reload()
mysql_row_seek()
mysql_row_tell()
mysql_select_db()
mysql_shutdown()
mysql_stat()
mysql_store_result()
mysql_thread_id()
mysql_use_result()
как видите, достаточно широкий спектр разнообразных функций 8)
//===( 0x5 :: Логика работы с mysql-api)========================================
Теперь стоит рассмотреть алгоритм работы. Так как функций достаточно много - несразу становится понятным что как и когда вызывать для получения нужногорезультата. Для начала объявим переменные, без которых никак не обойтись:
MYSQL mysql;
MYSQL_ROW row;
MYSQL_RES *res;
// перед коннектом к серверу устанавливайте reconnect=true. если программе не
// удастся соединится с сервером, она продолжит попытки подключения, избавляя
// вас тем самым, от лишних телодвижений. ессно, иногда это не нужно, так что
// каждый сам для себя решает как ему лучше.
mysql.reconnect = true;
// дальше инициализируем объект типа MYSQL. это ОБЯЗАТЕЛЬНО!
mysql_init( &mysql );
// следующий шаг - непосредственное соединение с сервером. для этого пользуем
// mysql_real_connect(). о том, почему нужно использовать именно эту функцию
// смотрите в разделе 0x6 Хинты
// сигнатура функции такова:
MYSQL *mysql_real_connect(
MYSQL *mysql,
const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket, // при написании софтины под винду установите в NULL
unsigned int client_flag); // дополнительные флаги. подробнее в разделе 0x6
// тут все предельно ясно. имена переменных в параметрах говорят об их
// предназначении
// итак, запрос на соединение мы подали. что дальше? дальше - !!! возьмите себе
// за правило проверять коды возвращаемых ошибок, это вас избавит от
// преждевременного геморроя 8)
// результат выполнения любой функции можно проверить следующим образом:
// есть две функции:
unsigned int mysql_errno(MYSQL *mysql);
char *mysql_error(MYSQL *mysql);
// первая возвращает числовое значение кода ошибки. если ошибок не было -
// возвращает 0. вторая, mysql_error(MYSQL*) возвращает текстовое описание
// ошибки. это оч удобно с точки зрения отладки и диагностики ошибок. то есть
// если mysql_errno()!=0 значит выводим сообщение об ошибке при помощи
// mysql_error()
if( mysql_errno( &mysql ) ) // если не равно 0...
fprintf(stderr, "[err#%u] %s\r\n",mysql_errno(&mysql), mysql_error(&mysql) );
// ...выводим мессадж об ошибке
// ну а если все ок - продолжаем дальше.
// итак. к серверу мы законектились. теперь приступаем к делу, ведь вы
// конектились с какой-то целью? к примеру вы хотите получить значения таблицы
// passwordz, которая находится в базе данных cool_dialup_provider. ок, не вопрос.
// оформляем запрос. думаю вы знакомы с языком SQL 8)
char query_ptr[1024]; //отхватим побольше памяти 8)
sprintf(query_ptr, "use cool_dialup_provider");
// дальше необходимо подать серверу запрос, для этого была придумана следующая
// функция:
int mysql_query(MYSQL *mysql, const char *query) ;
// надеюсь вы уже все поняли, *mysql - это указатель на дескриптор соединения,
// который мы ранее использовали в mysql_init() и mysql_real_connect()
if( mysql_query( &mysql, query_ptr ) )
fprintf(stderr, "[err#%u] %s\r\n",mysql_errno(&mysql), mysql_error(&mysql) );
// если в процессе выполнения функции возникла ошибка - возвращаемое значение
// НЕ равно 0 вот возможные возвращаемые ошибки:
// CR_COMMANDS_OUT_OF_SYNC Команды были выполнены в ненадлежащем порядке
// CR_SERVER_GONE_ERROR Сервер MySQL неожиданно завершил работу
// CR_SERVER_LOST Соединение с сервером прервалось в процессе данного запроса
// CR_UNKNOWN_ERROR Произошла неизвесная ошибка
// итак, запрос выполнили. к базе присоединились. теперь приступим к следующему
// шагу - получение информации из таблицы. первые шаги абсолютно аналогичны -
// оформляем sql-запрос, подаем запрос серверу, если ошибок не возникло - получаем
// результат запроса.
sprintf(query_ptr, "select * from passwordz");
// вывести все данные из таблицы passwordz
if( mysql_query( &mysql, query_ptr ) || mysql_field_count()==0 )
fprintf(stderr, "[err#%u] %s\r\n",mysql_errno(&mysql), mysql_error(&mysql) );
// наш запрос должен вернуть данные из таблицы. итак, мы подошли к оч интересному
// моменту. бывают случаи, когда в процессе возникли ошибки, или же вы подали
// кривой запрос. чтобы работу нашей программы сделать более надежной после
// запросов, которые должны вернуть данные (SELECT, SHOW, DESCRIBE, EXPLAIN) вместе
// с функцией mysql_errno() проверяйте вернул ли сервер вообще какую-то таблицу
// данных:
unsigned int mysql_field_count(MYSQL *mysql)
// эта функция возвращает количество полей таблицы, которую вернул сервер.
// если возникла ошибка это значение будет равно 0
// если ошибок нет - работаем дальше
// итак, мы подали запрос, который должен вернуть нам данные. в случае таких
// запросов результирующие данные помещаются в объект типа MYSQL_RES *res и дальше
// уже спецовыми функциями обрабатывается и получаются сырые данные, то есть то что
// нужно - plain text.
res = mysql_store_result( &mysql ); //загоняем в MYSQL_RES данные
// будте внимательны с функцией mysql_store_result(), подробнее читайте в 0x6.
// бывают случаи, когда в таблице нет данных. обработать эту ситуацию можно при
// помощи следующей функции:
my_ulonglong mysql_num_rows(MYSQL_RES *result);
// my_ulonglong объявлен так: typedef unsigned long my_ulonglong;
// то есть понятно - функция вернет количество строк в таблице, которую вернул
// сервер. если это значение равно 0 - переходим к обработке этой ситуации, а не
// тратим время и силы на непонятно что.
// допустим сервер вернул нам данные. бывают случаи когда вы не знаете структуры
// таблицы, поэтому минимум что нужно - знать количество столбцов для вывода
// таблицы в нормальном виде, для этого была введена функция:
unsigned int mysql_field_count(MYSQL *mysql);
unsigned int colnum = mysql_field_count( &mysql );
// опять же, можете проверять не равно ли значение нулю перед обработкой результата
// допустим количество столбцов равно 3, теперь приступим непосредственно к
// извлечению данных, !данные считываются ПОСТРОЧНО! для этого используем функцию:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
// MYSQL_ROW это своеобразный массив строк
// итак у нас таблица с тремя столбцами больше нам ничего не известно.
// конечно, есть функции для извлечения имен столбцов и прочих радостей, но это
// уже вы сами решите нужно это вам или нет
unsigned int rnum=0;
while ( row = mysql_fetch_row( res ) ){
printf("[%u]---| ", rnum++); // ну эт уже чтобы красиво табличку вывести
for(unsigned int cnt=0; cnt<colnum; cnt++)
printf(" | %s |",(((row[cnt]==NULL)||(!lstrlen(row[cnt])))?"NULL":row[cnt]));
printf("\r\n");
}
// то есть в цикле выводим все строки таблицы пока функция mysql_fetch_row()
// что-то возвращает можете выводить строки в свои переменные и потом их обработать, можете в файл.
// как хотите так и делайте. значительно удобнее когда нам известна структура таблицы.
// после того как была извлечена последняя строка необходимо "очистить"
// результирующий набор данных, который вернул нам сервер. пользуем спецовую функцию:
void mysql_free_result(MYSQL_RES *result);
// и отсоединяемся от сервера:
void mysql_close(MYSQL *mysql);
//===( 0x6 :: Хинты )============================================================
[--[0x6 - 0]---
Первый и основной хинт - проверяйте всегда возвращаемые значения функций:
mysql_errno() и mysql_error(). Напомню еще раз:
unsigned int mysql_errno(MYSQL *mysql); если возникла ошибка - возвращает значение, отличное от нуля
char *mysql_error(MYSQL *mysql) если возникла ошибка - возвращает значение, отличное от NULL
[--[0x6 - 1]---
Всегда используйте mysql_real_connect() всесто mysql_connect(). Причин тому несколько: самая основная - эта функция возвращает значение ошибок в случае потери соединения с сервером, mysql_connect() этого не делает.
вот коды ошибок для mysql_real_connect()
CR_CONN_HOST_ERROR Не удалось соединиться с сервером MySQL.
CR_CONNECTION_ERROR Не удалось соединиться с локальным сервером MySQL.
CR_IPSOCK_ERROR Не удалось создать IP-сокет.
CR_OUT_OF_MEMORY Недостаток памяти.
CR_SOCKET_CREATE_ERROR Не удалось создать Unix сокет.
CR_UNKNOWN_HOST Не удалось найти IP-адрес для данного имени хоста.
CR_VERSION_ERROR Несоответствие протокола, что явилось результатом попытки
соединения с сервером с клиентской библиотекой, использующей иную версию
протокола. Это может произойти при использовании очень старой клиентской
библиотеки для подключения к новому серверу, при запуске которого не была
установлена опция --old-protocol
CR_NAMEDPIPEOPEN_ERROR Не удалось создать именованный канал на Windows.
CR_NAMEDPIPEWAIT_ERROR Не удалось дождаться именованного канала на Windows.
CR_NAMEDPIPESETSTATE_ERROR Не удалось получить обработчик канала на Windows.
CR_SERVER_LOST Если connect_timeout > 0 и требовалось больше, чем connect_timeout секунд для соединения с сервером или если сервер прекратил работу во время выполнения init-command.
Дальше. Взгляните на сигнатуры этих функций и вы заметите что mysql_real_connect() позволяет более тонко указать параметры соединения:
MYSQL *mysql_real_connect(
MYSQL *mysql,
const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned int client_flag)
MYSQL *mysql_connect(
MYSQL *mysql,
const char *host,
const char *user,
const char *passwd)
что мы имеем? имеем 4 дополнительных параметра! давайте подробнее разберем их:
const char *db - вы можете задать имя базы данных, используемой по-умолчанию следует заметить что по-умолчанию только для данного соединения, то есть с данным дескриптором MYSQL
unsigned int port - также мы можем указать порт, на котором следует искать сервер БД mysql
const char *unix_socket - сокет или именованный канал, который следует использовать
unsigned int client_flag:
Можно задать дополнительные флаги:
CLIENT_COMPRESS Использовать сжатие в протоколе.
CLIENT_FOUND_ROWS Возвращать количество найденных (совпавших) строк, а не
количество строк, подвергшихся воздействию.
CLIENT_IGNORE_SPACE Допускать пробелы после имен функций. Сделать имена всех
функций зарезервированными словами.
CLIENT_INTERACTIVE Допускать простой длительностью interactive_timeout секунд
(вместо wait_timeout секунд) перед закрытием данного соединения.
CLIENT_NO_SCHEMA Запретить использование формы db_name.tbl_name.col_name. Этоделается для ODBC и заставляет синтаксический анализатор генерировать ошибку при использовании данного синтаксиса, который полезен для выявления ошибок в некоторых программах ODBC.
CLIENT_ODBC Клиентом является клиент ODBC. Настраивает mysqld для большей
совместимости с ODBC.
CLIENT_SSL Использовать SSL (протокол шифрования).
как видите, существенные преемущества 8)
[--[0x6 - 2]---
следующий хинт - использование функции mysql_store_result(). это опять таки очень важный момент, поэтому советую запомнить его и если не до конца поняли суть - перечитать еще раз. так вот, функция mysql_store_result() вызывается для получения результирующего набора данных, то есть загрузкой объекта MYSQL_RES.
итак, постараюсь максимально понятно объяснить в чем хинт:
стандартная последовательность:
1) подаем запрос при помощи mysql_query()
2) если нет ошибок - получаем результат в MYSQL_RES при помощи mysql_store_result()
3) освобождаем выделенную память при помощи mysql_free_result()
итак, если вы забудете вызвать mysql_store_result() после успешно выполненной mysql_query() вас ожидает НЕприятный сюрприз - после следующего запроса вы получите данные, которые вернул сервер для предыдущего запроса! потому после КАЖДОГО запроса, который должен вернуть данные вызывайте ВСЕГДА mysql_store_result() ну и возьмите за правило хорошего тона - освобождение ненужной памяти, в данном случае - mysql_free_result() этим и займеться.
[--[0x6 - 3]---
библиотеки и инклуды найти очень легко, они есть в каждом полноценном дистрибутиве mysql ;)
[--[0x6 - 4]---
очень важный момент - использовать версии libmysql.lib и libmysql.dll с одной и той же версии дистрибутива mysql! оказывается, иногда бывают нереальные глюки 8)
[--[0x6 - 5]---
если вы собираетесь использовать Builder C++, этот хинт именно для вас!
(+) чтобы получить корректную статическую библиотеку пользуйте implib.exe:
implib.exe libmysql.lib libmysql.dll
(+) Если компилятор ругается на переменную my_socket, (см. mysql.h) - нужно заменить ее переопределение с #define my_socket SOCKET на #define my_socket UINT_PTR Q.Часто вылетает ошибка БД форума на Vbulletin, такого характера:
Ошибка MySQL : The table 'session' is full
Номер ошибки : 1114
A.Убедитесь, что задания по крону успешно выполняются. Должна работать автоочистка таблицы сессий. Посмотрите, есть ли в шаблоне $cronimage.В футере должно быть.
Q: Пишу для одной крупной компании скрипт для организации online магазина, и все уже почти готово. Осталось отконвертировать имеющуюся у заказчиков MS Access базу данных в MySQL. Подскажи, как это можно сделать наиболее качественно, оперативно и безболезненно?
A: Дельный вариант, по-моему, только один – воспользоваться тулзой Access2MySQL (www.data-conversions.net), которая помимо конвертирования *.mdb (Microsoft Access) в MySQL умеет также выполнять и обратное преобразование. Имеется подобная утилита и для работы с dbf-базами - dbf2MySQL (www.nica.ru/~ae). Обе крайне просты в установке и использовании, поэтому какие-либо проблемы практически исключены.
seo & website usability | inet | os faq | hardware faq | memory | video | cpu | hdd | mainboard faq | printer & scaner | modem | mobiles | hackzone |
Windows 10 | Registry Windows 10 | Windows7: Общие настройки | Windows7: Реестр | Windows7: Реестр faq | Windows7: Настроки сети | Windows7: Безопасность | Windows7: Брандмауэр | Windows7: Режим совместимости | Windows7: Пароль администратора | Память | SDRAM | DDR2 | DDR3 | Quad Band Memory (QBM) | SRAM | FeRAM | Словарь терминов | Video | nVIDIA faq | ATI faq | Интегрированное видео faq | TV tuners faq | Терминология | Форматы графических файлов | Работа с цифровым видео(faq) | Кодеки faq | DVD faq | DigitalVideo faq | Video faq (Архив) | CPU | HDD & Flash faq | Как уберечь винчестер | HDD faq | Cable faq | SCSI адаптеры & faq | SSD | Mainboard faq | Printer & Scaner | Благотворительность
|
На главную | Cookie policy | Sitemap