Текст книги "Основы программирования в Linux"
Автор книги: Нейл Мэтью
Соавторы: Ричард Стоунс
Жанры:
Программирование
,сообщить о нарушении
Текущая страница: 30 (всего у книги 67 страниц)
Итак, у вас есть действующий сервер MySQL, безопасная регистрация вашего пользователя и база данных, готовая к применению. Что дальше? Сейчас нужно создать несколько таблиц со столбцами для хранения данных. Но прежде чем вы сможете сделать это, следует узнать о типах данных, поддерживаемых MySQL.
Типы данных MySQL довольно обычны, поэтому мы лишь бегло пробежимся по основным типам, и как всегда более подробную информацию можно найти в руководстве по MySQL на Web-сайте MySQL.
Тип Boolean
Столбец логического типа можно определить с помощью ключевого слова BOOL
. Как вы и ожидали, в нем могут храниться значения TRUE
и FALSE
, а также специальное «неопределенное» значение баз данных NULL
.
Символьный тип
В табл. 8.7 перечислены все доступные символьные типы. Первые три – стандартные, оставшиеся три специфичны для MySQL. Мы полагаем, что на практике вы будете придерживаться стандартных типов.
Таблица 8.7
CHAR | Одиночный символ |
CHAR(N) | Символьная строка длиной точно N символов, которая будет при необходимости заполняться пробелами. Максимальная длина 255 символов |
VARCHAR(N) | Массив переменной длины из N символов. Максимальная длина 255 символов |
TINYTEXT | Аналогичен VARCHAR(N) |
MEDIUMTEXT | Текстовая строка длиной до 65 535 символов |
LONGTEXT | Текстовая строка длиной до 2³²–1 символов |
Числовой тип
В табл. 8.8 показано, что числовые типы делятся на целочисленные и типы с плавающей точкой.
Таблица 8.8
TINYINT | Целочисленный | 8-битный тип данных |
SMALLINT | Целочисленный | 16-битный тип данных |
MEDIUMINT | 24-битный тип данных | |
INT | Целочисленный | 32-битный тип данных. Это стандартный тип и хороший выбор для данных общего назначения |
BIGINT | Целочисленный | 64-битный знаковый тип данных |
FLOAT(P) | С плавающей точкой | Числа с плавающей точкой с точностью как минимум P знаков |
DOUBLE(D, N) | С плавающей точкой | Числа с плавающей точкой и двойной точностью из D цифр и N десятичных знаков |
NUMERIC(P, S) | С плавающей точкой | Действительные числа длиной P разрядов всего с S десятичными разрядами из них. В отличие от DOUBLE это точно заданное число (exact number), поэтому оно больше подходит для хранения денежных сумм, но обрабатывается менее эффективно |
DECIMAL(Р, S) | С плавающей точкой | Синоним NUMERIC |
Мы полагаем, что в основном вы будете пользоваться типами INT
, DOUBLE
и NUMERIC
, поскольку они ближе всего к стандартным типам SQL. Остальные типы нестандартные и могут отсутствовать в тех системах управления базами данных, куда вы решите переместить данные когда-либо в будущем.
Временной тип
В табл. 8.9 перечислены пять имеющихся временны́х типов.
Таблица 8.9
DATE | Хранит даты с 1 января 1000 г. по 31 декабря 9999 г. |
TIME | Хранит время с -838:59:59 до 838:59:59 |
TIMESTAMP | Хранит метку времени, начиная с 1 января 1970 г. и по 2037 г. |
DATETIME | Хранит даты с 1 января 1000 г. по последнюю секунду 31 декабря 9999 г. |
YEAR | Хранит номер года. Будьте осторожны с двузначными величинами, поскольку они неоднозначны и автоматически преобразуются в четырехзначные числа. |
Учтите, что следует быть внимательными при сравнении значений типов DATE
и DATETIME
в отношении способа обработки значения времени; результаты могут оказаться неожиданными. Подробности ищите в руководстве по MySQL, поскольку поведение разных версий СУРБД слегка отличается.
Имея действующий сервер базы данных, зная как предоставлять права доступа пользователям и как создавать базу данных, а также ознакомившись с основными типами данных, можно переходить к созданию таблиц.
Таблица базы данных – это просто последовательность строк, каждая из которых содержит фиксированный набор столбцов. Она довольно похожа на электронную таблицу за исключением того, что у всех строк должно быть одно и то же число столбцов и одинаковые типы данных и каждая строка каким-то образом должна отличаться от всех остальных строк таблицы.
База данных может, если для этого есть разумные основания, содержать очень много, практически неограниченное количество таблиц. Однако лишь немногим СУРБД требуется более 100 таблиц, а большинству маленьких систем вполне достаточно 25 или около того таблиц.
Синтаксис языка SQL, посвященный созданию объектов баз данных и называемый DDL (data definition language, язык определения данных), невозможно охватить полностью в одной главе; все подробности есть в разделе документации, на Web-сайте MySQL.
Базовый синтаксис для создания таблиц следующий:
CREATE TABLE <таблица> {
column type [NULL | NOT | NULL] [AUTO_INCREMENT] [PRIMARY KEY]
[, ...]
[, PRIMARY KEY (столбец [, ...] ) ]
)
Удалять таблицы можно с помощью очень простой синтаксической формулы DROP TABLE
.
DROP TABLE <таблица>
Есть всего лишь небольшое число ключевых слов, приведенных в табл. 8.10, которые вам необходимо знать для того, чтобы быстро создать таблицу.
Таблица 8.10
AUTO INCREMENT | Это специальное ключевое слово сообщает MySQL о том, что, когда вы пишете в данный столбец NULL , следует автоматически заполнить столбец данными с помощью автоматически формируемого числа с наращением. Это чрезвычайно полезное средство; оно позволяет применять MySQL для автоматического назначения уникальных номеров строкам ваших таблиц, хотя оно может применяться только в столбцах, являющихся также первичными ключами. В других системах управления базами данных оно часто реализуется порядковым типом или управляется более явно с помощью последовательности |
NULL | Специальное значение в базе данных, обычно применяемое для обозначения «неизвестной» величины, но может также использоваться для обозначения «неподходящего» значения. Например, если вы заполняете таблицу подробными данными о сотрудниках, у вас может быть столбец с адресом электронной почты. В этом случае вы будете хранить NULL вместо адреса данного сотрудника, чтобы показать, что для конкретного человека эта информация не известна. Запись NOT NULL означает, что в этом столбце нельзя хранить значения NULL и может оказаться полезной для того, чтобы помешать вводу в такие столбцы значений NULL , если, например, значение всегда должно быть известно, как в случае фамилии сотрудника |
PRIMARY KEY | Указывает на то, что данные в этом столбце будут уникальными и разными во всех строках данной таблицы. У каждой таблицы может быть только один первичный ключ |
Выполните упражнение 8.1.
Упражнение 8.1. Создание таблицы и вставка данных
Гораздо легче понять создание таблицы на практике, чем смотреть на базовую синтаксическую запись, поэтому сейчас вы сделаете это, создав таблицу с именем children
, в которой будет храниться уникальный номер для каждого ребенка, его имя и возраст. Номер ребенка вы сделаете первичным ключом.
1. Вам нужен следующий оператор языка SQL
CREATE TABLE children (
childno INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY,
fname VARCHAR(30),
age INTEGER
);
Примечание
Обратите внимание на то, что в отличие от большинства языков программирования имя столбца (
childno
) указывается перед типом столбца (INTEGER
).
2. Вы также можете определить первичный ключ отдельно в определении столбца. Далее приведен пример интерактивного сеанса, в котором показан альтернативный синтаксис:
mysql> use rick
Database changed
mysql> CREATE table children (
-> childno INTEGER AUTO_INCREMENT NOT NULL,
-> fname varchar(30),
-> age INTEGER,
-> PRIMARY KEY(childno)
-> );
Query OK, 0 rows affected (0.04 sec)
mysql>
Вы можете записать команду или оператор SQL в нескольких строках, и монитор mysql
применит подсказку ->
, чтобы показать, что вы находитесь в строке продолжения. Как упоминалось ранее, команда SQL завершается точкой с запятой, чтобы показать, что вы закончили и готовы к обработке вашего запроса сервером базы данных.
Если вы допустили ошибку, MySQL разрешит вернуться назад к предыдущим командам, откорректировать и повторно ввести их простым нажатием клавиши
3. Теперь у вас есть таблица, в которую можно вводить данные. Данные добавляются с помощью SQL-команды INSERT
. Поскольку вы определили столбец childno
как AUTO_INCREMENT
, в него не вводятся данные, вы просто разрешаете MySQL разместить в нем уникальный номер.
mysql> INSERT INTO children(fname, age) VALUES(«Jenny», 21);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO children(fname, age) VALUES(«Andrew», 17);
Query OK, 1 row affected (0.00 sec)
Для того чтобы убедиться в том, что данные введены корректно, можно снова извлечь их. Выбираются данные из таблицы командой SELECT
:
mysql> SELECT childno, fname, age FROM children;
+–+–+–+
| childno | fname | age |
+–+–+–+
| 1 | Jenny | 21 |
| 2 | Andrew | 17 |
2 rows in set (0.00 sec) mysql>
Вместо явного перечисления столбцов для выборки вы могли бы применить для указания столбцов звездочку (*), которая перечислит все столбцы в названной таблице. Это очень удобно в интерактивном режиме, но в рабочем программном коде всегда следует явно называть столбец или столбцы, предназначенные для выборки.
Как это работает
Вы открыли интерактивный сеанс подключения к серверу базы данных и переключились на базу данных rick
. Затем вы ввели команду SQL для создания вашей таблицы, используя нужное количество строк для ввода команды. Как только вы завершили команду с помощью знака ;
, MySQL создала вашу таблицу. Затем вы применили команду INSERT
для ввода данных в вашу новую таблицу, позволив в столбце childno
автоматически размещать числа. В заключение вы применили команду SELECT
для вывода данных вашей таблицы.
Объем данной главы не позволяет дать полное описание языка SQL и тем более принципов проектирования баз данных. Дополнительную информацию см. на Web-сайте www.mysql.com.
Графические средстваРабота с таблицами и данными в командной строке хороша и удобна во всех отношениях, но в наши дни большинство людей предпочитает графические средства.
У СУРБД MySQL два основных графических средства: MySQL Administrator и MySQL Query Browser. Точное имя пакета с этими средствами зависит от используемого вами дистрибутива; например, в дистрибутивах Red Hat ищите mysql-gui-tools и mysql-administrator. В дистрибутиве Ubuntu вам, возможно, сначала придется переключиться на универсальный ("Universe") репозитарий, а затем искать mysql-admin.
MySQL Query Browser
Обозреватель запросов (query browser) довольно простое, но эффективное средство. После установки его можно запустить из меню GUI (graphical user interface, графический интерфейс пользователя). Запустив обозреватель, вы увидите начальный экран, запрашивающий подробности подключения (рис. 8.4).
Рис. 8.4
Если вы запустили обозреватель на той же машине, что и сервер, просто используйте имя локального компьютера как имя сервера.
После подключения вы получаете простой GUI (рис. 8.5), который позволяет выполнять запросы в графической оболочке, предоставляя все преимущества редактирования в графическом режиме заодно с графическим способом редактирования данных в таблице и несколькими экранами помощи с синтаксисом языка SQL.
Рис. 8.5
MySQL Administrator
Мы очень надеемся на то, что вы познакомитесь с MySQL Administrator. Это мощный, стабильный и легкий в использовании графический интерфейс для СУРБД MySQL, заранее откомпилированная версия которого существует как для ОС Linux, так и для Windows (даже исходный код доступен, если он вам нужен). MySQL Administrator позволяет управлять сервером MySQL и выполнять команды SQL через графический интерфейс пользователя.
При запуске MySQL Administrator выводится экран подключения, очень похожий на экран подключения MySQL Query Browser. После ввода некоторых подробностей у вас появится главная страница управления (рис. 8.6).
Рис. 8.6
Если вы хотите управлять сервером MySQL из программы-клиента в ОС Windows, можно загрузить Windows-версию MySQL Administrator из раздела Web-сайта MySQL, посвященного средствам GUI. Когда писалась эта книга, в загрузку были включены администратор, обозреватель запросов и утилита переноса базы данных. На рис. 8.7 показан экран состояния, как видите, он почти идентичен версии Linux,
Примечание
Напоминаем, что если вы до сих пор следовали инструкциям, то защитили свой сервер MySQL так, что пользователь root может подключиться к нему только с локальной машины и ни с какой другой машины в сети.
После запуска MySQL Administrator вы сможете провести наблюдения при разной настройке и отслеживаемых параметрах. Это очень легкое в использовании средство, но у нас нет возможности в этой единственной главе вдаваться в подробности.
Рис. 8.7
Доступ к данным MySQL из программ на С
Теперь, когда основы СУРБД MySQL остались в стороне, давайте рассмотрим, как, не применяя графические средства или программу-клиент mysql, получить доступ к СУРБД MySQL из вашего приложения.
К MySQL можно получить доступ из программ на разных языках, включая следующие:
□ С;
□ Eiffel;
□ С++;
□ Tcl;
□ Java;
□ Ruby;
□ Perl;
□ Python;
□ PHP.
Есть и драйвер ODBC для доступа к MySQL из приложений ОС Windows, таких как Access. Существует даже драйвер ODBC для ОС Linux, но в его применении мало смысла.
В этой главе мы ограничились интерфейсом языка С, потому что в первую очередь этому языку программирования посвящена книга и потому что одни и те же библиотеки обеспечивают подключение из ряда других языков.
Подпрограммы подключенияПодключение к базе данных MySQL из программы на языке С состоит из двух шагов:
□ инициализации структуры идентификации подключения или дескриптора подключения;
□ выполнения физического подключения.
Сначала примените mysql_init
для инициализации дескриптора вашего подключения:
#include
MYSQL *mysql_init(MYSQL*);
Обычно в подпрограмму передается NULL
и возвращается указатель на вновь выделяемую память для структуры дескриптора подключения. Если вы пересылаете указатель на существующую структуру, она инициализируется заново. В случае ошибки возвращается NULL
.
К этому моменту вы просто выделили память и инициализировали структуру дескриптора. Но вы еще должны предложить параметры подключения с помощью подпрограммы mysql_real_connect
:
MYSQL *mysql_real_connect(MYSQL *connection,
const char *server host, const char *sql_user_name,
const char *sql_password, const char *db_name,
unsigned int port_number, const char *unix_socket_name,
unsigned int flags);
Указатель подключения должен указывать на структуру дескриптора, уже инициализированную подпрограммой mysql_init
. Параметры в большинстве своем очевидны; но следует отметить, что server_host
может задаваться именем компьютера или IP-адресом. При подключении только к локальной машине вы можете оптимизировать тип подключения, указав в качестве этого параметра localhost
.
Параметры sql_user_name
и sql_password
соответствуют своим именам. Если регистрационное имя равно NULL
, предполагается идентификатор текущего пользователя ОС Linux. Если пароль – NULL
, вы сможете обратиться к данным только на том сервере, который доступен без пароля. Перед отправкой по сети пароль шифруется.
Параметры port_number
и unix_socket_name
должны быть равны 0 и NULL
соответственно, если вы не меняли стандартных настроек в вашей установке MySQL. Эти параметры примут соответствующие значения по умолчанию.
И наконец, параметр flags
позволяет с помощью операции OR
объединить несколько определений битовых масок, изменяя тем самым определенные характеристики применяемого протокола. Ни один из этих флагов не важен в данной вводной главе; все они подробно описаны в руководстве.
Если подключиться невозможно, возвращается NULL
. В этом случае полезную информацию может предоставить подпрограмма mysql_error
.
Когда вы прекращаете использовать подключение, обычно при завершении программы, вызовите подпрограмму mysql_close
, как показано далее:
void mysql_close(MYSQL * connection);
Эта подпрограмма разорвет соединение с сервером. Если подключение устанавливалось с помощью mysql_init
, память, отведенная под структуру дескриптора, освободится. Указатель станет неопределенным, и его нельзя будет применять в дальнейшем. Открытое ненужное подключение означает расточительное использование ресурсов, но повторное открытие подключения сопряжено с дополнительными накладными расходами, поэтому решайте сами, когда применять описанные подпрограммы.
Подпрограмма mysql_options
(которую можно вызвать только между вызовами mysql_init
и mysql_real_connect
) позволит настроить некоторые параметры.
int mysql_options(MYSQL* connection, enum option_to_set, const char *argument);
Поскольку при каждом вызове mysql_options
способна настроить только один параметр, ее следует вызывать отдельно для каждого параметра, который нужно задать. Вы можете применять эту подпрограмму необходимое количество раз, но все вызовы должны находиться между вызовами подпрограмм mysql_init
и mysql_real_connect
. Не все параметры подпрограммы имеют тип char
, который следует приводить как const char*
. Три самых часто используемых параметра приведены в табл. 8.11. И как всегда в расширенном интерактивном руководстве приведен полный список параметров.
Таблица 8.11
Enum | ||
---|---|---|
MYSQL_ОРТ_CONNECT_TIMEOUT | const unsigned int* | Количество секунд ожидания перед закрытием подключения из-за простоя |
MYSQL_ОРТ_COMPRESS | Нет, используйте NULL | Применять сжатие при сетевом подключении |
MYSQL_INIT_COMMAND | const char* | Команда, отправляемая при каждом установлении подключения |
Успешный вызов возвращает ноль. Поскольку эта подпрограмма предназначена для установки флагов, аварийное завершение всегда означает использование неверного параметра.
Для задания времени ожидания, равного семи секундам, используйте следующий фрагмент программного кода:
unsigned int timeout = 7;
...
connection = mysql_init(NULL);
ret = mysql_options(connection, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&timeout);
if (ret) {
/* Обработка ошибки */
...
}
connection = mysql_real_connect(connection ...)
Теперь, когда вы научились устанавливать, и закрывать ваше подключение, попробуем с помощью короткой программы проверить полученные знания на практике.
Начните с задания нового пароля для пользователя (в приведенном далее коде rick
на localhost
) и затем создайте базу данных foo
, к которой будете подключаться. Вы все это уже знаете, поэтому мы просто приводим последовательность действий:
$ mysql -u root -р
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
mysql> GRANT ALL ON *.* TO rick@localhost IDENTIFIED BY 'secret';
Query OK, 0 rows affected (0.01 sec)
mysql> q
Bye
$ mysql -u rick -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
mysql> CREATE DATABASE foo;
Query OK, 1 row affected (0.01 sec)
mysql> q
Вы создали новую базу данных. Вместо ввода подробностей создания таблицы и вставки команд непосредственно в командную строку монитора mysql, что сопряжено с ошибками и не слишком продуктивно при необходимости повторного ввода, вы создадите файл со всеми нужными вам командами.
Далее приведен файл create_children.sql:
–
– Create the table children
–
CREATE TABLE children (
childno int(11) NOT NULL auto_increment,
fname varchar(30),
age int(11),
PRIMARY KEY (childno)
);
–
–Populate the table 'children'
–
INSERT INTO children(childno, fname, age) VALUES (1,'Jenny',21);
INSERT INTO children(childno, fname, age) VALUES (2,'Andrew',17);
INSERT INTO children(childno, fname, age) VALUES (3,'Gavin',8);
INSERT INTO children(childno, fname, age) VALUES (4,'Duncan', 6);
INSERT INTO children(childno, fname, age) VALUES (5,'Emma',4);
INSERT INTO children(childno, fname, age) VALUES (6,'Alex',15);
INSERT INTO children(childno, fname, age) VALUES (7,'Adrian',9);
Теперь вы можете снова зарегистрироваться в MySQL, выбрав базу данных foo, и выполнить данный файл. Для краткости и как пример для включения при желании в сценарий мы поместили пароль в командную строку:
$ mysql -u rick –password=secret foo
Welcome to the MySQL monitor. Commands end with ; or g.
mysql> . create_children.sql
Query OK, 0 rows affected (0.01 sec)
Query OK, 1 row affected (0.00 sec)
Мы убрали из вывода множество дублирующихся строк, например, строки, созданные в базе данных. Теперь, имея пользователя, базу данных и таблицу с хранящимися данными, самое время посмотреть, как обращаться к данным из программы.
Далее приведен файл connect1.с, который подключается от имени пользователя rick с паролем secret
к серверу на локальной машине и базе данных foo
.
#include
#include
#include «mysql.h»
int main(int argc, char *argv[]) {
MYSQL *conn_ptr;
conn_ptr = mysqlinit(NULL);
if (!conn_ptr) {
fprintf(stderr, «mysql_init failedn»);
return EXIT_FAILURE;
}
conn_ptr = mysql_real_connect(conn_ptr, «localhost», «rick», «secret»,
«foo», 0, NULL, 0);
if (conn_ptr) {
printf(«Connection successn»);
} else {
printf («Connection failedn»);
}
mysql_close(conn_ptr);
return EXIT_SUCCESS;
}
Теперь откомпилируйте программу и посмотрите, как вы это сделали. Возможно, придется вставить путь к файлам include
и путь к библиотекам, а также указать, что файл нуждается в компоновке с библиотечным модулем mysqlclient
. В некоторых системах может понадобиться опция -lz
для компоновки с библиотекой упаковки (compression library). В системе авторов требуемая строка компиляции выглядит следующим образом:
$ gcc -I/usr/include/mysql connect1.с -L/usr/lib/mysql -lmysqlclient -о connect1
Вам, возможно, придется проверить, установлены ли пакеты клиентской части и место их установки, зависящее от применяемого вами дистрибутива, и откорректировать, соответственно, приведенную строку компиляции.
Когда вы запустите программу, должно появиться сообщение об успешном подключении:
$ ./connect1
Connection success $
В главе 9 мы покажем, как создать make-файл и автоматизировать процесс подключения.
Как видите, подключиться к базе данных MySQL очень легко.