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

Версия пакета MySQL : 3.20.29
© 2000 Alexey Pautov rldp@ftp.botik.ru
Club of the developers PHP

Оглавление

Введение

  • О чем это?
  • Что такое MySQL?
  • Чем хорош MySQL?
  • Что такое SQL?
  • Интерфейс с языками программирования

Команды пакета MySQL

  • Коротко о главном
  • Основные команды
    • mysql
    • mysqlaccess
    • mysqladmin
    • mysqld
    • mysqldump
    • mysqlshow
    • isamchk
    • isamlog
    • safe_mysqld
  • Дополнительные команды
    • comp_err
    • msql2mysql
    • mysqlbug
    • perror
    • replace
    • which1
    • zap

Реализация языка SQL в СУБД MySQL

  • Коротко о главном
  • ALTER TABLE
  • CREATE TABLE
  • Типы данных
  • Ключи
  • BLOB'ы
  • Двоичные данные в BLOBS
  • CREATE INDEX
  • DELETE
  • DESCRIBE
  • DROP
  • DROP INDEX
  • GRANT
  • SELECT
    • Функции
    • Логические операторы
    • Математические функции
    • Работа со строками
    • Вспомогательные примочки
    • Групповые функции
    • Связи
    • Псевдонимы
    • INSERT INTO
    • LOAD DATA INFILE
    • SET OPTION
    • UPDATE
    • SHOW
    • Строки
    • Числа

Интерфейс для С (C API)

  • Коротко о главном
  • Подготовка
  • Клиентские функции
  • mysql_affected_rows
  • mysql_close
  • mysql_connect
  • mysql_create_db
  • mysql_data_seek
  • mysql_drop_db
  • mysql_eof
  • mysql_error
  • mysql_fetch_field
  • mysql_fetch_lengths
  • mysql_fetch_row
  • mysql_field_seek
  • mysql_free_result
  • mysql_get_client_info
  • mysql_get_host_info
  • mysql_get_proto_info
  • mysql_get_server_info
  • mysql_insert_id
  • mysql_list_dbs
  • mysql_list_fields
  • mysql_list_processes
  • mysql_list_tables
  • mysql_num_fields
  • mysql_num_rows
  • mysql_query
  • mysql_real_query
  • mysql_reload
  • mysql_select_db
  • mysql_shutdown
  • mysql_stat
  • mysql_store_result
  • mysql_use_result

Администрирование пакета

  • Предоставление доступа к базам данных
  • Как работают пароли
  • Запуск mysqld (при загрузке системы)
  • Запуск mysqld (при запущенной системе)
  • Опции, задаваемые при компиляции пакета
  • Выключение альтернативных пользовательских логинов
  • Выключение автоматического присваивания значений по умолчанию
  • Изменение используемой длины ключа
  • Изменение порядка сортировки
  • Добавление функций в MySQL
  • Быстрая загрузка данных
  • Настройка mysqld
  • Полезные замечания
    • Маленькие хитрости по улучшению производительности
    • Оптимизация запросов
    • Какая оптимизация выполняется для условия WHERE?
    • Оптимизация памяти, используемой таблицами
    • Несоответствия типов в INSERT
  • О чем говорит номер версии MySQL
  • Протокол "клиент-сервер"
    • Обозначения
    • Детальное описание
    • Типы пакетов
    • :ok
    • :error
    • :command
    • :query
    • :data
  • Подробно о таблицах
  • Ключи и все о них
  • MySQL: планы на будущее
  • Потоки в Linux

Интерфейс с perl (MySQL perl API)

  • Коротко о главном
  • Основной интерфейс с perl
  • Очень большие числа
  • Connect
  • Смена порта
  • SelectDB
  • ListFields
  • Query
  • ListDBs
  • ListTables
  • FetchCol
  • FetchHash
  • FetchRow
  • DataSeek
  • Обработка двоичных строк
  • Потерянные значения
  • Метаданные
  • Дескриптор базы данных
  • Операторный дескриптор
  • Предупреждение
  • Об авторе интерфейса
  • MySQL DBD/DBI PERL API
    • Коротко о главном
    • Очень большие числа
    • Вставка двоичных строк
    • Об авторе интерфейса
  • Что можно почитать

Библиотека отладчика MySQL
Функции библиотеки отладчика:

  • _db_push_
  • Символы флажка отладки
  • _db_pop_
  • _db_enter_
  • _db_return_
  • _db_pargs_
  • _db_doprnt_
  • _db_dump_
  • ListParse
  • InList
  • PushState
  • DoTrace
  • DoProfile
  • _db_keyword
  • Indent
  • FreeList
  • StrDup
  • DoPrefix
  • OpenFile
  • OpenProfile
  • CloseFile
  • DbugExit
  • DbugMalloc
  • static_strtok
  • BaseName
  • Writable
  • ChangeOwner
  • _db_setjmp_
  • _db_longjmp_
  • DelayArg
  • perror

Портирование кода из mSQL в MySQL

  • Чем отличается реализация протокола клиент/сервер в MySQL от своего аналога в mSQL?
  • Отличия между msql 2.0b7 и MySQL

Утилиты для MySQL

Пример базы данных

Лицензия на использование MySQL

Вперед


Введение - Документация на MySQL

Введение

О чем это?

В этом описании рассматривается СУБД MySQL. Руководство рассчитано на пользователей среднего уровня подготовки. Оно может быть использовано как в качестве справочного руководства по данной СУБД, так и в качестве учебника. В целях его использования в качестве справочника, в самом начале документа предусмотрено полное оглавление.

ЭТО НЕ ПЕРЕВОД ОРИГИНАЛЬНОЙ ДОКУМЕНТАЦИИ! Этот документ написан после прочтения фирменной документации, работы с пакетом и даже попыток его повалить, правда, не слишком удачных. Таким образом, в документе нашлось место и для личного мнения автора по ряду вопросов. Этот абзац мне пришлось включить на основании опыта подготовки подобной документации. Увы, описания, выстраданные кропотливым изучением программ, посчитали примитивным переводом, что говорит о том, что с ними просто не ознакомились должным образом. Я не отрицаю изучения мной оригинальной документации на пакет, но этот документ переводом не является.

С другой стороны, мне понравилась структура оригинальной документации, и я ее по, возможности, придерживался. Однако, структура-это еще не документация.

Данное описание пакета MySQL подготовлено Паутовым Алексеем Валентиновичем в качестве курсовой работы. По вопросам использования данного документа прошу обращаться по e-mail.

Я заранее приношу извинения за ошибки и неточности (если таковые здесь есть), и прошу Вас сообщить мне о них. Я постараюсь их исправить. Я не несу какой-либо ответственности за какие бы то ни было последствия применения данного документа или сведений, изложенных в нем (в частности, упоминания возможных дыр в защите СУБД). Так что, если кто-то, прочитав этот документ возьмет, да и сотрет базу данных записей этак тысяч на сто, то я тут ни при чем!

В заключение хочется попросить Вас, если Вам понравилась эта страничка или пригодилась изложенная здесь информация, послать благодарность автору. Это поможет мне вести статистику того, скольким людям пригодилось хоть что-то из моих трудов.

Ну а теперь к делу...

Что такое MySQL?

MySQL разработал Михаэль Видениус (Michael Widenius, monty@analytikerna.se). MySQL является относительно небольшой и быстрой реляционной СУБД основанной на традициях Hughes Technologies Mini SQL (mSQL).

Последнюю версию MySQL можно скачать с www.tcx.se.

Чем хорош MySQL?

Перечислю основные приятные стороны пакета MySQL.

  • Многопоточность. Поддержка нескольких одновременных запросов.
  • Оптимизация связей с присоединением многих данных за один проход.
  • Записи фиксированной и переменной длины.
  • ODBC драйвер в комплекте с исходником
  • Гибкая система привилегий и паролей.
  • До 16 ключей в таблице. Каждый ключ может иметь до 15 полей.
  • Поддержка ключевых полей и специальных полей в операторе CREATE.
  • Поддержка чисел длинной от 1 до 4 байт (ints, float, double, fixed), строк переменной длины и меток времени.
  • Интерфейс с языками C и perl.
  • Основанная на потоках, быстрая система памяти.
  • Утилита проверки и ремонта таблицы ( isamchk).
  • Все данные хранятся в формате ISO8859_1.
  • Все операции работы со строками не обращают внимания на регистр символов в обрабатываемых строках.
  • Псевдонимы применимы как к таблицам, так и к отдельным колонкам в таблице.
  • Все поля имеют значение по умолчанию. INSERT можно использовать на любом подмножестве полей.
  • Легкость управления таблицей, включая добавление и удаление ключей и полей.

Что такое SQL?

SQL - это сокращение от Structured Query Language (структурированный язык запросов). SQL создан для работы с реляционными базами данных. Он позволяет пользователям взаимодействовать с базами данных (просматривать, искать, добавлять и управлять данными). MySQL соответствует спецификации ANSI 92 SQL. Подробности.

Интерфейс с языками программирования

Наиболее простой способ работы с MySQL сводится к использованию программы MySQL. Это клиентская часть СУБД MySQL. Можно выполнять команды SQL непосредственно из командной строки системы unix или из интерактивного режима MySQL. Подробнее о клиентских программах.

СУБД MySQL имеет библиотеку C API. Ее можно использовать для запросов к базе данных, вставки данных, создания таблиц и т.п. C API поддерживает все функции MySQL. Подробности в главе "Интерфейс для С (C API)".

Язык perl поддерживается сразу двумя способами:

  • Портирован интерфейс с perl из mini-SQL, разработанный Андреасом Коенигом (Andreas Koenig a.koenig@mind.de).
  • Есть модуль perl DBD

Подробнее этот вопрос рассмотрен в главе "Интерфейс с perl (MySQL perl API)".

Также доступен 32-битный ODBC драйвер для MySQL. Он позволяет запрашивать и получать данные из других источников с поддержкой ODBC. С подробностями можно ознакомиться на домашней страничке MySQL (увы, только на английском языке).


Команды пакета MySQL - Документация на MySQL

Команды пакета MySQL

  • Коротко о главном
  • Основные команды
    • mysql
    • mysqlaccess
    • mysqladmin
    • mysqld
    • mysqldump
    • mysqlshow
    • isamchk
    • isamlog
    • safe_mysqld
  • Дополнительные команды
    • comp_err
    • msql2mysql
    • mysqlbug
    • perror
    • replace
    • which1
    • zap

Коротко о главном

СУБД MySQL поставляется приходит со следующими основными программами и скриптами.

  • mysql
  • mysqlaccess
  • mysqladmin
  • mysqld
  • mysqldump
  • mysqlshow
  • isamchk
  • isamlog
  • safe_mysqld

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

  • comp_err
  • msql2mysql
  • mysqlbug
  • perror
  • replace
  • which1
  • zap

Основные команды

MySQL

Клиентская программа MySQL.

Запуск:

mysql [OPTIONS] database

ОПИСАНИЕ:

Клиентская часть СУБД MySQL названа MySQL. Она обеспечивает интерфейс командной строки с СУБД MySQL, и возможность неинтерактивной пакетной обработки.

Программой mysql поддерживаются следующие опции. Вы можете использовать или "короткий" одиночный символ или более подробную версию.
-\?, --help | Справка.
-d, --debug=[options] | Вывести в протокол отладочную информацию. В общем виде 'd:t:o,filename`. Подробности в главе о библиотеке отладки.
-d, --debug-info | Вывести отладочную информацию при выходе из программы.
-e, --exec | Выполнить команду и выйти, неявная форма опции --batch.
-f, --force | Продолжить, даже если мы сталкиваемся с SQL ошибкой.
-h, --hostname=[hostname] | Задает имя сервера, с которым Вы желаете соединиться.
-P, --port=[port] | Порт, для соединения с сервером MySQL.
-p, --password=[password] | Пароль пользователя, для соединения с сервером MySQL. Обратите внимание, что не должно быть пробела между -p и паролем.
-q, --quick | Быстрый (небуферизованный вывод), может замедлить сервер, если вывод приостановлен.
-s, --silent | Работать молча (подавить вывод).
-u, --user=[user] | Имя пользователя для соединения с сервером MySQL. Необязательно, если имя пользователя такое же, как ваш логин. По умолчанию именно ваш логин используется в качестве имени пользователя, что облегчает настройку.
-v, --verbose | Подробный вывод. -v опция может быть удвоена или утроена для более подробного вывода. В программах русских авторов обычно именуется "уровнем болтливости программы".
-w, --wait | Если подключение терпит неудачу, то подождать и повторить попытку.
-B, --batch | Выполнить в пакетном режиме. Никаких запросов и никаких ошибок в STDOUT. Устанавливается автоматически при чтении из/записи в канал (пайп). Результаты будут выведены в формате с разделением табуляцией. Одна строка результата соответствует одной строке вывода.
-I, --help | Справка, эквивалент -\?.
-V, --version В | ывести информацию о версии пакета.

В интерактивном режиме mysql будет печатать результаты в таблице подобно примеру, приведенному ниже. Если не задан пароль или имя пользователя mysql попробует зайти в систему на сервере базы данных с использованием вашего логина и НУЛЕВОГО (ПУСТОГО) пароля. Если ваш mysql логин отличается от вашего логина в unix, или если вы имеете пароль, то это провалится.

ПРИМЕР:

$ mysql mysql
Welcome to the mysql monitor.  Commands ends with ; or \g.
Type 'help' for help.
mysql> select * from host;
1 rows in set (0.25 sec)
  +-----------+----+--------+--------+--------+--------+--------+------+
  | host      | db | select | insert | update | delete | create | drop |
  +-----------+----+--------+--------+--------+--------+--------+------+
  | localhost | %  | Y      | Y      | Y      | Y      | Y      | Y    |
  +-----------+----+--------+--------+--------+--------+--------+------+
mysql>

Переведу этот пример на русский:

$ mysql mysql
Добро пожаловать в монитор mysql. Команды кончаются на ; или \g.
Наберите 'help' для получения справки.
mysql> select * from host;
1 строка в наборе (0.25 секунды)
  +-----------+----+--------+--------+--------+--------+--------+------+
  | host      | db | select | insert | update | delete | create | drop |
  +-----------+----+--------+--------+--------+--------+--------+------+
  | localhost | %  | Y      | Y      | Y      | Y      | Y      | Y    |
  +-----------+----+--------+--------+--------+--------+--------+------+
mysql>

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

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

ПРИМЕР:

Создайте файл /tmp/test, который содержит следующую строку:

select * from host

В командной строке введите:

$ mysql mysql </tmp/test

Вы получите что-то вроде:

host            db      select  insert  update  delete  create  drop
localhost       %       Y       Y       Y       Y       Y       Y

Вы можете писать довольно сложные SQL программы, используя этот метод.

mysqlaccess

Проверка прав доступа пользователя.

СИНТАКСИС:

mysqlaccess [host] [user] [db] OPTIONS

ОПИСАНИЕ:

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

$ 'mysqladmin reload'

после внесения изменений в таблицы базы данных MySQL.

Скрипт mysqlaccess поддерживает следующие параметры (Вы можете использовать "короткий" одиночный символ или более подробную версию):
-?, --help | Справка.
-v, --version | Информация о версии
-u, --user=... | Имя пользователя для доступа к базе данных.
-p, --password=... | Пароль пользователя, для соединения с сервером MySQL. Обратите внимание, что не должно быть пробела между -p и паролем.
-h, --host=... | Имя сервера, используется для проверки прав доступа.
-d, --db=... | Имя базы данных, используется для проверки прав доступа.
-U, --superuser=... | Логин администратора.
-P, --spassword=... | Пароль администратора.
-b, --brief | Вывести краткие сведения о таблице.
--relnotes | Вывести заметки по реализации.
--plan | Вывести идеи для будущих реализаций.
--howto | Вывести примеры использования `mysqlaccess'
--debug=N | Уровень отладки N (0..3)

Вы должны указать по крайней мере имя пользователя и имя базы данных, которые Вы желаете проверить. Если имя сервера не задано, то подразумевается имя 'localhost'.

"Групповые символы" (*,?, %, _) могут применяться при указании сервера, пользователя и db (базы данных). Убедитесь, что они не будут перехвачены вашей командной оболочкой unix.

mysqladmin

Выполняет административные функции.

СИНТАКСИС:

mysqladmin [OPTIONS] command command...

ОПИСАНИЕ:

Программа mysqladmin используется, для управления различными аспектами функционирования СУБД MySQL. Допустимы следующие опции (Вы можете использовать "короткий" одиночный символ или более подробную версию):
-\?, --help | Справка.
-d, --debug=[options] | Вывести в протокол отладочную информацию. В общем виде 'd:t:o,filename`. Подробности в главе о библиотеке отладки.
-f, --force | Не спрашивать подтверждения при пропуске таблицы.
-h, --host=[hostname] | Имя сервера, если не localhost.
-i, --sleep=[seconds] | Выполнить команды несколько раз с паузой в [секунд] между ними.
-p, --password[password] | Пароль пользователя, для соединения с сервером MySQL. Обратите внимание, что не должно быть пробела между -p и паролем.
-u, --user=[user] | Имя пользователя. Если не указано, используется текущий логин.
-P, --port=[port] | Порт, для соединения с сервером MySQL.
-V, --version | Вывести информацию о версии.

Кроме этого программа mysqladmin поддерживает следующие команды:
create [имя базы данных] | Создать базу данных.
drop [имя базы данных] | Удалить базу данных (вместе со всеми таблицами).
processlist | Вывести сведения о работающих потоках MySQL.
reload | Перечитать настройки и очистить все кэши.
shutdown | Завершить работу СУБД MySQL. Все запущенные MySQL-сессии помечаются как 'killed'. Это означает, что все потоки, которые простаивают в настоящее время, будут закрыты немедленно, а управление потоками будет закрыто, когда они достигнут точек завершения, определенных сервером. Клиенты получат сообщение об ошибке 'mysql server has gone away'.
status | Вывести короткое сообщение о статусе сервера.
version | Вывести информацию о версии.

Обратите внимание: mysqladmin понимает сокращения. Например, Вы могли бы написать следующее:

$ mysqladmin v p

Это вывело бы версию mysqld и список всех активных в настоящее время потоков.

Вы можете использовать опцию -i=[секунд] для повтора команды каждые [секунд]. Это наиболее полезно с командой processlist.

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

mysqld

Серверная часть пакета MySQL (mysqld).

СИНТАКСИС:

mysqld [OPTIONS]

ОПИСАНИЕ:

Программа mysqld является ядром СУБД MySQL. Она запускается как демон в системе и принимает подключения из клиентских программ, выполняя запросы и возвращая результаты. Она многопоточная, то есть обработает больше чем один запрос одновременно.

Может наблюдаться спад производительности при использовании опции --log-isam, поскольку при этом очень многое пишется в файл протокола. Непериодические изменения, обновления и удаления могут уменьшить производительность на 5-10%. Производительность может сильно понизиться на обновлениях, требующих большого числа одновременных изменений.

Опция --log-isam может использоваться, для копирования базы данных. Обратите внимание, что ISAM журналы могут стать ОЧЕНЬ большими.

Каждая операция UPDATE, DELETE и INSERT имеет заголовок в 13 байтов дополнительно к команде.

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

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

В большинстве случаев нужно выполнять mysqld из скрипта safe_mysqld .

Программа mysqld поддерживает следующие опции командной строки:

ПРИМЕР: mysqld --socket=/tmp/mysql.sock -V, --version Вывести информацию о версии.

-\?, --help | Справка
-#, --debug=[options] | Вывести в протокол отладочную информацию. В общем виде 'd:t:o,filename`. Подробности в главе о библиотеке отладки.
-b, --basedir=[path] | Полное имя каталога в который установлен пакет.
-h, --datadir [homedir] | Полное имя каталога в котором хранятся базы данных.
-l, --log=[filename] | Имя файла протокола запросов к базам данных и подключений.
--log-isam=[filename] | Имя файла протокола изменений isam.
-O, --set-variable var=option | Установить переменную. См. ниже.
-L, --language=[language] | Значение по умолчанию 'english/'. Может быть так же 'swedish/', 'germany/','french/' или 'czech/'. Текущий список можно посмотреть в подкаталог share/mysql каталога, в который установлен MySQL.
-P, --port=[port] | Порт для соединения.
-T, --debug-info | Вывести отладочную информацию.
--skip-new-routines | Не использовать новые (возможно, глючные) возможности этой версии.
--skip-grant-tables | Игнорировать таблицы предоставления доступа. Это дает любому ПОЛНЫЙ доступ ко всем таблицам.
--skip-locking | Не использовать блокировку системы. Может дать лучшую эффективность, но не должен использоваться вместе с isamchk. ТО ЕСТЬ, сначала остановите сервер.
--skip-name-resolve | Эта опция заставит mysqld принимать адреса IP только тех серверов, которые явно указаны в базе данных привилегий mysql. DNS можно более или менее просто хакнуть, а эта опция позволяет избежать ряда проблем, если прикладная программа требует высокого уровня защиты.
--skip-networking | Использовать подключения только через интерфейс localhost. Эта опция не будет работать с MIT потоками. Если подключения к базе данных будут только локальные, то использование этой опции защитит от создания удаленных подключений.
--skip-unsafe-select | Пропустить возможно опасные оптимизации.
--socket=[socket] | Имя сокет-файла для MySQL. Недоступно при использовании версии MySQL, скомпилированной с MIT потоками.

Если опция -h не определена, mysql будет считать, что основной каталог = "/my/data/sql/mysql".

Все базы данных размещены в каталоге [homedir]/[имя базы данных] .

Опция -l должна использоваться осторожно. Когда используется сервер, с большим объемом транзакций, этот файл может стать большим очень быстро. Если Вы не определяете имя logfile, при использовании опции -l mysqld будет писать протокол в файл [homedir]/[hostname].log.

Опция -O позволяет Вам определять значения для следующих параметров:
Имя | Значение по умолчанию
back_log | 5
keybuffer | 1048568
max_allowed_packet | 65536
net_buffer_length | 8192
max_connections | 90
table_cache | 64
recordbuffer | 131072
sortbuffer | 2097144
max_sort_length | 1024

Информация относительно того, что эти значения делают, и как поднять эффективность mysqld, находится здесь.

mysqldump

Дамп содержания базы данных.

СИНТАКСИС:

mysqldump [OPTIONS] [database [table [field]]]

ОПИСАНИЕ:

Программа mysqldump используется для создания дампа содержания базы данных MySQL. Она пишет инструкции SQL в стандартный вывод. Эти инструкции SQL могут быть переназначены в файл. Можно резервировать базу данных MySQL, используя mysqldump, но при этом Вы должны убедиться, что в этот момент с базой данных не выполняется никаких других действий. А то mysqldump Вам такого нарезервирует...

Программа mysqldump поддерживает следующие параметры (Вы можете использовать короткую или подробную версию):
-#, --debug=[options] | Вывести в протокол отладочную информацию. В общем виде 'd:t:o,filename`. Подробности в главе о библиотеке отладки.
-?, --help | Справка.
-c, --compleat-insert | Генерируйте полные инструкции insert (не исключая значений, которые соответствуют значениям столбца по умолчанию).
-h, --host=[hostname] | Соединиться с сервером hostname.
-d, --no-data | Экспорт только схемы информации (исключая данные).
-t, --no-create-info | Экспорт только данных, исключая информацию для создания таблицы. Противоположность -d.
-p, --password=[password] | Пароль пользователя, для соединения с сервером MySQL. Обратите внимание, что не должно быть пробела между -p и паролем.
-q, --quick | Не буферизовать результаты запроса, дамп выдать непосредственно к STDOUT.
-u, --user=[username] | Имя пользователя. Если не задано, используется текущий логин.
-v, --verbose | Вывести подробную информацию относительно различных стадий выполнения mysqldump.
-P, --port=[port] | Порт для связи.
-V, --version | Информация о версии.

Вы можете направить вывод mysqldump в клиентскую программу MySQL, чтобы копировать базу данных. ПРИМЕЧАНИЕ: Вы должны убедиться, что база данных не изменяется в это время, иначе Вы получите противоречивую копию!

ПРИМЕР:

mysqladmin create foo
mysqldump mysql | mysql foo

mysqlshow

Показать информацию о сервере, базе данных или таблице.

СИНТАКСИС:

mysqlshow [OPTIONS] [database [table [field]]]

ОПИСАНИЕ:

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

Программа mysqlshow поддерживает следующие параметры (Вы можете использовать короткую или подробную версию):
-#, --debug=[options] | Вывести в протокол отладочную информацию. В общем виде 'd:t:o,filename`. Подробности в главе о библиотеке отладки. Как мне надоела эта опция...
-?, --help | Справка.
-h, --host=[hostname] | Связаться с сервером hostname.
-k, --key | Вывести ключ(и) для таблиц(ы).
-p, --password=[password] П | ароль пользователя, для соединения с сервером MySQL. Обратите внимание, что не должно быть пробела между -p и паролем.
-u, --user=[username] | Имя пользователя. Если не задано, используется текущий логин.
-P, --port=[port] | Порт для связи.
-V, --version | Информация о версии.

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

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

ПРИМЕР:

mysqlshow test 'a*'

показать список всех таблиц в базе данных test, начиная с 'a'.

mysqlshow по существу идентичен программе mSQL msqlshow. СУБД MySQL обеспечивает, подобные функциональные возможности посредством команд языка SQL SHOW и DESCRIBE .

isamchk

Проверка, восстановление, управление и сбор статистики по таблицам MySQL.

СИНТАКСИС:

isamchk [-?adeiqrsvwzIV] [-k #] [-O xxxx=size] [-Si] [-Sr #]
        [-O keybuffer=#] [-O readbuffer=#] [-O writebuffer=#]
        [-O sortbuffer=#] [-O sort_key_blocks=#] files

ОПИСАНИЕ:

Программа isamchk используется для проверки непротиворечивости таблиц и устранения любых проблем, которые это может вызвать. Isamchk может также использоваться, чтобы усилить таблицы в базах данных, которые содержат BLOB или поля символов переменной длины. Это необходимо только, если Вы часто добавляете и удаляете записи из этих таблиц.

Необходимо остановить СУБД MySQL перед запуском isamchk с единственным переключателем -r.

Вообще, используйте переключатель -rq для ремонта таблицы, потому что он выполняет "оперативный" ремонт. Для такого ремонта не нужно временного места в памяти, таким образом он проходит быстро, так как isamchk не копирует файл данных.

Перед началом работы, надо перейти в каталог с таблицей, которая нуждается в проверке и/или ремонте. В общем случае, это $DATADIR/DBNAME.

Опции программы isamchk:
-# | Вывести в протокол отладочную информацию. В общем виде 'd:t:o,filename`. Подробности в главе о библиотеке отладки.
-? | Справка.
-a | Анализ. Используется для для оптимизации размещения таблиц.
-d | Информация о таблице.
-e | Расширенная проверка. При запуске с этой опцией надо остановить демон mysqld.
-f | Принудительно создать временный файл. Эта опция вызовет 'isamchk -r', если таблица разрушена.
-k# | Используемые ключи.
-i | Дополнительная информация.
-q | Быстрая проверка.
-r[o] | Восстановление, Эта опция также уплотнит внутренние индексы B-Tree, используемые MySQL. Используйте эту опцию, чтобы уменьшить место, занимаемое таблицей, за счет удаления неиспользуемых индексов.
-s | Работать молча.
-u | Распаковать упакованный файл.
-v | Подробный вывод. Используется вместе с другими параметрами, чтобы получить большее количество информации. Можно задать большее количество символов v для повышения объема выдаваемой информации (например, vv).
-w | Ждать, если таблица заблокирована.
-I | Справка.
-S[ir]# | Сортировать индекс/записи по ключу #. Эта опция оптимизирует размещение данных в таблице.
-V | Информация о версии.
-O | var=# Опция оптимизации var=#[k][m]

Можно использовать вторую опцию '-q', чтобы использовать старый файл данных. -ro использует старый метод восстановления: медленнее, но надежнее -r. -r может исправить почти все ошибки, кроме уникальных ключей, которые оказались все же не уникальными. УБЕДИТЕСЬ, ЧТО ДЕМОН MYSQLD НЕ ЗАПУЩЕН, ЕСЛИ ИСПОЛЬЗУЕТЕ ЭТУ ОПЦИЮ! Если -f задан при проверке таблицы, то таблицы с ошибками будут автоматически исправлены.

Имеется несколько примеров. См. Подробно о таблицах.

ПРИМЕРЫ:
isamchk -r [table_name] | Убрать все дырки, которые сформировались из-за использования BLOBS или VARCHARS. Также установить какие еще есть проблемы.
isamchk -ei [table_name] | Проверить таблицу и отобразить статистику.
isamchk [table_name] | Найти большинство ошибок.
isamchk -rq [table_name] | Обновить только индексный файл. Быстро, но не исправляет ошибки в файле данных.
isamchk -d -v [table_name] | Описание таблицы.
isamchk -rq -Si [table_name] | Полная оптимизация таблицы [table_name]. Надолго...

isamlog

Получение статистики, и использование isam-журналов.

СИНТАКСИС:

isamlog [-?iruvIV] [-c #] [-f #] [-p #] [-F filepath/] [-o #]
        [-R file recordpos] [-w write_file] [log-filename]

ОПИСАНИЕ:

Эта программа используется вместе с опцией --log-isam=file_name демона mysqld.

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

Чтобы восстановить базу данных, нужна копия, которая содержит вашу базу данных до того, как mysqld сгенерировал ISAM журнал, или полный набор ISAM журналов с начала работы вашей базы данных.
-? or -I | Справка.
-V | Информация о версии.
-c # | Выполнить только # команд.
-f # | Максимальное число открытых файлов. Если откроется больше чем # файлов, то лишние будут автоматически закрыты и вновь открыты по мере необходимости.
-F [path] | Файл протокола ISAM содержит полный путь к таблицам. Вы можете использовать эту опцию, чтобы отменить сохраненный путь. ПРИМЕР: -F '/var/mirror/' заставит isamlog работать с файлами в /var/mirror, а не с теми, которые указаны в сохраненном пути.
-i | Вывести более детальную информацию.
-o # | Начать со смещения #.
-p # | Удалить # компонент из пути.
-r | Игнорировать все ошибки, с которыми сталкиваемся в течение модификаций.
-R | Указать позицию в файле ISAM, о которой надо выдать сведения. ПРИМЕР: isamlog -R /usr/local/data/mysql/user.ISM 1234 Выведет все изменения в таблице /usr/local/data/mysql/user, которые найдены в позиции 123 4. Это полезно для ситуаций, в которых Вы имеете разрушенную запись в известной позиции. Вы, возможно, получили эту информацию посредством isamlog -vvv или из isamchk. Если Вы укажете позицию -1, будут обработаны все записи.
-u | Пытаться модифицировать все таблицы. Остановиться, если встречена ошибка.
-v | Подробный вывод. Можно задать большее количество символов v для повышения объема выдаваемой информации (например, vv).
-w | [filename] Записать все записи вставленные или измененные опцией -R в [filename]. Эта опция может использоваться, чтобы получить двоичный файл всех вставок и модификаций конкретной таблицы для использования в отладке.

safe_mysqld

Скрипт для запуска демона mysqld.

СИНТАКСИС:

safe_mysqld [options to mysqld]

ОПИСАНИЕ:

Этот скрипт обычно выполняется при начальной загрузке, чтобы запустить mysqld. Если Вы не хотите, чтобы ваш DATADIR был помещен в иерархии каталога MySQL, что и mysqld, Вы должны подправить DATADIR в этом скрипте.

Дополнительные команды

comp_err

Генерирует файлы сообщений об ошибках на национальном языке.

СИНТАКСИС:

comp_err [-?] [-I] [-V] fromfile[s] tofile

ОПИСАНИЕ:

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

ПРИМЕР:

comp_err share/english/errmsg.txt share/english/errmsg.sys

msql2mysql

Выполняет начальное преобразование mSQL скрипта в MySQL.

СИНТАКСИС:

msql2mysql [filename]

ОПИСАНИЕ:

Скрипт msql2mysql используется как первый шаг при портировании msql скриптов в MySQL. Просто введите:

msql2mysql something.c >something.mysql.c'

Вам придется, конечно, многое исправить, но это хорошее начало. Подробнее о портировании mSQL-кода в MySQL рассказано здесь.

Программа msql2mysql - фактически довольно простой скрипт, который использует команду replace, которая поставляется с СУБД MySQL, чтобы заменить mSQL обращения к функции на их MySQL эквиваленты. Меняются только имена, дополнительные параметры не добавляются.

mysqlbug

Генерирует отчет об ошибках.

СИНТАКСИС:

mysqlbug [address]

ОПИСАНИЕ:

Пожалуйста используйте этот скрипт при сообщении об ошибках в MySQL. Он генерирует форму для Вас, которую для заполнения помещает в любой текстовый редактор, указанный в переменной $VISUAL (Vi по умолчанию). Форма будет содержать автоматически сгенерированную информацию относительно вашей системы, включая версии OS и MySQL и архитектуру. Когда Вы закончите, форма будет отправлена по почте в список рассылки MySQL. Вы можете факультативно определять альтернативный адрес на который следует послать сообщение об ошибке, определяя [адрес].

perror

Выводит короткое текстовое объяснение числового кода ошибки.

СИНТАКСИС:

$ perror [-?vIV] [errorcodes]

ОПИСАНИЕ:

Программа perror предоставляет короткие текстовые объяснения числовых кодов ошибок, возвращаемых системой или СУБД MySQL.

Программа perror поддерживает опции:
-? or -I | Справка.
-v | Подробная информация.
-V | Информация о версии.

replace

СИНТАКСИС:

replace [-?svIV] from to from to ... -- [files]

ОПИСАНИЕ:

Программа program используется скриптом msql2mysql. Replace может быть использована для замены строки на месте в файле или получать строку через канал (пайп), производить замену и выводить результат в STDOUT.

Допустимы следующие опции:
-? | Справка.
-s | Работать молча (никаких статусных сообщений).
-v | Подробная информация о ходе работы (выводить дополнительные сообщения).

ПРИМЕРЫ:

replace Apple Orange somefile

Заменит все вхождения Apple на Orange в файле somefile.

cat INFILE | replace Apple Orange Blimp Train > OUTFILE

Все вхождения Apple в файле INFILE будут заменены на Orange и результат выведен в файл OUTFILE. В то же время, все вхождения Blimp в файле INFILE будут заменены на Train и тоже выведены в файл OUTFILE. Таким образом, можно заменять более чем одно выражение за один проход.

Вы можете использовать специальные символы во входных строках:
\^ | Соответствует началу строки.
\$ | Соответствует концу строки.
\b | Соответствует пробелу. Может появляться или отдельно, или в начале, или в конце лексемы. Если \b используется в конце лексемы, следующие замены начнутся после пробела. \b соответствует только пробелу.

Replace простая и очень полезная утилита с большими потенциальными возможностями использования в MySQL.

which1

Найти команду.

СИНТАКСИС:

which1 [cmd]

ОПИСАНИЕ:

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

zap

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

СИНТАКСИС:

zap [-signal] [-?Ift] pattern

ОПИСАНИЕ:

По умолчанию zap запросит подтверждение для каждого подходящего процесса.

ПРИМЕР:

prompt> zap -t "my"
UID   PID   PPID  C     STIME  TTY    TIME CMD
root  1217     1  1  15:21:30  pts/4  0:00 /bin/sh /usr/local/pkg/mysql-3.20.15/bin/safe_mysqld
root  1224  1217  3  15:21:32  pts/4  0:01 /usr/local/pkg/mysql-3.20.15/libexec/mysqld
                                           -b /usr/local/pkg/mysql-3.20.15 -h

Программа zap поддерживает опции:
-I or -? | Справка.
-f | Послать сигнал без запроса подтверждения.
-t | Вывести список процессов, соответствующих образцу, но не сигнал им не посылать.

В качестве сигнала допускается любой сигнал системы unix. По умолчанию сигнал = 9 (завершить процесс).


Реализация языка SQL в СУБД MySQL - Документация на MySQL

Реализация языка SQL в СУБД MySQL

Студент нанимается на лето подработать в
университете, его спрашивают:
- Языком владеешь?
- Я в совершенстве владею языком!
- Отлично, будешь наклеивать марки на конверты.

  • Коротко о главном
  • ALTER TABLE
  • CREATE TABLE
  • Типы данных
  • Ключи
  • BLOB'ы
  • Двоичные данные в BLOBS
  • CREATE INDEX
  • DELETE
  • DESCRIBE
  • DROP
  • DROP INDEX
  • GRANT
  • SELECT
    • Функции
    • Логические операторы
    • Математические функции
    • Работа со строками
    • Вспомогательные примочки
    • Групповые функции
    • Связи
    • Псевдонимы
    • INSERT INTO
    • LOAD DATA INFILE
    • SET OPTION
    • UPDATE
    • SHOW
    • Строки
    • Числа

Обзор

СУБД MySQL предоставляет в Ваше распоряжение подмножество языка SQL, соответствующее спецификации ANSI SQL 92.

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

Ядро, на котором сформирован MySQL - набор подпрограмм, которые использовались в высокотребовательном окружении много лет. В то время, как MySQL все еще находится в разработке, это уже предоставляет богатый и полезный функциональный набор.

ALTER TABLE

СИНТАКСИС:

ALTER [IGNORE] TABLE table_name alter_specification [, alter_specification ...]

  alter_specification:
    ADD [COLUMN] create_definition or
    CHANGE [COLUMN] old_column_name create_definition or
    ALTER [COLUMN] column_name { SET default | DROP DEFAULT } or
    DROP [COLUMN] column_name or DROP PRIMARY KEY or DROP INDEX key_name
    DROP FOREIGN KEY key_name

ОПИСАНИЕ:

Команда ALTER TABLE может быть использована для изменения определения таблицы. ALTER TABLE работает с временно созданной таблицей в которую копирует все данные из текущей таблицы. Когда копия готова, старая таблица удаляется, а новая переименуется в нее. Это выполнено таким способом, что все изменения автоматически переназначаются на новую таблицу.

Пока работает ALTER TABLE, старая таблица доступна для других клиентов. Обновления и запись в таблицу останавливаются и будут выполнены только после того, как новая таблица будет готова. Если IGNORE не определен, то копирование будет прервано и процесс отработан назад в случае наличия любых уникальных ключей, дублированных в новой таблице.

  • CHANGE column_name, DROP column_name и DROP INDEX являются MySQL расширениями ANSI SQL.
  • [COLUMN] факультативный параметр и может быть опущен.
  • Конструкция ALTER [COLUMN] может быть использована для изменения или удаления старого значения по умолчанию.
  • ADD и CHANGE используют один и тот же create_definition, что и CREATE TABLE. См. CREATE TABLE.
  • Если вы удаляете column_name, которое является частью составного ключа, то часть ключа будет удалена. Если все части ключа удалены, то будет удален весь ключ.
  • DROP PRIMARY KEY удаляет первый уникальный ключ в таблице.
  • CHANGE делает лучшее преобразование существующей информации в новый формат.
  • Синтаксис DROP FOREIGN KEY пока существует для запланированных функциональных возможностей. В настоящее время не делает ничего.

Вы можете использовать функцию C API mysql_info(&MYSQL_RESULT) чтобы узнать, сколько записей скопировано и сколько удалено из-за дублированных ключей.

Для использования команды ALTER TABLE вы должны иметь права доступа select, insert, delete, update, create и drop для этой таблицы.

CREATE TABLE

СИНТАКСИС:

CREATE TABLE table_name (create_definition, ...)

Здесь create_definition имеет следующий формат:

  create_definition:
    column_name type NOT NULL [DEFAULT default_value] [ PRIMARY KEY ] or
    column_name type [NULL] [ PRIMARY KEY ] or
    PRIMARY (KEY|INDEX) [key_name] ( column_name,... ) or
    (KEY|INDEX) [key_name] ( column_name[length],...) or
    INDEX [key_name] ( column_name[length],...) or
    UNIQUE (column_name[length],...) or
    FOREIGN (KEY|INDEX) [key_name] (column_name[length],...)
            REFERENCES table_name
  [ON DELETE (RESTRICT | CASCADE | SET NULL) ]

ОПИСАНИЕ:

В MySQL все поля имеют неявное значение по умолчанию, если объявлены, как не пустые (NOT NULL). Если вы не даете значения по умолчанию при использовании не пустого поля, оно будет назначено, исходя из типа поля.

Блок FOREIGN нужен только для совместимости. Ключевое слово REFERENCE тоже не выполняет в данной версии никаких действий.

Команда MySQL CREATE TABLE не поддерживает ключевое слово SQL CHECK.

Для создания таблицы Вы должны иметь права доступа create.

Замечания:

  • Номер столбца может иметь дополнительное ключевое слово AUTO_INCREMENT, чтобы автоматически получить номер = самый большой номер столбца + 1 для каждой вставки, в которой номер столбца = 0 или NULL. ТО ЕСТЬ, если Вы попробуете вставить значение ноля в числовой столбец, который имеет атрибут AUTO_INCREMENT, Вы получите номер столбца, который на 1 большим, чем самый большой предварительно использованный номер.

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

ВНИМАНИЕ:

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

  • ZEROFILL означает, что значение дополняется слева нулями до максимальной длины поля.

ПРИМЕР:

INT(5) ZEROFILL; значение 5 превращается в "00005"

  • Столбцы ключа и столбцы TIMESTAMP не могут быть пустыми. Для столбцов ключа атрибут NULL тихо удаляется.
  • Вы можете вставить NULL для полей типа TIMESTAMP и числовых полей с атрибутом AUTO_INCREMENT.
  • BLOB столбцы не мог быть ключами. Вы не можете группировать на BLOB. Однако, можно использовать строковые функции MySQL, чтобы группировать на подразделах BLOB.
  • Теперь можно использовать BLOB столбцы в предложении WHERE.
  • Удаленные записи находятся в связанном списке, и последующие вставки будут повторно использовать старые позиции.
  • Каждый столбец, который может принять значение NULL, берет 1 бит дополнительного пространства.
  • Если нет никаких VARCHAR столбцов, и BLOBs, то MySQL использует фиксированный формат записей. Вы можете ожидать существенно лучшую эффективность, в этом случае. Также не нужно оптимизировать ваши таблицы с помощью isamchk, когда используется фиксированный формат записи.
  • Если Вы используете записи переменной длины и делаете много модификаций, Вы должны выполнять время от времени 'isamchk -r table_name' на таблице, чтобы получить лучшее размещение. Попробуйте команду 'isamchk -ei table_name' для сбора статистики.
  • Максимальная длина записи может быть найдена так:
  • 1 + сумма длин столбцов + null_columns/8 + число столбцов переменной длины.
  • В некоторых случаях атрибуты могут тихо меняться после создания: VARCHAR столбцы с длиной 1 или 2 изменяется на CHAR. При использовании одних VARCHAR столбцов все CHAR столбцы более длинные, чем 2 изменяется на VARCHARS.
  • При INSERT/UPDATE все строки (CHAR и VARCHAR) приводятся к максимальной длине, заданной, CREATE. Все хвостовые пробелы автоматически удаляются.
  • Например, VARCHAR(10) задает, что столбец может содержать строки с длиной до 10 символов.
  • Что угодно/0 дает значение NULL.
  • REGEXP использует кодировку ISOLATIN1 при использовании функций символьного типа, подобно [[:ALPHA:]].

Типы данных

Поля должны иметь один из следующих типов данных:
BIGINT [(length)]
[UNSIGNED]
[ZEROFILL] 		8 байт целое (если компилятор поддерживает такой тип)
BLOB | Двоичный объект (максимальная длина 65535 байт)
CHAR(NUM) С | трока фиксированной длины (1 <= NUM <= 255)
DATE Сохраняет информацию о дате. Использует формат "YYYY-MM-DD". Может модифицироваться как строка или число, хотя Вы, вероятно, используете контекст строки для времени и даты.

MySQL тип DATEпонимает по крайней мере следующие синтаксис.

  • YYYY-MM-DD (Обратите внимание что '- ' может фактически быть ЛЮБОЙ не цифрой)
  • YY-MM-DD (Обратите внимание что '- ' может фактически быть ЛЮБОЙ не цифрой)
  • YYMMDD
  • YYMM

Диапазон для этого типа данных от 0000-00-00 до 9999-12-31. Так что "проблема 2000" здесь не стоит. В отличие от TIMESTAMP, DATE принимает годы и в виде двух цифр от 0000 до 0099. Это не очень полезно в большинстве случаев. Используйте задание лет четырьмя цифрами в полях типа DATE. Тип DATE имеет длину 4 байта.

DATETIME Объединение типов DATE и TIME. Тип DATETIME идентичен типу TIMESTAMP со следующими исключениями:
  • Когда запись вставляется в таблицу, содержащую поля типа DATETIME, поле DATETIME не изменяется.
  • Диапазон для поля типа DATETIME: '0000-01-01 00:00:00' - '9999-12-31 23:59:59' при использовании в контексте строки, и '00000000000000' - '99991231235959' при использовании в контексте числа.

Тип DATETIME имеет длину 8 байт.

DECIMAL (length,dec) | Десятичное число с плавающей запятой.
DOUBLE [(length,dec)] | Число (4 или 8 байт) двойной точности с максимальной длиной и фиксированном числом десятичных чисел.
FLOAT [(precision)] | Номер с плавающей запятой. FLOAT(4) и FLOAT одиночная точность. FLOAT(8) обеспечивает двойную точность.
FLOAT [(length,decimals)] | Число одиночной точности с максимальной длиной и фиксированном числом десятичных чисел (4 байта).
INT [(length)]
[UNSIGNED]
[ZEROFILL] 		Целое (4 байта).
INTEGER [(length)]
[UNSIGNED]
[ZEROFILL] 		Целое число 4 байта
LONGBLOB | Двоичный объект с максимальной длиной 2**32 байт.
MEDIUMBLOB | Двоичный объект с максимальной длиной 16777216 байт.
MEDIUMINT [(length)]
[UNSIGNED]
[ZEROFILL] 		Целое (3 байта).
REAL [(length,dec)] | Идентично DOUBLE (8 байт).
SMALLINT [(length)]
[UNSIGNED]
[ZEROFILL] 		Целое (2 байта).
TINYBLOB | Двоичный объект с максимальной длиной 255 байт.
TINYINT[(length)]
[UNSIGNED]
[ZEROFILL] 		Целое число (1 байт).
VARCHAR(NUM) | Строка переменной длины (1 <= NUM <= 255)
TIME Хранит информацию о времени. Использует формат "HH:MM:SS". Может использоваться как строка или число. MySQL тип TIME понимает следующий синтаксис.
  • HH:MM:DD
  • HHMMDD
  • HHMM
  • HH

Данные типа TIME имеют длину 3 байта.

TIMESTAMP(NUM) Автоматически изменяется при вставке/обновлении. Имеет формат YYMMDDHHMMSS или YYYYMMDDHHMMSS. Вы можете модифицировать поле TIMESTAMP при выполнении INSERT. Это полезно, когда Вы хотите установить произвольную дату/время для записи. В течение модификаций Вы не должны определять значение для вашего поля TIMESTAMP, или определять NULL как значение, для вставки. Иначе вы получите недопустимое значение для этого поля.

Когда используете mysql с ODBC и Access Вы должны использовать значение 14 для NUM, поскольку это заставляет MySQL всегда использовать в годах четыре цифры. Значение 12 заставит MySQL использовать в году две цифры. Значение по умолчанию - 14.

Обратите внимание, что в случае таблиц с несколькими полями TIMESTAMP только первое такое поле будет модифицироваться автоматически.

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

Ключи

MySQL таблица может иметь до 16 ключей, каждый из которых может иметь до 15 полей. Максимальная поддерживаемая длина ключа 120 байт. Вы можете увеличить длину ключа, изменяя N_MAX_KEY_LENGTH в файле nisam.h и перекомпилировав пакет. Обратите внимание, что длинные ключи могут привести к низкой эффективности.

Ключи могут иметь имена. В случае первичного ключа имя будет всегда PRIMARY. Если имя ключа не задано в процессе создания таблицы, то заданное по умолчанию имя ключа - первое имя столбца с факультативным суффиксом (_2, _3, и т. д.) чтобы сделать это имя уникальным. Имя ключа может использоваться с командой ALTER TABLE, чтобы удалить ключ.

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

CREATE TABLE SomeTable (composite CHAR(200), INDEX comp_idx(composite(40)));

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

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

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

Поскольку MySQL использует B-Tree не нужно объявлять ключи, которые являются префиксами других ключей. Оптимизатор найдет любой пригодный для использования префикс ключа и использует его, чтобы выполнить поиск. Например, если Вы объявляете следующий ключ:

INDEX (first, second, third, fourth)

Вы также неявно создали следующие ключи:

(first, second, third)
(first, second)
(first)

Объявление ненужных ключей только займет дополнительное место и замедлит ваши запросы. Ключи должны быть созданы во время создания таблицы или изменения таблицы с использованием команды ALTER TABLE.

BLOB'ы

BLOB - "Binary Large OBject" - двоичный большой объект.

Как отмечено выше, MySQL поддерживает четыре типа BLOB:

tinyblob        (0-255 байт)
blob            (0-65535 байт)
mediumblob      (0-16777216 байт)
longblob        (0-2147483648 байт)

Обратите внимание, что могут иметься некоторые ограничения из-за размера буфера сообщения. Буфер сообщений выделяется динамически. Вы должны знать, что 'max_allowed_packet' устанавливается на сервере и клиенте. По умолчанию, это - 64КБ для сервера и 512КБ для клиента.

Вы можете сменить размер буфера, запустив mysqld с опцией -O. Но помните, что это количество памяти будет выделяться каждому потоку!

ПРИМЕР:

mysqld -O max_allowed_packet=max_blob_length

MySQL WIN95 ODBC драйвер определяет BLOB как LONGVARCHAR.

Двоичные данные в BLOBS

Если Вы вставляете двоичные данные в BLOB, Вы не должны применять следующие символов:

  • \0
  • \\
  • ' или "

CREATE INDEX

СИНТАКСИС:

CREATE [UNIQUE] INDEX index_name ON table_name (column_name,... )

ОПИСАНИЕ:

В MySQL эта команда проверит был ли данный индекс создан, когда создавалась таблица. Она не создает индекс. Это предусмотрено по причинам совместимости. Если Вы хотите добавить, ключ используйте команду ALTER TABLE.

DELETE

СИНТАКСИС:

DELETE FROM table_name WHERE where_definition

Здесь where_definition имеет формат:

where_definition:
  where_expr or where_expr [AND | OR] where_expr

where_expr имеет формат:

where_expr:
  column_name [> | >= | = | <> | <= | < ]
  column_name_or_constant or
  column_name LIKE column_name_or_constant or
  column_name IS NULL or column_name IS NOT NULL or (where_definition)

ОПИСАНИЕ:

Удаляет записи из таблицы.

  • Возвращает количество обработанных записей.
  • Если вызван DELETE без WHERE, то таблица будет очищена. В этом случае DELETE вернет 0 для числа обработанных записей.

Замечания:

  • Все строки сравниваются без учета регистра (ISO_8859_1). Если Вы должны сделать чувствительный к регистру поиск, то используйте REGEXP в предложении HAVING.
  • LIKE применим на числовых столбцах.
  • Сравнение с явным NULL (столбец == NULL) эквивалентно условию IS NULL, то есть использованию (столбец IS NULL). Это было сделано, для совместимости с mSQL.

Вы должны иметь права доступа delete для удаления записей.

DESCRIBE

СИНТАКСИС:

(DESCRIBE | DESC) table [column]

ОПИСАНИЕ:

Описывает таблицу или столбец. Эта команда подобна команде SHOW. Факультативный параметр [column] может быть именем столбца или строкой. Если [column] - строка, он может содержать символы подстановки.

DROP

СИНТАКСИС:

DROP TABLE table_name [table_name ...]

ОПИСАНИЕ:

Удаляет (в оригинальной документации почему-то сказано, что роняет) одну или несколько таблиц.

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

ОСТЕРЕГАЙТЕСЬ! DROP TABLE полностью удалит именованную таблицу(ы) из вашей системы. Не предусмотрено никакого UNDO или UNERASE (если Вы не имеете резервной копии, конечно).

Вы должны иметь права доступа delete, чтобы использовать DROP.

ROP INDEX

СИНТАКСИС:

DROP INDEX index_name

ОПИСАНИЕ:

Эта команда ничего не делает. Чтобы удалить индекс, Вы должны использовать команду ALTER TABLE.

DROP INDEX предусмотрен по причине совместимости. Это вводит в заблуждение некоторые клиенты, которые думают, что получили то, что они просили. Прежде всего это касается тупых ODBC драйверов.

GRANT

СИНТАКСИС:

  GRANT (ALL PRIVILEGES | (SELECT, INSERT, UPDATE, DELETE, REFERENCES
        (column list), USAGE)) ON table TO user,... [WITH GRANT OPTION]

ОПИСАНИЕ:

Команда GRANT ничего не делает. Она всегда возвращает истину и нужна прежде всего, чтобы ввести в заблуждение некоторые прикладные программы, которые используют ODBC и думают, что команда GRANT, которую они выдали, что-то сделала. Вообще, ODBC такая библиотека, что для совместимости с ней предусмотрена не одна функция... См. главу Администрирование пакета для получения подробностей по поводу прав доступа в MySQL.

SELECT

СИНТАКСИС:

  SELECT [STRAIGHT_JOIN] [DISTINCT | ALL] select_expression,...
         [FROM tables... [WHERE where_definition] [GROUP BY column,...]
         [ORDER BY column [ASC | DESC], ...] HAVING full_where_definition
         [LIMIT [offset,] rows] [PROCEDURE procedure_name]]
         [INTO OUTFILE 'file_name'... ]

Здесь where_definition:

  where_definition:
    where_expr or where_expr [AND | OR] where_expr

where_expr имеет формат:

  where_expr:
    column_name [> | >= | = | <> | <= | <]
    column_name_or_constant or column_name LIKE column_name_or_constant or
    column_name IS NULL or column_name IS NOT NULL or (where_definition)

ОПИСАНИЕ:

Оператор SELECT является краеугольным камнем всего языка SQL. Он используется, чтобы выполнить запросы к базе данных. Это действительно основа языка SQL. Для хорошего общего учебника о том, как работает SELECT, посмотрите http://w3.one.net/~jhoffman/sqltut.htm#Basics of the SELECT Statement.

В MySQL версии меньше 3.21.x предложение WHERE очень ограничено. HAVING будет работать там, где предложение WHERE ничего не делает. Некоторые примеры, которые не работают в предложении WHERE - REGEXP и операторе !. В основном, Вы не можете использовать функции с WHERE, но Вы можете использовать функции с HAVING.

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

Вы должны иметь права select для использования SELECT.

Функции

select_expression может содержать следующие функции и операторы:
+ - * / | Арифметические действия.
% | Остаток от деления (как в C)
| & | Битовые функции (используется 48 бит).
- С | мена знака числа.
( ) | Скобки.
BETWEEN(A,B,C) | (A >= B) AND (A <= C).
BIT_COUNT() | Количество бит.
ELT(N,a,b,c,d) | Возвращает a, если N == 1, b, если N == 2 и т. д. a,b,c,d строки. ПРИМЕР: ELT(3,"First","Second","Third","Fourth") вернет "Third".
FIELD(Z,a,b,c) | Возвращает a, если Z == a, b, если Z == b и т. д. a,b,c,d строки. ПРИМЕР: FIELD("Second","First","Second","Third","Fourth") вернет "Second".
IF(A,B,C) | Если A истина (!= 0 and != NULL), то вернет B, иначе вернет C.
IFNULL(A,B) | Если A не null, вернет A, иначе вернет B.
ISNULL(A) | Вернет 1, если A == NULL, иначе вернет 0. Эквивалент ('A == NULL').
NOT ! | NOT, вернет TRUE (1) или FALSE (0).
OR, AND | Вернет TRUE (1) или FALSE (0).
SIGN() | Вернет -1, 0 или 1 (знак аргумента).
SUM() | Сумма столбца.
= <> <= < >= > | Вернет TRUE (1) или FALSE (0).
expr LIKE expr | Вернет TRUE (1) или FALSE (0).
expr NOT LIKE expr | Вернет TRUE (1) или FALSE (0).
expr REGEXP expr | Проверяет строку на соответствие регулярному выражению expr.
expr NOT REGEXP expr | Проверяет строку на соответствие регулярному выражению expr.

select_expression может также содержать один или большее количество следующих математических функций.
ABS() | Абсолютное значение (модуль числа).
CEILING() | ()
EXP() | Экспонента.
FORMAT(nr,NUM) | Форматирует число в формат '#,###,###.##' с NUM десятичных цифр.
LOG() | Логарифм.
LOG10() | Логарифм по основанию 10.
MIN(),MAX() | Минимум или максимум соответственно. Должна иметь при вызове два или более аргументов, иначе рассматривается как групповая функция.
MOD() | Остаток от деления (аналог %).
POW() | Степень.
ROUND() | Округление до ближайшего целого числа.
RAND([integer_expr]) | Случайное число типа float, 0 <= x <= 1.0, используется integer_expr как значение для запуска генератора.
SQRT() | Квадратный корень.

select_expression может также содержать одну или больше следующих строковых функций.
CONCAT() | Объединение строк.
INTERVAL(A,a,b,c,d) | Возвращает 1, если A == a, 2, если A == b... Если совпадений нет, вернет 0. A,a,b,c,d... строки.
INSERT(org,strt,len,new) | Заменяет подстроку org[strt...len(gth)] на new. Первая позиция строки=1.
LCASE(A) | Приводит A к нижнему регистру.
LEFT() | Возвращает строку символов, отсчитывая слева.
LENGTH() | Длина строки.
LOCATE(A,B) | Позиция подстроки B в строке A.
LOCATE(A,B,C) | Позиция подстроки B в строке A, начиная с позиции C.
LTRIM(str) | Удаляет все начальные пробелы из строки str.
REPLACE(A,B,C) | Заменяет все подстроки B в строке A на подстроку C.
RIGHT() | Get string counting from right.
RTRIM(str) | Удаляет хвостовые пробелы из строки str.
STRCMP() | Возвращает 0, если строки одинаковые.
SUBSTRING(A,B,C) | Возвращает подстроку из A, с позиции B до позиции C.
UCASE(A) | Переводит A в верхний регистр.

И наконец несколько просто полезных функций, которые тоже можно применить в select_expression.
CURDATE() | Текущая дата.
DATABASE() | Имя текущей базы данных из которой выполняется выбор.
FROM_DAYS() | Меняет день на DATE.
NOW() | Текущее время в форматах YYYYMMDDHHMMSS или "YYYY-MM-DD HH:MM:SS". Формат зависит от того в каком контексте используется NOW(): числовом или строковом.
PASSWORD() | Шифрует строку.
PERIOD_ADD(P:N) | Добавить N месяцев к периоду P (в формате YYMM).
PERIOD_DIFF(A,B) | Возвращает месяцы между A и B. Обратите внимание, что PERIOD_DIFF работает только с датами в форме YYMM или YYYMM.
TO_DAYS() | Меняет DATE (YYMMDD) на номер дня.
UNIX_TIMESTAMP([date]) | Возвращает метку времени unix, если вызвана без date (секунды, начиная с GMT 1970.01.01 00:00:00). При вызове со столбцом TIMESTAMP вернет TIMESTAMP. date может быть также строкой DATE, DATETIME или числом в формате YYMMDD (или YYYMMDD).
USER() | Возвращает логин текущего пользователя.
WEEKDAY() | Возвращает день недели (0 = понедельник, 1 = вторник, ...).

Групповые функции в операторе select:

Следующие функции могут быть использованы в предложении GROUP:
AVG() | Среднее для группы GROUP.
SUM() | Сумма элементов GROUP.
COUNT() | Число элементов в GROUP.
MIN() | Минимальный элемент в GROUP.
MAX() | Максимальный элемент в GROUP.

Здесь MIN() и MAX() могут принимать строку или число в качестве аргумента. Эти функции не могут использоваться в выражении, хотя их параметр может быть выражением:

ПРИМЕР: "SUM(value/10)" нормально, но вот "SUM(value)/10" уже нет!

  • Строки автоматически конвертируются в числа и наоборот по мере необходимости (прямо как в perl). При использовании операторов = <> <= >= < > как в инструкции WHERE, левая сторона определяет, выполняется ли тест с числами или со строками. Все сравнения строк независимы от регистра (ISO8859-1).

    ПРИМЕР:

      "a" < "b"   ; Сравнение строк
  "a" < 0     ; Сравнение строк
   0  < "a"   ; Сравнение чисел
   a < 5      ; Если поле имеет тип CHAR, то сравниваются строки,
                 ; иначе сравниваются числа.

    Если надо учитывать регистр, используйте REGEXP в HAVING.

  • Имя столбца не должно иметь префикса таблицы, если данное имя столбца уникально.
  • В LIKE выражения % и _ могут предваряться символом \ для получения символьного выражения.
  • DATE является строкой с одним из синтаксисов:
    • YYMMDD (Год считается 2000, если YY < 70)
    • YYYYMMDD
    • YY.MM.DD Здесь '.' может быть любым нецифровым разделителем
    • YYYY.MM.DD Здесь '.' может быть любым нецифровым разделителем
  • IFNULL() и IF() возвращает число или строку в зависимости от ситуации, в которой использованы.
  • Order и group столбец может быть именем столбца, его псевдонимом или номером в операторе SELECT.
  • HAVING может принимать в качестве аргумента любые поля или псевдонимы в select_expression. Он применяется последним перед передачей данных клиенту без какой-либо оптимизации. Не используйте его для элементов из предложения WHERE.

    Замечание: Вы не можете написать:

    SELECT user,MAX(salary) FROM users GROUP BY users HAVING max(salary)>10

    Вместо этого, используйте нечто вроде следующего (это хороший пример использования псевдонимов столбцов):

    SELECT user,MAX(salary) AS sum FROM users GROUP BY users HAVING sum > 10
  • LIMIT принимает один или два аргумента. Один аргумент задает максимальное число строк в результате. В случае двух аргументов этот максимум задает второй аргумент, а первый указывает смещение первой строки.
  • INTO OUTFILE 'filename' пишет результаты в файл. Файл не должен существовать на момент выполнения этой команды. См. раздел LOAD DATA INFILE для более подробной информации. Это может быть весьма опасной командой, если daemon запущен от имени root. Самое лучшее предоставить право доступа file только когда это абсолютно необходимо.
  • Вы можете использовать числовое значение в предложении ORDER BY для определения столбца, который Вас интересует. ТО ЕСТЬ, если Вы желаете провести сортировку второго столбца, определенного в вашем запросе SELECT, следует написать "ORDER BY 2;". Это также полезно, когда Вы использовали функцию в вашем SELECT.

    ПРИМЕР:

      SELECT Widget_Table.widget_id, Widget_Table.widget_name,
         Purchase_Order_Item.widget_id, sum(Purchase_Order_Item.quantity)
         FROM Widget_Table, Purchase_Order_Item
         WHERE Widget_Table.widget_id = Purchase_Order_Item.widget_id
         GROUP BY Widget_Table.widge t_name ORDER BY 4;

Присоединения

Свойство объединения SQL дает способность определить связи между таблицами и отыскивать) информацию, основанную на этих связях.

Связи перечисляются в предложении FROM запроса SELECT. Каждая связь отделяется запятой.

ПРИМЕР:

$ mysql mysql
Welcome to the mysql monitor. Commands ends with ; or \g.
Type 'help' for help.
mysql> SELECT db.user, db.delete_priv, user.user, user.delete_priv
    -> FROM db,user WHERE db.user = user.user;

Этот запрос соединит таблицы db и user посредством поля user. Это распечатает что-то вроде следующего:

+------+-------------+------+-------------+
| user | delete_priv | user | delete_priv |
+------+-------------+------+-------------+
|mke   | N           | mke  | N           |
+------+-------------+------+-------------+

Первые два поля фактические db.user и db.delete_priv , последние два user.user и user.delete_priv.

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

Вы можете объединить до пятнадцати таблиц в одном объединении.

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

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

Псевдонимы

СУБД MySQL поддерживает концепцию псевдонимов для таблиц и полей.

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

ПРИМЕР:

SELECT A.user,A.select_priv,A.insert_priv,A.update_priv FROM user A

В этом примере использован псевдоним таблицы, чтобы сократить ваш запрос, объявляя псевдоним, который короче имени таблицы. Вы используете псевдоним в первой части выбора, и определяете это в FROM, определяя реальное имя таблицы, пробел и псевдоним. Если Вы имеете больше чем одну таблицу, для которой Вы желаете создать псевдоним, просто добавьте запятую после каждой пары имя/псевдоним таблицы.

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

Псевдонимы для полей таблицы - специфическое для MySQL расширение.

ПРИМЕР:

SELECT user.user AS "User Name", user.delete_priv AS "Delete" FROM user;

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

+-----------+--------+
| User Name | Delete |
+-----------+--------+
| root      | Y      |
| mke       | N      |
| dummy     | N      |
| admin     | N      |
+-----------+--------+

Хороший совет - брать псевдонимы в кавычки, в данном примере "Delete" вызвало бы ошибку синтаксического анализа при применение без кавычек. (Это потому, что DELETE является ключевым словом SQL.

INSERT INTO

СИНТАКСИС:

INSERT INTO table [(column_name, ...)] VALUES (expression,...) ||
INSERT INTO table [(column_name, ...)] SELECT ...

ОПИСАНИЕ:

Вставляет данные в таблицу.

  • В выражении можно использовать любое предыдущее поле в списке column_name (или таблицу, если список имен столбцов не задан).
  • При использовании SELECT вы не можете указать ORDER BY.
  • Вы можете использовать функцию C API mysql_info для получения строки:

    @result{Records: 220 Duplicates: 1 Warnings: 1}

    • Records показывает число записей, возвращенных SELECT'ом.
    • Duplicates = число строк, которые не могли быть вставлены из-за дублирования ключей.
    • Warnings = счетчик числа столбцов в запросе SELECT, которые равны NULL, но были объявлены как NOT NULL для таблицы, в которую Вы вставляете результаты. Столбцы получат значение по умолчанию (помните: в MySQL все NOT NULL столбцы имеют значение по умолчанию!). Если Вы не объявляли при создании таблицы это самое значение, оно будет автоматически назначено, основанным на типе поля.
    • Если Вы желаете вставить NULL в данное значение, Вы должны сделать это, не определяя значение для поля, в которое Вы желаете вставить NULL.

ПРИМЕР:

INSERT INTO Customer(customer_name,customer_contact)
VALUES("Joes Wholesale","Joe Smith")

Этот запрос создаст новую запись в таблице Customer, которая будет содержать автоматически сгенерированный customer_id, и значения, определенные в запросе. Все другие поля будут пустыми (NULL).

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

Вы должны иметь права доступа insert для использования этой команды.

LOAD DATA INFILE

СИНТАКСИС:

LOAD DATA INFILE syntax

ОПИСАНИЕ:

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

ПРИМЕР:

LOAD DATA INFILE 'customer.tab' [REPLACE | IGNORE] INTO TABLE Customer
[fields [terminated by ',' [optionally] enclosed by '"' escaped by
'\\' ]] [lines terminated by '\n'] [(field list)]

Для записи в текстовый файл используйте:

SELECT ... INTO OUTFILE 'customer.tab' fields terminated by
',' enclosed by '"' escaped by '\\' lines terminated by '\n' .

"fields terminated by" | Имеет значение по умолчанию \t.
"fields [optionally] enclosed by" | Имеет значение по умолчанию ".
"fields escaped by" | Имеет значение по умолчанию '\\'.
"lines terminated by" | Имеет значение по умолчанию '\n'.

"fields terminated by" и "lines terminated by" могут быть больше, чем 1 символом.

Если "fields terminated by" и "fields enclosed by" являются пустыми строками, то размер строки будет фиксированным. То есть, будет производиться чтение полей одной длины.

С фиксированными значениями NULL для размера строки будут выводиться пустые строки.

Если указаны "optionally" в "enclosed by" и Вы не используете фиксированный размер строк, только строки с этим символом будут включены в команду SELECT ... INTO.

Если "escaped by" не пусто, то следующие символы будут снабжены префиксом: "escaped by", ASCII 0, и первый символ из "fields terminated by", "fields enclosed by" и "lines terminated by".

Если использован REPLACE, новая строка заменит все строки, которые имеют тот же самый уникальный ключ. Если использован IGNORE, строки будут пропущен, если там уже существует запись с идентичным уникальным ключом. Если ни один из вышеупомянутых параметров не используется, будет выдана ошибка, и остальная часть textfile будет игнорироваться, если найден дублирующий ключ.

Некоторые ситуации, которые не поддерживаются LOAD DATA INFILE:

  • Фиксированные размеры строк ("FIELDS TERMINATED BY" и "FIELDS ENCLOSED BY" являются пустыми) и поля BLOB.
  • Разделитель, являющийся префиксом другого разделителя.
  • "FIELDS ESCAPED BY" пустое и данные содержат один или несколько разделителей.

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

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

Если "FIELDS ENCLOSED BY" не пустое, то NULL читается как значение NULL. Если "FIELDS ESCAPED" не пустое, то \N тоже читается как значение NULL. Note Обратите внимание, что это БОЛЬШАЯ N, верхний регистр!

Когда запрос LOAD DATA выполнен, Вы можете получить следующую строку информации, используя функцию C API mysql_info().

@result{Records: 1 Deleted: 0 Skiped: 0 Warnings: 0}

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

Вы должны иметь права доступа select и insert таблице user для использования этой команды.

SET OPTION

СИНТАКСИС:

SET OPTION SQL_VALUE_OPTON=value, ...

ОПИСАНИЕ:

Меняет или устанавливает опции MySQL. Опции действуют только в пределах текущего сеанса.

MySQL поддерживает следующие опции (в этой версии пока одну):
SQL_SELECT_LIMIT=value Максимальное число записей, которое возвращает SELECT. Если SELECT имеет параметр LIMIT, то используется значение из этой опции.

UPDATE

СИНТАКСИС:

UPDATE table SET column=expression,... WHERE where_definition

Здесь where_definition:

where_definition:
  where_expr or where_expr [AND | OR] where_expr

Здесь where where_expr имеет формат:

where_expr:
  column_name [> | >= | = | <> | <= | < ]
  column_name_or_constant or
  column_name LIKE column_name_or_constant or
  column_name IS NULL or column_name IS NOT NULL or (where_definition)

ОПИСАНИЕ:

Обновляет одно или несколько полей в таблице MySQL.

  • Все обновления выполняются слева направо.
  • Внутри UPDATE на одной таблице все операции атомарные. Напримерe, Вы можете увеличивать счетчик внутри таблицы, просто прибавляя 1 к соответствующей переменной.

ПРИМЕРЫ:

UPDATE Widget_Table SET widgets_on_hand=widgets_on_hand - 300
where widget_id=3;

Этот запрос вычтет 300 из значения widgets_on_hand для widget = 3.

DELETE FROM Purchase_Order_Item WHERE purchase_order = 456

Этот запрос удалит все записи из Purchase_Order_Item, которые имеют значение 456 для purchase_order. Обратите внимание, что вообще Вы НИКОГДА не должны бы удалять данные из этого сорта базы данных. Вы создаете базы данных, чтобы следить за информацией, и даже плохая информация могла бы стать полезной в некотором случае. Гораздо лучше иметь некоторый тип кода состояния, который Вы используете, когда данные стали недопустимыми по каким-либо причинам.

Вы также хотели бы удалять запись в Purchase_Order для purchase_order 456. Важно убедиться, что, когда Вы удаляете информацию, Вы избавляетесь от всех ссылок к этой информации. Иначе Вы закончите с разрушенной базой данных.

Вы должны иметь права доступа update для использования этой команды.

SHOW

СИНТАКСИС:

SHOW DATABASES [LIKE wild]
SHOW KEYS FROM table_name
SHOW TABLES [FROM database] [LIKE wild]
SHOW [COLUMNS|FIELDS] FROM table [FROM database] [LIKE wild]

ОПИСАНИЕ:

Отображает информацию о базе данных MySQL. "wild" эквивалент регулярному выражению для SQL LIKE.

ПРИМЕР:

$ mysql WidgetDB
Welcome to the mysql monitor.  Commands ends with ; or \g.
Type 'help' for help.
mysql> SHOW fields FROM Widget_Table from WidgetDB;
6 rows in set (0.34 sec)
+--------------------+--------------+------+-----+---------+----------------+
| Field              | Type         | Null | Key | Default | Extra          |
+--------------------+--------------+------+-----+---------+----------------+
| widget_id          | mediumint(8) |      | PRI | 0       | auto_increment |
| widget_name        | char(60)     |      | MUL |         |                |
| widget_color_id    | mediumint(8) |      | MUL | 0       |                |
| widget_size_id     | mediumint(8) |      |     | 0       |                |
| widgets_on_hand    | smallint(5)  |      |     | 0       |                |
| widget_price       | float(8,2)   |      |     | 0.00    |                |
| commission_percent | float(4,2)   |      |     | 0.00    |                |
+--------------------+--------------+------+-----+---------+----------------+
mysql>

Первые два поля довольно очевидны. Null будет содержать YES, если это поле может быть равным NULL, Key сообщает имеет ли это поле индекс, Default сообщает Вам значение по умолчанию, которое будет назначено этому полю, если там ничего не окажется после выполнения команды INSERT, Extra указывает другие атрибуты поля, такие как AUTO_INCREMENT, например.

О строках

Строка может иметь ' или " в качестве ограничителей.

\ является управляющим символом. Распознаются следующие управляющие последовательности:
\0 | ASCII 0. Примечание: это - 5C 30, а не 5C 00!
\n | Новая строка.
\t | Табуляция.
\r | Возврат каретки.
\b | backspace
\' | '
\" | "
\\ | \
\% | % (используется в строках с символами подстановки для поиска '%')
\_ | _ (используется в строках с символами подстановки для поиска '_')

Примеры правильных строк:

  • 'hello'
  • "hello"
  • '""hello""'
  • "'ello"
  • "'e"l"lo"
  • '\'hello'
  • "This\nIs\nFour\nlines"

' в строке записывается как ''.

" в строке записывается как "".

Пример, чтобы прояснить ситуацию:

mysql> select 'hello',"'hello'",'""hello""','''h''e''l''l''o''',"hel""lo";
1 rows in set (0.01 sec)
+-------+---------+-----------+-------------+--------+
| hello | 'hello' | ""hello"" | 'h'e'l'l'o' | hel"lo |
+-------+---------+-----------+-------------+--------+
| hello | 'hello' | ""hello"" | 'h'e'l'l'o' | hel"lo |
+-------+---------+-----------+-------------+--------+

О числах

  • Целые числа состоят из последовательности цифр.
  • Плавающие числа состоят из последовательности цифр с факультативным десятичным разделителем представляемым точкой ".".
  • В версии 3.20.X все вычисления выполняются с числами типа doubles, что приводит к тому, что большие значения типа ulonglong усекаются. В версии 3.21.X это исправлено.

Имена таблиц и столбцов

Вы можете использовать только набор символов ISO8859-2 (или набор символов который Вы определили при компиляции начальном выборе конфигурации и компиляции пакета), символ подчеркивания, и 0-9 в именах столбцов.

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


Интерфейс для С (C API) - Документация на MySQL

Интерфейс для С (C API)

  • Коротко о главном
  • Подготовка
  • Клиентские функции
  • mysql_affected_rows
  • mysql_close
  • mysql_connect
  • mysql_create_db
  • mysql_data_seek
  • mysql_drop_db
  • mysql_eof
  • mysql_error
  • mysql_fetch_field
  • mysql_fetch_lengths
  • mysql_fetch_row
  • mysql_field_seek
  • mysql_free_result
  • mysql_get_client_info
  • mysql_get_host_info
  • mysql_get_proto_info
  • mysql_get_server_info
  • mysql_insert_id
  • mysql_list_dbs
  • mysql_list_fields
  • mysql_list_processes
  • mysql_list_tables
  • mysql_num_fields
  • mysql_num_rows
  • mysql_query
  • mysql_real_query
  • mysql_reload
  • mysql_select_db
  • mysql_shutdown
  • mysql_stat
  • mysql_store_result
  • mysql_use_result

Коротко о главном

API поддерживает богатый ассортимент функций, которые обеспечивают доступ к СУБД MySQL из программы пользователя, независимо от того, запущена ли она в локальной или на удаленной системе.

Подготовка

Вы должны подключить файл mysql.h в начале Вашей программы на C:

#include "mysql.h"

Вы также должны компоновать программу с математической (для шифрования) и mysqlclient библиотеками:

$ cc -I/usr/include/mysql -L/usr/lib/mysql myapp.c -o myapp -lm -lmysqlclient

Включаемые файлы обычно размещены в /usr/include/mysql, а библиотеки могут быть найдены в /usr/lib/mysql.

Если Вы имеете утечку памяти в вашей программе-клиенте, Вы можете компилировать с опцией --with-debug=yes. Это заставит код клиента использовать пакет 'safe_malloc' в библиотеке клиентов MySQL. Вызовите TERMINATE(stdout) или my_end(1) в вашей прикладной программе-клиенте перед выходом, чтобы получить список всех утечек памяти. Детали - в файле mysys/safemalloc.c из дистрибутива MySQL.

Рассмотрим простой пример MySQL-клиента, который только выполнит SELECT и выведет все возвращенные строки в STDOUT. В нем использованы далеко не все функции С API, он должен только дать Вам представление о типичном виде программы-клиента.

#include <stdio.h>
#include <stdlib.h>
#include "mysql.h"
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
void exiterr(int exitcode)
{
  fprintf(stderr, "%s\n", mysql_error(&mysql));
  exit(exitcode);
}
int main()
{
  uint i = 0;
  if (!(mysql_connect(&mysql,"host","username","password")))
     exiterr(1);
  if (mysql_select_db(&mysql,"payroll")) exiterr(2);
  if (mysql_query(&mysql,"SELECT name,rate FROM emp_master"))
     exiterr(3);
  if (!(res = mysql_store_result(&mysql))) exiterr(4);
  while((row = mysql_fetch_row(res))) {
    for (i=0 ; i < mysql_num_fields(res); i++)
      printf("%s\n",row[i]);
  }
  if (!mysql_eof(res)) exiterr(5);
  mysql_free_result(res);
  mysql_close(&mysql);
}

Клиентские функции

MySQL API использует структуры данных MYSQL (определены в mysql.h) чтобы установить связь с СУБД. Вы можете устанавливать много соединений из одной программы-клиента, однако, каждое соединений должно быть связано с собственной отдельной структурой MYSQL.

После успешного запроса, если данные должны быть возвращены пользователю, набор результатов должен быть передан через функции mysql_use_result или через функцию mysql_store_result. Обе эти функции сохраняют набор результатов в структуре MYSQL_RES. Разница в том, что mysql_store_result передает весь набор результатов в память клиента, а mysql_use_result инструктирует клиента, чтобы он мог получить строку динамически с сервера с каждым обращением к mysql_fetch_row. Имейте в виду, что mysql_use_result занимает ресурсы сервера, и не должен использоваться для интерактивных прикладных программ, где действия пользователя часто непредсказуемы и могут привести к большим задержкам. Обратите внимание также, что Вы можете держать только одно соединение, которое использует mysql_user_result, открытым, и это должно быть последнее созданное соединение. По умолчанию процесс mysqld закроет соединение после тридцати секунд неактивности.

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

mysql_affected_rows

СИНТАКСИС:

int mysql_affected_rows(MYSQL *mysql)

ОПИСАНИЕ:

Возвращает число строк, на которые воздействует последний UPDATE, DELETE или INSERT.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:

  • Целое число > 0 показывает число измененных строк.
  • Ноль, если никакие записи не соответствовали предложению WHERE в UPDATE или DELETE.
  • -1, если запрос возвратил ошибку, например, была сделана попытка добавить двойной первичный ключ в течение одного INSERT.

ПРИМЕР:

mysql_query(&mysql,"INSERT INTO gl_transact(acctnbr, amount) VALUES(12345,
            651.30)");
if (mysql_affected_rows(&mysql) < 0)
   fprintf(stderr, "Attempted to add duplicate primary key\n");

MySQL оптимизирован для случая удаления всех записей в таблице. Побочный эффект этой оптимизации - то, что MySQL возвратится, ноль для числа строк, на которые воздействовал в этой ситуации. Выполнение 'select count(*) from the_table' перед удалением всех записей даст Вам значение = на сколько строк воздействовала система, хотя это значение может изменяться между SELECT и DELETE. MySQL 3.20.X не поддерживает блокировку таблицы. Это исправлено в версии 3.21.X

mysql_close

СИНТАКСИС:

void mysql_close(MYSQL *mysql);

ОПИСАНИЕ:

Закрывает открытое соединение подключение. mysql_close должен быть вызван после завершения всех операций, выполняемых через соединение с MySQL. Если это не сделать, поток, созданный mysql_connect, зависнет до окончания тайм-аута сервера. На сервере, работающем с сильной нагрузкой, это может быстро израсходовать много памяти, хотя нужно очень немного времени центрального процессора.

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

По умолчанию тайм-аут = 30 секундам для активного запроса и 8 часам для открытого подключения.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:

Нет.

mysql_connect

СИНТАКСИС:

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

ОПИСАНИЕ:

Пытается установить соединение с сервером MySQL, работающем на компьютере host. Значение host может быть сетевым именем или IP адресом. Параметр user задает логин пользователя MySQL, параметр passwd задает пароль для user. ОБРАТИТЕ ВНИМАНИЕ: Не пытайтесь шифровать passwd перед вызовом mysql_connect. Шифрование выполняется автоматически клиентским API.

  • Если host не задан, то подразумевается 'localhost'.
  • Если user не задан, то подразумевается 'current user'. Под Windows ODBC, текущий пользователь должен быть определен явно. Под Unix подразумевается текущий логин.
  • Если password не задан, то будут проверены только те записи в таблице пользователей, которые не имеют пароля. Это позволяет db-администратору настроить систему привилегий MySQL так, чтобы пользователь получал различные привилегии в зависимости от того, определен пароль или нет. Иногда полезно.

mysql_connect должен успешно завершиться до каких-либо действий с базой данных.

Вы можете опционально задать первый аргумент mysql_connect как (MYSQL*) 0. Это вынудит C API к автоматическому распределению памяти для структуры подключения и освобождению ее при завершении. Расплатой за это служит то, что Вы не сможете получать сообщения об ошибках из mysql_connect, когда используете эту опцию.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:

  • mysql, если соединение выполнено успешно.
  • NULL в случае, если связаться не удалось.

ПРИМЕР:

MYSQL *mysql;
if ((mysql = malloc(sizeof(MYSQL))) != NULL)
{
   if (!(mysql_connect(mysql, "pr_server", "jqpublic", "mypasswd")))
   {
      free(mysql);
      exit(1);
   }
}
free(mysql);

mysql_create_db

СИНТАКСИС:

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

ОПИСАНИЕ:

Создает базу данных, именованную как db на машине, указанной в mysql. MySQL подключение должно быть выполнено с правами пользователя, который имеет право создавать базы данных. Обратитесь к главе "Администрирование пакета" за подробностями о правах доступа.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:

  • 0, если база данных создана успешно.
  • Не 0, если произошла ошибка. Сообщение об ошибке можно получить с помощью функции mysql_error.

mysql_data_seek

СИНТАКСИС:

void mysql_data_seek(MYSQL_RES *res, uint offset);

ОПИСАНИЕ:

Переходит на указанную строку в наборе результатов запросов. Не может использоваться вместе с mysql_use_result.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:

Нет.

mysql_drop_db

СИНТАКСИС:

int mysql_drop_db(MYSQL *mysql, const char *db);

ОПИСАНИЕ:

Удаляет базу данных с именем, указанным в db на сервере, указанном в mysql. Подключение должно быть выполнено с правами пользователя, который имеет на это право. Обратитесь к главе "Администрирование пакета" за подробностями о правах доступа.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:

  • 0, если база данных удалена успешно.
  • Не 0, если произошла ошибка. Сообщение об ошибке можно получить с помощью функции mysql_error.

mysql_eof

СИНТАКСИС:

int mysql_eof(MYSQL_RES *)

ОПИСАНИЕ:

Возвращает значение != 0, если последний вызов mysql_fetch_row не вернул ничего потому, что достигнут конец набора результатов.

mysql_error

СИНТАКСИС:

char *mysql_error(MYSQL *mysql)

ОПИСАНИЕ:

Выводит сообщение об ошибке, если ошибку вернула последняя вызванная функция MySQL. В противном случае возвращает пустую строку.

mysql_fetch_field

СИНТАКСИС:

MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *handle);

ОПИСАНИЕ:

Находит тип поля таблицы.

mysql_fetch_lengths

СИНТАКСИС:

unsigned int *mysql_fetch_lengths(MYSQL_RES *mysql)

ОПИСАНИЕ:

Возвращает длину всех столбцов в наборе результатов запросов. Если Вы планируете получение данных, содержащих \0, Вы должны использовать эту функцию, чтобы получить фактическую длину значения поля.

mysql_fetch_row

СИНТАКСИС:

MYSQL_ROW mysql_fetch_row(MYSQL_RES *mysql);

ОПИСАНИЕ:

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

mysql_field_seek

СИНТАКСИС:

void mysql_field_seek(MYSQL_RES *result, int field)

ОПИСАНИЕ:

Помещает курсор столбца в поле номер field, который должен быть в диапазоне от 0 до mysql_num_fields(MYSQL_RES*)-1.

mysql_free_result

СИНТАКСИС:

void mysql_free_result(MYSQL_RES *result);

ОПИСАНИЕ:

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

mysql_get_client_info

СИНТАКСИС:

char *mysql_get_client_info(void);

ОПИСАНИЕ:

Эта функция просто возвращает строку с информацией о версии используемой в настоящее время клиентской библиотеки. Иногда полезно.

mysql_get_host_info

СИНТАКСИС:

char *mysql_get_host_info(MYSQL *mysql);

ОПИСАНИЕ:

Возвращает имя сервера (заданное в аргументе "host" при вызове mysql_connect).

mysql_get_proto_info

СИНТАКСИС:

int mysql_get_proto_info(MYSQL *mysql);

ОПИСАНИЕ:

Получает версию протокола, используемую подключением. MySQL поддерживает динамические протоколы, основанные на возможностях клиента. В версии 3.20.X это не делает ничего, но в будущих версиях, эта возможность позволит, например, одному пользователю подключать использование текущего протокола, в то время как другой использует шифрование и сжатие.

mysql_get_server_info

СИНТАКСИС:

char *mysql_get_server_info(MYSQL *mysql);

ОПИСАНИЕ:

Возвращает версию сервера.

mysql_insert_id

СИНТАКСИС:

int mysql_insert_id(MYSQL *mysql)

ОПИСАНИЕ:

Возвращает ID, сгенерированный для поля AUTO_INCREMENT переменной результата 'res'.

mysql_list_dbs

СИНТАКСИС:

MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild);

ОПИСАНИЕ:

Предоставляет простой способ переноса mSQL прикладных программ. Подобно выполнению 'SHOW databases [ LIKE wild-card ]', как запроса.

mysql_list_fields

СИНТАКСИС:

MYSQL_RES *mysql_list_fields(MYSQL *mysql, const char *table, const char *wild);

ОПИСАНИЕ:

Предоставляет простой способ переноса mSQL прикладных программ. Подобно выполнению 'SHOW fields [FROM table] [FROM database] [LIKE wild-card]', как запроса.

mysql_list_processes

СИНТАКСИС:

MYSQL_RES *mysql_list_processes(MYSQL *mysql);

ОПИСАНИЕ:

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

mysql_list_tables

СИНТАКСИС:

MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild);

ОПИСАНИЕ:

Предоставляет простой способ переноса mSQL прикладных программ.

Вызывает как запрос 'SHOW tables [FROM database]'.

mysql_num_fields

СИНТАКСИС:

int mysql_num_fields(MYSQL_RES *result);

ОПИСАНИЕ:

Возвращает количество столбцов (полей) в результате запроса.

ПРИМЕР:

MYSQL mysql;
MYSQL_RES *result;
int fields;
if (mysql_query(&mysql, "SELECT * FROM emp_master") == 0)
{
   result = mysql_store_result( &mysql );
   if (result != NULL )
   {
      fields = mysql_num_fields( result );
      printf( "Retrieved %u fields\n", fields );
   }
   else printf( "Query failed\n" );
}
else abort();

См. также:

mysql_list_dbs, mysql_list_fields, mysql_list_processes, mysql_list_tables, mysql_store_result, mysql_use_result

mysql_num_rows

СИНТАКСИС:

int mysql_num_rows(MYSQL_RES *result);

ОПИСАНИЕ:

Возвращает количество строк, возвращенных последним вызовом mysql_list_dbs, mysql_list_fields, mysql_list_processes, mysql_list_tables, mysql_store_result

ПРИМЕР:

MYSQL mysql;
MYSQL_RES *result;
int rows;
if (mysql_query(&mysql, "SELECT * FROM emp_master") == 0)
{
   result = mysql_store_result(&mysql );
   if (result != NULL)
   {
      rows = mysql_num_rows(result);
      printf("Retrieved %u rows\n", rows);
   }
   else printf("Query failed\n");
}
else abort();

См. также:

mysql_list_dbs, mysql_list_fields, mysql_list_processes, mysql_list_tables, mysql_store_result, mysql_use_result

mysql_query

СИНТАКСИС:

int mysql_query(MYSQL *mysql, const char *query);

ОПИСАНИЕ:

Выполняет SQL запрос указанный query к базе данных, указанной в mysql. Эта функция возвращает 0, если запрос выполнен успешно. Результат, отличный от нуля, указывает на ошибку. Обращение к mysql_error выведет текстовое сообщение об ошибке.

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

Если Вы имеете поле AUTO_INCREMENT в модифицируемой таблице, и выполняете оператор INSERT, Вы можете получить последнее назначенное значение поля, проверяя mysql_insert_id.

mysql_real_query

СИНТАКСИС:

int mysql_real_query(MYSQL *mysql, const char *query, uint length);

ОПИСАНИЕ:

Эта функция вызывается mysql_query после того, как она выполнила обращение к функции strlen чтобы вычислить длину строки запроса. Это можно использовать, если Ваша программа распределяет фиксированный буфер для строки запроса.

Вы будете должны использовать эту функцию, если Вы имеете данные, в которые значение \0 входит не как последнее.

mysql_reload

СИНТАКСИС:

int mysql_reload(MYSQL *mysql);

ОПИСАНИЕ:

Перезагружают таблицу доступа пользователей, очищает все кэши и закрывает все открытые неиспользуемые таблицы. Должна быть вызвана перед запуском isamchk на любой таблице. Требует, чтобы пользователь имел право на перезагрузку (reload).

mysql_select_db

СИНТАКСИС:

int mysql_select_db(MYSQL *mysql, const char *db);

ОПИСАНИЕ:

Пытается соединиться с базой данных, указанной в db, на сервере, указанном в mysql. Сервер СУБД MySQL использует логин и пароль, содержащиеся в mysql, чтобы опознать подключение. Перед использованием mysql_select_db необходимо успешно вызвать mysql_connect.

mysql_select_db должен быть вызван успешно перед попыткой сделать запрос к базе данных. Исключительные ситуации - запросы типа:

SHOW DATABASES like 'A%';
SELECT 1+1; # SELECT без использования таблиц(ы).

mysql_shutdown

СИНТАКСИС:

int mysql_shutdown(MYSQL *mysql);

ОПИСАНИЕ:

Останавливает сервер СУБД MySQL. Пользователь должен иметь право shutdown.

mysql_stat

СИНТАКСИС:

char *mysql_stat(MYSQL *mysql);

ОПИСАНИЕ:

Возвращает информацию, которую выдает команда 'mysqladmin version' в виде строки символов. Эквивалентно опции stat программы mysqladmin. В строку включается информация о простое в секундах, запущенных потоках, запросах, перезагрузках и открытых таблицах.

mysql_store_result

СИНТАКСИС:

MYSQL_RES *mysql_store_result(MYSQL *mysql);

ОПИСАНИЕ:

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

mysql_store_result() вернет NULL при ошибке или если инструкция не вернула никаких данных. Вы можете обрабатывать ошибки так:

if (!(result=mysql_store_result(&mysql)) &&
        mysql_num_fields(&mysql))
        fputs(mysql_error(&mysql),stderr);

Вызов mysql_free_result() должен быть выполнен, чтобы освободить память.

mysql_use_result

СИНТАКСИС:

MYSQL_RES *mysql_use_result(MYSQL *mysql);

ОПИСАНИЕ:

То же, что и mysql_store_result(), за исключением того, что результат выдается сервером динамически для каждого вызова mysql_fetch_row(). Эта функция не должна использоваться в интерактивных прикладных программах, так как она связывает сервер. Зато она помогает уменьшить использование памяти на стороне клиента.


Администрирование пакета - Документация на MySQL

Администрирование пакета

  • Предоставление доступа к базам данных
  • Как работают пароли
  • Запуск mysqld (при загрузке системы)
  • Запуск mysqld (при запущенной системе)
  • Опции, задаваемые при компиляции пакета
  • Выключение альтернативных пользовательских логинов
  • Выключение автоматического присваивания значений по умолчанию
  • Изменение используемой длины ключа
  • Изменение порядка сортировки
  • Добавление функций в MySQL
  • Быстрая загрузка данных
  • Настройка mysqld
  • Полезные замечания
    • Маленькие хитрости по улучшению производительности
    • Оптимизация запросов
    • Какая оптимизация выполняется для условия WHERE?
    • Оптимизация памяти, используемой таблицами
    • Несоответствия типов в INSERT
  • О чем говорит номер версии MySQL
  • Протокол "клиент-сервер"
    • Обозначения
    • Детальное описание
    • Типы пакетов
    • :ok
    • :error
    • :command
    • :query
    • :data
  • Подробно о таблицах
  • Ключи и все о них
  • MySQL: планы на будущее
  • Потоки в Linux

Предоставление доступа к базам данных

СУБД MySQL использует специальную базу данных для предоставления прав доступа к своим базам данных. Эти права могут базироваться на именах серверов и/или пользователей и предоставляться для одной или нескольких баз данных

Пользовательские аккаунты могут быть снабжены паролями. При обращении к базе данных, пароль шифруется. Поэтому он не может быть перехвачен и использован посторонним (это мнение автора СУБД...).

СУБД MySQL имеет три таблицы, а именно:

База данных: mysql Таблица: db
База данных: mysql Таблица: db
Поле | Тип | Null | Ключ | Умолчание | Extra
Хост | char(60) |  | PRI |  |
Db | char(32) |  | PRI |  |
Пользователь | char(16) |  | PRI |  |
Select_priv | char(1) |  |  | N |
Insert_priv | char(1) |  |  | N |
Update_priv | char(1) |  |  | N |
Delete_priv | char(1) |  |  | N |
Create_priv | char(1) |  |  | N |
Drop_priv | char(1) |  |  | N |

База данных: mysql Таблица: host
Поле | Тип | Null | Ключ | Умолчание | Extra
Хост | char(60) |  | PRI |  |
Db | char(32) |  | PRI |  |
Select_priv | char(1) |  |  | N |
Insert_priv | char(1) |  |  | N |
Update_priv | char(1) |  |  | N |
Delete_priv | char(1) |  |  | N |
Create_priv | char(1) |  |  | N |
Drop_priv | char(1) |  |  | N |

База данных: mysql Таблица: user
База данных: mysql Таблица: user
Поле | Тип | Null | Key | Умолчание | Extra
Хост | char(60) |  | PRI |  |
Пользователь | char(16) |  | PRI |  |
Пароль | char(8) |  |  |  |
Select_priv | char(1) |  |  | N |
Insert_priv | char(1) |  |  | N |
Update_priv | char(1) |  |  | N |
Delete_priv | char(1) |  |  | N |
Create_priv | char(1) |  |  | N |
Drop_priv | char(1) |  |  | N |
Reload_priv | char(1) |  |  | N |
Shutdown_priv | char(1) |  |  | N |
Process_priv | char(1) |  |  | N |
File_priv | char(1) |  |  | N |

Пример добавления новых пользователей:

$ mysql mysql
mysql> INSERT INTO user VALUES ('%','monty',password('something'),
    -> 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user (host,user,password) values('localhost','dummy','');
mysql> INSERT INTO user VALUES
('%','admin','','N','N','N','N','N','N','Y','N','Y','N');
mysql> quit
$ mysqladmin reload

Добавлено три новых пользователя (юзверя):

monty: Суперпользователь (администратор), должен использовать пароль, для работы с mysql.

dummy: Должен быть допущен к индивидуальной базе данных по таблице 'db '.

admin: Не нуждается в пароле, но разрешено выполнение только команд 'mysqladmin reload' and 'mysqladmin processlist'. Может быть допущен к индивидуальной базе данных через таблицу 'db'.

ВНИМАНИЕ! Вы ДОЛЖНЫ использовать функцию password() при создании пользователя, имеющего пароль. СУБД MySQL ожидает получить зашифрованный пароль.

Атрибуты, установленные в таблице пользователей перекрывают атрибуты, установленные в таблице DB. Если сервер поддерживает много баз данных, лучше создавать пользователей без прав доступа в таблице пользователей и назначать им права доступа к базе данных по таблице db.

Если Вы используете MIT threads package, обратите внимание, что имя localhost не будет работать, так как MIT threads package не поддерживает socket-подключения. Это означает, что Вы должны всегда определять ваш hostname (имя сервера) при подключении, даже если Вы работаете с одним и тем же сервером.

Следует помнить следующие правила при настройке прав доступа:

  • Имя сервера и поля в таблице db могут содержать регулярные выражения языка SQL: символы % и _. В других полях использовать их нельзя.
  • Имя сервера может быть доменным именем, именем localhost, IP адресом или SQL выражением. Пустое поле "имя сервера" означает любой сервер.
  • Поле db является именем базы данных или SQL выражением.
  • Пустое имя пользователя эквивалентно любому пользователю.
  • Пустой пароль эквивалентен любому паролю. Вы можете создать суперпользователя (super-user) установив все права для него в 'Y' в таблице пользователей при создании этого аккаунта. Этот пользователь сможет делать что угодно, не считаясь со значениями, установленными в таблице DB!
  • Таблица серверов проверяется только когда в таблице db поле "имя сервера" пустое.
  • Все таблицы, по возможности, сортируются в порядке host-user-db.
Пользователь | Сортируется по именам серверов и пользователей.
db | Сортируется по именам серверов, пользователей и баз данных.
Сервер | Сортируется по именам серверов и баз данных.

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

Проверка таблицы баз данных будет выполнена для пользователя '' (пустое имя), а не для пользователя Джо, даже если пользователь, Джо имеет запись в таблице доступа к базам данных (db таблице).

Создание пользовательских аккаунтов - вероятно, наиболее путающий аспект СУБД MySQL, (особенно, если никогда не имел с ней дела), так что не удивляйтесь, если потребуется некоторое время, чтобы во всем разобраться и получить парочку несколько неприятных сюрпризов. Использование программы mysqlaccess делает управление доступом несколько более ясным.

Вообще лучше избегать использования регулярных выражений SQL в полях имени сервера. Это упрощает отладку.

Конкретно, установите все поля "имя сервера" в '%' и очистите таблицу серверов. Как только все начнет нормально функционировать, можно начинать эксперименты с добавлением имен серверов в таблицу серверов в случае такой необходимости.

Если получено сообщение об ошибке 'Access denied', то скорее всего вы нормально связались с демоном mysqld, но имеете неправильную информацию в вашей таблице пользователей.

Как работают пароли

Зашифрованный пароль сохраняется в таблице пользователей ('user ').

  • При установлении соединения сервер посылает случайное число клиенту.
  • Клиент шифрует пароль, чтобы получить то, что имеет сервер (он хранит пароли в зашифрованном виде) и вычисляет число из полученного с сервера случайного числа и зашифрованного пароля. Это число отсылается на сервер.
  • Сервер вычисляет число из сохраненного в зашифрованном виде пароля и сгенерированного случайного числа. Если это число совпадет с тем, которое прислал клиент, связь устанавливается.

Запуск mysqld (при загрузке системы)

Solaris

Скопируйте скрипт mysql.server из каталога mysql bin в /etc/init.d .

Проверьте все пути в скрипте mysql.server. Проверьте и установите safe_mysqld в /etc/init.d/mysql.server и в /etc/rc2.d/S99mysql.server .

Linux

В Caldera Open Linux надо добавить в файл /etc/rc.d/rc.local следующее:

/usr/local/bin/safe_mysql &

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

Запуск mysqld (при запущенной системе)

Программа mysqld может быть запущена от имени любого пользователя. По умолчанию она запускается от имени root. Если она запускается от имени любого другого пользователя, надо установить правильные права доступа ко всем необходимым файлам.

Зайдите в систему как пользователь-владелец MySQL и дайте следующую команду (Предполагается, что исполняемый модуль mysql находится в вашем пути. Если это не так, укажите полный путь):

safe_mysql &

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

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

Выключение альтернативных пользовательских логинов

Если вы не хотите, чтобы пользователи могли применять опцию -u для входа в mysql под другим логином, можно закомментировать в файле global.h строку:

#define SAFE_USER 1  /* Comment this if you are paranoid */

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

По умолчанию MySQL автоматически назначит значение по умолчанию полям, которые явно не объявлены. MySQL будет делать это исходя из типа конкретного поля. Если Вы предпочли бы, чтобы поля с необъявленными значениями имели значение NULL, то добавьте в файл global.h строку:

#define DONT_USE_DEFAULT_FIELDS

Изменение используемой длины ключа

По умолчанию MySQL рассматривает только 1120 байтов ключа. Вы можете увеличивать это значение, редактируя файл nisam.h и изменяя значение N_MAX_KEY_LENGTH. Обратите внимание, что это может вести к снижению производительности. Нет причины делать это значение меньше, поскольку можно определить ключ, длина которого меньше указанного поля. Более подробно это рассмотрено в разделе "Ключи".

Изменение порядка сортировки

По умолчанию MySQL сортирует строки согласно ISO8859-1 (latin1). Вы можете изменить это во время конфигурации, определяя следующую опцию.

  --with-charset=[charset]

Где [charset] может быть один из: latin1, latin2, koi8_ru, dec8, dos, hp8, swe7, usa7.

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

Обратите внимание: Если Вы меняете наборы символов уже создав базу данных, Вы будете должны выполнить isamchk с параметрами -e, и -q для всех таблиц, иначе MySQL не будет работать правильно.

Добавление функций в MySQL

Если Вы понимаете C++, и Yacc, то относительно просто добавить функцию к СУБД MySQL. Если не понимаете, то дело хуже.

Сначала добавьте строку в файл sql_lex.cc с именем функции в массив sql_functions.

Затем добавьте две строки в файл sql_yacc.y. Первая определяет символ препроцессора yacc. Вы должны добавить это к началу файла. Затем определите параметры функции, и создайте 'item' с этими параметрами.

В файле item_func.h объявляют класс, который наследуется из Item_num_func или Item_str_func, в зависимости от того, возвращает ли ваша функция число или строку.

В intem_func.cc добавьте:

double *Item_func_newname::val()

если Вы определяете числовую функцию, или

String *Item_func_newname::Str(String *str)

если Вы определяете строковую функцию.

Для строковой функции вы должны также определить следующую функцию:

void Item_func_newname::fix_length_and_dec()

Она должна по крайней мере вычислить 'max_length' основанный на полученных параметрах. max_length - максимальное число символов, которое функция может вернуть (максимальная длина возвращаемого значения).

Если функция не может возвращать null, Вы должны также установить 'maybe_null=0'.

Для строковых функций параметр 'String *str', предоставляет буфер для хранения результата. Строковая функция должна вернуть строку, которая хранит результат.

Все строковые функции должны избегать выделения памяти больше, чем им абсолютно необходимо! Системные ресурсы не бесконечны...

Быстрая загрузка данных

Самый быстрый способ загружать данные в MySQL - команда LOAD DATA INFILE. Это в 3-20 раз быстрее, чем использование инструкций INSERT. Для еще большего количества быстродействия Вы можете использовать следующую процедуру, чтобы отключить формирование ключа на вашей таблице, в то время как данные загружаются. Для этого надо находиться в вашем MySQL каталоге баз данных, или обеспечивать полные пути к вашей базе данных.
isamchk -rq -k0 [имя_базы_данных]/[имя_таблицы] | Удаление ключей
LOAD DATA INFILE ... | Чтение Ваших данных
isamchk -rq [имя_базы_данных]/[имя_таблицы] | Создание ключей таблицы заново
mysqladmin reload. | Сообщите, чтобы mysql использовал новую таблицу

Настройка mysqld

Когда Вы указываете опцию -O, отдельно (без дополнительных параметров) Вы получите список всех переменных и их текущих значений. Это может выглядеть примерно так:

$ mysqld -O

Возможные переменные в опции -O:
Имя | Значение по умолчанию
back_log | Определите размер очереди для входящих tcp/ip подключений. Убедитесь, что установили его побольше, когда Вы ожидаете большое количество подключений в коротком периоде времени. Некоторые ОС могут иметь максимальное значение этой переменной 128 или 256. Подробности об этой очереди можно посмотреть на man-странице listen(2).
keybuffer | Размер кэш-буфера, для хранения всех недавно использованных ключей. Большой буфер дает самую лучшую эффективность. С переключателем -Sl распределен только один буфер.
max_allowed_packet | Буфер подключений сервера может быть изменен до этого значения, если пользователь дает длинную команду. Начальный буфер = 'net_buffer_length'. На каждое подключение выделяется один буфер.
net_buffer_length | Начальный размер буфера подключений. На каждое подключение выделяется один буфер.
max_connections | Максимальное число подключений, которые mysqld может иметь открытыми в одно и то же время.
table_cache | Максимальное число таблиц сохраняемых открытыми на сервере. Таблицы хранятся открытыми, для ускорения запроса к часто используемым таблицам. Однако, каждая открытая таблица требует много памяти.
recordbuffer | Размер кэш-буфера для хранения прочитанных записей. На каждое подключение выделяется один буфер.
sortbuffer | Размер буфера, используемого при сортировке. На каждое подключение выделяется один буфер.
max_sort_length | Максимальное время для сортировки?

Полезные замечания

  • Все потоки совместно используют ту же самую основную память.
  • MySQL в настоящее время не использует memmap. Это может изменяться.
  • Вы можете определять размер буфера для ключей при старте mysqld. Буфер ключей будет кэшировать все ключи во всех таблицах В ПОРЯДКЕ ПОСТУПЛЕНИЯ запросов (переменная keybuffer)
  • Каждое подключение использует некоторую часть потока, стек и буфер подключений (переменная net_buffer_length).
  • Каждый запрос, делающий последовательный просмотр записей в таблице, распределяет буфер чтений (переменная recordbuffer).
  • Каждый запрос, выполняющий сортировку, распределяет sortbuffer и один или два временных файла. Максимально необходимое дисковое пространство = (sort_key_length + sizeof(long))*2.
  • Все объединения выполняются за один проход, и результат сохраняется во временной таблице в памяти. Выполнение полного объединения и сортировки на двух больших таблицах может потребовать очень большого объема памяти.
  • Индексные файлы открываются один раз. Файлы данных открываются один раз для каждого параллельного потока. Каждый параллельный поток имеет полную таблицу struct и поле struct плюс память для трех полных строк столбцов. BLOB требует еще 5-8 байт.
  • Если таблица имеет BLOB, буфер будет распределен, чтобы читать данные BLOB. Этот буфер будет расти по мере необходимости, до размеров самого большого BLOB в таблице.
  • Когда таблица используется, она сохраняется в кэше. Этот кэш будет загружен и опорожнен В ПОРЯДКЕ ПОСТУПЛЕНИЯ запросов (FIFO). По умолчанию mysqld будет кэшировать 64 таблицы. Если много потоков обращаются к одной и той же таблице одновременно, будет иметься одна запись на поток. ТО ЕСТЬ, если два потока одновременно обращаются к той же самой таблице, будет две записи в кэше.
  • Команда mysqladmin reload закрывает все таблицы, которые не используются, и отмечает все используемые таблицы, которые будут закрыты, когда работающие потоки завершатся. Это позволяет эффективно использовать память, своевременно ее освобождая.

Если Вы имеете прикладную программу, которая требует большого количества потоков, это является хорошим способом уменьшить значения recordbuffer и sortbuffer примерно до 32K. Вы можете даже уменьшить recordbuffer до 8КБ без особых проблем. Кроме того можно рассматривать уменьшение значения переменной keybuffer до размера в 512КБ. Это сохранит большой объем памяти, и повысит эффективность работы.

Маленькие хитрости по улучшению производительности

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

Оптимизация запросов

Какая оптимизация выполняется для условия WHERE?

  • Удаление скобок (все ненужные скобки удаляются)
    ((a AND b) AND c OR (((a AND b) AND (c AND d)) -> (a AND b) OR (a AND b AND c AND d)
  • Выполняется свертывание констант
    (a < b AND b=c) AND a=5 -> b > 5 AND b=5
  • Удаление проверки условий в выражении с константами (необходимо из-за свертывания констант).
    (b>=5 AND b=5) OR (b = 6 and 5 = 5) or (B=7 and 5 = 6) -> = B=5 or B=6
  • Если выбор невозможен, возвращаются пустые строки.
  • Поиск всех ключей, которые могут использоваться. Используется тот ключ, который находит меньше записей. Этот ключ используется в следующих выражениях:
    =, >, >= <, <=, BETWEEN и LIKE с префиксом символа 'something%'
  • Удаляются ключи, которые не охватывают все уровни 'AND' и key_parts для которых не полностью определены требования key_parts.
      key = 1 or A = 10                         -> NULL (Нельзя использовать ключ)
  key = 1 or A = 10 and key=2               -> key = 1 OR key = 2
  key_part_1 = const and key_part_3 = const -> key_part_1 = const
  • Читаются все константы в таблице

    Постоянные таблицы:

    1. Таблица всего с одной записью.
    2. Таблица, которая использует только другие константы из таблиц и константы на полном уникальном ключе.
    const_table.key = constant

const_table.key_part_1 = const_table2.field and
const_table.key_part_2 = constant
  • Находится лучшая комбинация присоединений для соединения таблиц (увы, методом перебора :-( )
  • Для каждой таблицы используется, если возможно, линейный ключ для чтения записей. Каждый индекс таблицы опрашивается на предмет существования там ключа, который охватывает < 30% записей. Если такой ключ там найдется, то он используется, иначе используется быстрое сканирование таблицы.
  • Перед выводом каждой записи, пропускаются те, которые соответствуют предложению HAVING.

Оптимизация памяти, используемой таблицами

Есть несколько вещей, которые Вы можете сделать, чтобы минимизировать количество места, которое используют ваши таблицы. Прежде всего используйте НЕ ПУСТОЙ указатель всякий раз, когда возможно. Это ускорит запросы, и сохранит 1 бит на поле.

Вы можете сохранить много места, используя меньшие целочисленные переменные. Например, MEDIUMINT часто вполне достаточен.

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

Имейте в виду, что поля фиксированной длины в mysql обрабатываются значительно быстрее. Избегая полей переменной длины (VARCHAR, BLOBs), можно повысить эффективность на 10-200%.

Несоответствия типов в INSERT

В настоящее время инструкция INSERT дает ошибку только при вставке пустого указателя (NULL) в не пустой столбец.

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

  • Значения преобразуются в правый тип (от integer/real/string до integer/real/string) перед сохранением.
  • Слишком длинные строки усекаются, и увеличивается значение переменной 'warnings'.
  • Если значение ниже минимального значения для столбца, минимальное значение вставляется, и увеличивается значение переменной 'warnings'.
  • Если значение выше максимального значения для столбца, максимальное значение вставляется, и увеличивается значение переменной 'warnings'.
  • При преобразовании строки в целое число, значение усекается при первой не-цифре. Если в строке есть какой-либо символ, не являющийся цифрой, то увеличивается значение переменной 'warnings'.
  • При преобразовании строки в число с плавающей точкой увеличивается значение переменной 'warnings', если после целого числа есть какие-либо символы, кроме точки.

Во время связи клиента с сервером 'warnings information' возвращается только при использовании 'ALTER TABLE' или 'LOAD DATA FROM...'.

О чем говорит номер версии MySQL

Версии MySQL нумеруются по следующей схеме:

111.222.333
111 | Если первая цифра изменяется, это означает, что были сделаны серьезные изменения. Они могут включать поддержку новых форматов файлов, новые протоколы, и т.д. Будьте готовы сделать некоторые модификации ваших прикладных программ перед выполнением после обновления. По крайней мере Вам придется выполнить дамп и перезагрузить Ваши таблицы.
222 | Значительный новый код/функциональные возможности. Может включать мелочь в поддержке синтаксиса SQL или интерфейса пользователя. Вам не придется делать сильных изменений в Ваших прикладных программах, но тщательно проверьте их перед выполнением.
333 | Маленькие безопасные изменения, которые не должны разорвать что-нибудь у сисопа на части. Самая большая проблема здесь - добавление ключевых слов SQL, которые находятся в противоречии с существующими именами таблицы. Если Вы избегаете использовать ключевые слова стандарта SQL-92 для ваших имен таблиц (так вообще-то и надо...), все должно быть ХОРОШО.

Хорошая идея - всегда проверять файл NEWS, когда Вы загружаете новую версию. Это должно дать Вам, представление о том, что именно изменилось, начиная с вашей последней модификации.

Протокол клиент/сервер

На всякий случай приведу подробное описание протокола "клиент-сервер", используемого пакетом MySQL для связи между клиентом и сервером базы данных.

Обозначения

< = клиент
> = сервер
[] 1 байт
[2: ] 2 байта (нижний байт первый)
[3: ] 3 байта (нижний байт первый)
[4: ] 4 байта (нижний байт первый)
[string: ] строка, кончающаяся нулем.
[length: ] длина целого числа. Проверьте Net_store_length()
           для этого! Идея в том, чтобы наиболее часто получать
           данные длиной в 1 байт, но допускать и более длинные
           данные (и NULL).

Детальное описание

Каждый передаваемый пакет имеет следующий префикс:

[3: длина пакета] [номер пакета] данные

При приеме пакета добавляется [0] после каждого принятого пакета, чтобы получить простую обработку строк ошибки.

Номера пакетов начинаются с 0 и увеличиваются для каждого посланного/полученного пакета.

Типы пакетов

:connect

> [protocol version] [string: password crypt seed]
< [2: 0] [3: max_allowed_client_packet_length] [string: user name]
[string: scrambled password]
> ok packet

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

:ok

[0] [length: affected_rows] [length: unique id]

:error

Может приходить в любое время.

> [255] [string: error message]

:command

< [command number]

enum enum_server_command{SLEEP,QUIT,INIT_DB,QUERY,FIELD_LIST,
CREATE_DB,DROP_DB,RELOAD,SHUTDOWN,STATISTICS, PROCESS_INFO,CONNECT}

:query

< [QUERY command] [string: query string] (The end null is not sent)
> [0] [length: affected rows] [length: insert id] (Insert, delete...)

или:

> [length: column_count] (a query result)
> column field data packets
> row data packets

:data

: Данные передаются пока не придет пакет, который состоит только из одиночного символа [254]. Остерегайтесь: могут иметься пакеты, которые начинаются с символа 254! Каждый пакет типа 'data' имеет поле 'column count'.

Формат каждого поля:

[:length] == NULL_LENGTH -> NULL field

или:

[:length] [length data] (Строка не оканчивается на \0!)

Пакет данных столбца состоит из 5 столбцов со следующими данными:

[:string table name]
[:string column name]
[:3 create length of column (may be larger in a few cases)]
[:1 type (as of enum_field_types)]
[:1 flag] [:1 decimals] (2 байта!)

При использовании команды list_fields имеется шестой столбец:

[:string default]

Посмотрите в файлах libmysql.c, net.c и password.c более подробную информацию о форматах пакетов.

Подробно о таблицах

Для получения описания таблицы используйте команду (Вы должны перейти в каталог, который содержит таблицу, информацию о которой Вы желаете получить. Вообще это будет $DATADIR/[dbname], где dbname - имя базы данных, которая содержит таблицу.):

prompt> isamchk -d table_name
ISAM file:     table_name
Data records:               215  Deleted blocks:              0
Recordlength:                85
Record format: Packed
table description:
Key Start Len Index   Type
1   37    14  unique  text packed stripped
2   1     30  multip. text packed stripped
3   51    4   multip. long
4   31    2   multip. short
    33    2           short
    35    2           short

Для более подробных сведений о таблице попробуйте: prompt> isamchk -d -v table_name

ISAM file:     Customer
Isam-version:  2
Creation time: 1996-12-17 21:40:04
Data records:                 0  Deleted blocks:              0
Datafile: Parts:              0  Deleted data:                0
Datafilepointer (bytes):      4  Keyfile pointer (bytes):     3
Recordlength:               374
Record format: Packed
table description:
Key Start Len Index   Type                       Root  Blocksize    Rec/key
1   2     2   unique  short                        -1       1024          1
2   4     80  multip. text packed stripped         -1       1024          1
3   2     2   multip. short                        -1       1024          1

Объяснение полученного результата:
ISAM file | Имя ISAM-файла.
Isam-version | Версия ISAM формата. Сейчас всегда 2.
Creation time | Когда файл данных был создан?
Recover time | Когда в последний раз был восстановлен файл индекса/данных?
Data records | Сколько записей/строк.
Deleted blocks | Сколько удаленных блоков все еще занимают место? См. примеры в разделе по isamchk для информации относительно избавления от неиспользуемого места.
Datafile: Parts | Для динамической записи это показывает, сколько блоков данных в ней. Для оптимизированной таблицы без дырок это будет то же, что и Data records.
Deleted data | Сколько всего байт занимают удаленные данные.
Datafilepointer | Сколько байтов занимает указатель файла данных? Это 2, 3 или 4 байта. Большинство таблиц обходится 2 байтами, но это не может управляться из MySQL. Для фиксированных таблиц это адрес записи. Для динамических таблиц это адрес байта.
Keyfile pointer | Сколько байтов занимает указатель файла данных? Это обычно 1, 2 или 3 байта. Большинство таблиц обходится 2 байтами, но это вычисляется mysql автоматически. Это всегда адрес блока.
Max datafile length | Сколько байт может использовать для этой таблицы файл данных (.ISD).
Max keyfile length | Сколько байт может использовать для этой таблицы файл ключей.
Recordlength | Сколько пробела занимает каждая запись/строка?
Record format | Какой формат имеет каждая запись/строка?
table description | Список всех ключей в таблице. Для каждого ключа выводится краткая информация низкого уровня (большее количество информации в следующей таблице).

Краткая информация низкого уровня для каждого ключа:
Key | Номер ключа.
Start | Где в записи/строке начинается индексная часть.
Len | Какой длины индексная часть? Для упакованных чисел это всегда полная длина поля. Для строк она может быть короче полной длины (хотя MySQL все же не поддерживает такой вариант).
Index | unique или multip.
Type | Какой тип данных имеет эта индексная часть? Это - C тип данных (опционально packed или short).
Root | Адрес корня индексного блока.
Blocksize | Размер каждого индексного блока. По умолчанию 1024, но это может быть изменено во время компиляции.
Rec/key | Статистическое значение, используемое оптимизатором. Оно сообщает, сколько записей приходится на этот ключа. Уникальный ключ всегда имеет значение 1. Это может измениться после того, как таблица загружена и стабилизирована, используя isamchk -a . По умолчанию 30.

MySQL FAQ имеет обширную информацию по этой теме.

Ключи и все о них.

Ниже дается некоторая информацию низкого уровня относительно того, как ключи хранятся и используются в MySQL.

Текущий размер блока для B-tree равен 1024 и и всех блоков (за исключением root) - по крайней мере 2/3 от полного. Для типичного идентификатора (id = 4 байта) это означает 1024/(4+4)*2/3=85 ключей в соответствии с записью, и таким образом можно находить позицию реальной записи в 5 позиционированиях.

Если Вы желаете, чтобы ваши индексы B-tree были 100% полными, выполните isamchk с опцией -rq над вашими файлами таблицы.

Только первая часть ключа может быть префиксно сжата. Если два ключа имеют тот же самый префикс, другая часть ключа будет занимать 1 байт. Все строковые части длиннее 4 символов имеют удаленные хвостовые пробелы.

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

Все блоки ключей читаются/пишутся через key_buffer (по умолчанию 1M) так что блок root буферизуется всегда.

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

MySQL: планы на будущее

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

  • В версии 3.21.0 все типы поля будут написаны как классы, и будет сделан новый оптимизатор для WHERE.
  • В версии 3.21.0 будет добавлен метод блокировки таблицы.
  • В версии 3.22.0 будет добавлен простой язык модификаций. Он будет включать поддержку циклов и подпрограмм.
  • Добавление встроенного языка модификаций в 3.22.0 сделает возможным определять свои процедуры для модификации таблиц.
  • Все возможности, требовательные к ресурсам, могут сильно понизить производительность. Поэтому предполагается сделать так, чтобы на этапе компиляции пакета их можно было отключить в случае отсутствия в них необходимости и в целях повышения производительности.

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

Такие свойства как views, rollback и triggers будут добавлены на каком-то этапе опционально. Они требуют основательной переработки пакета.

Внутренние и внешние объединения, возможно, будут добавлены в версии 3.21.0

Потоки в Linux

Когда MySQL запущен на Linux системе и использует потоки Linux, Вы будете видеть минимум три процесса. Фактически, это потоки. Будет иметься один поток для Linux Threads manager, один, чтобы обрабатывать подключения и один, чтобы обработать сигналы.


Интерфейс с perl (MySQL perl API) - Документация на MySQL

Интерфейс с perl (MySQL perl API)

  • Коротко о главном
  • Основной интерфейс с perl
  • Очень большие числа
  • Connect
  • Смена порта
  • SelectDB
  • ListFields
  • Query
  • ListDBs
  • ListTables
  • FetchCol
  • FetchHash
  • FetchRow
  • DataSeek
  • Обработка двоичных строк
  • Потерянные значения
  • Метаданные
  • Дескриптор базы данных
  • Операторный дескриптор
  • Предупреждение
  • Об авторе интерфейса
  • MySQL DBD/DBI PERL API
    • Коротко о главном
    • Очень большие числа
    • Вставка двоичных строк
    • Об авторе интерфейса
  • Что можно почитать

Коротко о главном

Есть два способа обращения из программы на perl к базе данных MySQL. Дело в том, что два разных человека написали в общем-то одинаково хорошие, хотя и разные библиотеки для такого доступа. Решено включить в поставку оба варианта perl API.

Наличие perl API дает огромные возможности по доступу к базам данных MySQL из скриптов на этом языке. Учитывая, что perl очень часто используется в интернете (для написания CGI-скриптов), этот интерфейс позволяет создавать web-ориентированные базы данных.

Простой интерфейс с perl СУБД MySQL

Этот интерфейс представляет собой первый способ обратиться к базе данных MySQL из программы на perl.

Коротко о главном:

  use Mysql;

  $dbh = Mysql->Connect;
  $dbh = Mysql->Connect($host);
  $dbh = Mysql->Connect($host,$database);
  $dbh = Mysql->Connect($host,$database,$password);
  $dbh = Mysql->Connect($host,$database,$password,$user);
  $dbh->SelectDB($database);

  $sth = $dbh->ListFields($table);
     @arr = @{$sth->name};
     @arr = @{$sth->length};
     $value = $sth->numfields;
     @arr = @{$sth->type};
     @arr = @{$sth->is_num};
     @arr = @{$sth->is_blob};
     @arr = @{$sth->is_not_null};

  $sth = $dbh->Query($sql_statement);
  @arr = $dbh->ListDBs;
  @arr = $dbh->ListTables;
  @arr = $sth->FetchRow;
  %hash = FetchHash $sth;
  $sth->DataSeek($row_number);
  $scalar = $dbh->sock;
  $scalar = $dbh->host;
  $scalar = $dbh->database;
  $scalar = $dbh->quote($binary_string);

Ну что, всем все ясно? Кому еще не ясно, объясняю.

При разработке этого пакета, его старались сделать как можно более похожим на C API.

Вы будете иметь дело с двумя классами: Mysql::Statement работаете с ним через операторный дескриптор, возвращенный командами Query или ListFields. Единственный класс, который Вы называете явно - Mysql. Это предоставляет Вам команду Connect.

Очень большие числа

Из-за ограничений perl по обработке числовых значений, Вы будете иметь проблемы при использовании чисел больше чем signed LONG (2147483647). Это может происходить при использовании в MySQL типов данных unsigned LONG (DOUBLE) или LONGLONG (BIGINT). Perl хранит возвращаемые значения как строки, но автоматически преобразуют их в числа, когда Вы используете значения в числовом контексте. Это их усечет до 2147483647, так как perl использует тип signed LONG, чтобы хранить такие числа.

Вы можете использовать один способ это обойти. Прежде всего всегда обрабатывайте значения, которые могут быть ОЧЕНЬ большими, как строки, а не как числа. Пока Вы делаете это, они могут отображаться и заново вставляться в базу данных без инцидентов. То же самое можно посоветовать для вставки новых значений в таблицы. Если Вы устанавливаете переменную, названную $tmpvar, равную "4147483647" и затем выполняете INSERT, чтобы вставить ее в базу данных, все будет нормально. Обратите внимание, что кавычки здесь очень важны, так как они заставляют perl обрабатывать значение как строку.

Если Вы должны делать вычисления, включающие большие числа, то их нужно выполнять через начальный SELECT.

Connect

$dbh = Mysql->Connect;
$dbh = Mysql->Connect($host);
$dbh = Mysql->Connect($host,$database);
$dbh = Mysql->Connect($host,$database,$password);
$dbh = Mysql->Connect($host,$database,$password,$user);

Эта команда устанавливает соединение с сервером и базой данных. Без аргумента или с пустой строкой в качестве первого аргумента он связывается с устройством UNIX /dev/mysql, который сильно повышает эффективность. Имя базы данных во втором аргументе указывает с какой именно базой данных надо связаться. Возвращается дескриптор базы данных, если команда Connect выполнена успешно. В противном случае возвращаемое значение не определено. Если Вы используете mysqld, скомпилированный с библиотекой потоков MIT, Вы не сможете использовать устройства. В этом случае укажите имя сервера в переменной host. А вообще библиотека потоков MIT такое глюкало...

Можно указать имя пользователя и пароль. Если имя пользователя не указано, используется текущий логин. Если не указан пароль, а пользователь его имеет, связь установить не получится.

Возвращаемый дескриптор нужен для обращения к базе данных. Можно отдать несколько команд Connect переменных ($dbh1,$dbh2, $dbh3, ...)

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

$scalar = $dbh->sock;
$scalar = $dbh->host;
$scalar = $dbh->database;

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

Смена порта

Сменить порт, к которому присоединился MysqlPerl можно так:

$ENV{"MYSQL_TCP_PORT"}=3334;
$ENV{"MYSQL_UNIX_PORT"}="/tmp/mysql_new.sock";
use Mysql;
$dbh = Mysql->Connect($host);

SelectDB

Выбор базы данных для использования.

СИНТАКСИС: $dbh->SelectDB($database);

ОПИСАНИЕ:

Если база данных не выбрана в команде Connect, или если нужно связаться с другой базой данных, то используется дескриптор базы данных из предыдущего вызова команды Connect. Он используется командой SelectDB.

ListFields

Список полей в таблице.

СИНТАКСИС:

$sth = ListFields $dbh $table;

ОПИСАНИЕ:

ListFields возвращает операторный дескриптор, который может использоваться, чтобы выяснить, что именно сервер должен Вам передать. В случае ошибки возвращаемое значение не определено.

MySQL ListFields не работает так же как mSQL ListFields. В MySQL Вы используете следующие команды, чтобы получить информацию после вызова ListFields.

Перед использованием следующих функций, Вы должны выполнить успешное обращение к ListFields.
@arr = @{$sth->name}; | Возвращает массив имен столбцов
@arr = @{$sth->length}; | Возвращает массив длин столбцов
$value = $sth->numfields; | Возвращает количество столбцов в таблице
@arr = @{$sth->type}; | Массив MySQL типов
@arr = @{$sth->is_num}; | Массив 0 и 1, где 1 указывает что столбец числовой
@arr = @{$sth->is_blob}; | Массив 0 и 1, где 1 указывает что столбец - blob
@arr = @{$sth->is_not_null}; | Массив 0 и 1, где 1 указывает что столбец - не NULL

Query

Выполнить запрос.

СИНТАКСИС:

sth = $dbh->Query($sql_statement);

ОПИСАНИЕ:

Эта функция позволяет Вам посылать запрос базе данных. Вы должны использовать FetchRow, чтобы получить результат.

ПРИМЕР:

  $sth = $dbh->Query("SELECT * FROM Widget_Table
                        WHERE widget_id = 1") or die $Mysql::db_errstr;
    $foo = $record[0];
    $bar = $record[1];
  }

Хорошая идея - всегда проверить ошибки. В этом примере такой проверкой занимается блок "or die..." оператора Query.

ListDBs

Список доступных баз данных.

СИНТАКСИС:

arr = $dbh->ListDBs;

ОПИСАНИЕ:

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

ПРИМЕР:

  @dbs = $dbh->ListDBs; # Возвращает массив имен баз данных.
  $count = $#dbs;          # Вычисляет сколько элементов.
  for ($i=0;$i<=$count;$i++) {
    print("   ".$dbs[$i]."\n");
  }

ListTables

Список таблиц, доступных в базе данных.

СИНТАКСИС:

@arr = $dbh->ListTables;

ОПИСАНИЕ:

Возвращает массив с одним элементом для каждого имени таблицы в базе данных. Вы должны были, определить базу данных при вызове Connect или SelectDB.

ПРИМЕР:

  @tables = $dbh->ListTables;    # Assumes that $dbh points
                                    # to a valid database
  $count = $#tables;                # Figure out how many elements.
  for ($i=0;$i<=$count;$i++) {   # Print out the table names.
    print("   ".$tables[$i]."\n");
  }

FetchCol

Возвращает массив, содержащий один столбец, состоящий из значений.

СИНТАКСИС:

@arr = $sth->FetchCol($col);

ОПИСАНИЕ:

Возвращает массив значений для столбца номер $col. FetchRow возвращает следующую строку результата запроса. FetchCol возвращает весь одиночный столбец результата запроса.

Обратите внимание, что эта функция сбросит текущий указатель строки на конец таблицы; вы должны использовать DataSeek(0), чтобы переустановить его.

FetchHash

Возвращает результат запроса.

СИНТАКСИС:

%hash = $sth->FetchHash;

ОПИСАНИЕ:

Возвращает ассоциативный массив, содержащий следующую строку, полученную с сервера.

FetchRow

Возвращает строку результатов.

СИНТАКСИС:

@arr = $sth->FetchRow;

ОПИСАНИЕ:

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

DataSeek

Позиционируется на произвольную позицию в данных.

СИНТАКСИС:

DataSeek $sth $row_number;

ОПИСАНИЕ:

Дает возможность Вам определить смещение в данных, связанное с операторным дескриптором. Следующий вызов FetchRow возвратит соответствующую строку (первая строка имеет смещение = 0).

Обработка двоичных строк

Некоторых символов нужно избежать прежде, чем двоичные строки могут быть вставлены в базу данных MySQL. MySQL perl API обеспечивает следующую функцию, чтобы делать это автоматически.

СИНТАКСИС:

$scaler = $dbh->quote($binary_string)

ОПИСАНИЕ:

Конвертирует строку: пропускает все символы ' и \, а также конвертирует \0 и \n.

Потерянные значения

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

  • Разопределить дескриптор
  • Использовать дескриптор для другой цели
  • Использовать дескриптор внутри блока и объявите его с my()
  • Выйдите из программы

Метаданные

Теперь пересмотрим вышеупомянутые методы в отношении метаданных.

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

Как упомянуто выше, Вы получаете дескриптор базы данных с помощью:

$dbh = Connect Mysql $host, $database;

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

$scalar = $dbh->sock;
$scalar = $dbh->host;
$scalar = $dbh->database;

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

Операторный дескриптор

Два конструктора возвращают операторный дескриптор:

$sth = ListFields $dbh $table;
$sth = Query $dbh $sql_statement;

$sth хранит все метаданные, предоставляемые API:
$scalar = $sth->affected_rows; | Сколько записей вставлено или изменено.
$scalar = $sth->info; | Статистика о предыдущих запросах ALTER TABLE или LOAD DATA FROM INFILE.
$arrref = $sth->is_blob; | Массив битов, специфицирующих является ли данное поле BLOB.
$arrref = $sth->is_not_null; | Массив битов, специфицирующих является ли данное поле NULL.
$arrref = $sth->is_pri_key; | Массив битов, специфицирующих является ли данное поле первичным ключом.
$arrref = $sth->is_num; | Массив битов, специфицирующих является ли данное поле числом.
$scalar = $sth->insert_id; | Значение, присвоенное столбцу с помощью AUTO_INCREMENT последним INSERT.
$arrref = $sth->length; | Массив длин всех полей в байтах.
$arrref = $sth->name; | Имена всех столбцов.
$scalar = $sth->numrows; | Количество возвращаемых записей.
$scalar = $sth->numfields; | Количество возвращаемых полей.
$arrref = $sth->table; | Имена каждого столбца в таблице.
$arrref = $sth->type; | Тип каждого столбца, определен в mysql.h. Доступен с помощью &Mysql::CHAR_TYPE, &Mysql::INT_TYPE, &Mysql::REAL_TYPE

Опция -w

Опция -w может быть очень полезной в случае проблем с отладкой. Если Вы вызываете программу на perl с опцией -w, то предупреждения, обычно хранимые в $Mysql::db_errstr будут выводиться в STDERR (стандартный поток ошибок). Таким образом, Вы получите сообщения об ошибках сервера MySQL без обработки их в Вашей программе.

Если надо использовать опцию -w, но не надо, чтобы сообщения об ошибках увидел демон MySQL, можно установить переменную $Mysql::QUIET в любое ненулевое значение.

Предупреждение

MySQL использует библиотеку libmysql.a, написанную Михаэлем Видениусом (Michael Widenius). Эта библиотека обязательно должна быть установлена до использования этого интерфейса с perl.

Об авторе интерфейса

MySQL perl API основан на mSQL perl API версии 1.17, разработанной Андреасом Коенигом (Andreas Koenig's koenig@franz.ww.TU-Berlin.DE).

Драйвер MySQL DBD Perl

Этот драйвер представляет собой второй способ обратиться к базе данных MySQL из программы на perl.

В настоящее время эта часть описания интерфейса с perl только немного переработана, относительно версии стандартной pod-документации. Данная часть описания изготовлена с помощью команды pod2html -mke.

Обзор:

  use DBI;
  $dbh = DBI->connect( $host, $database, $user, 'mysql' [, $password] );
  # or
  $dbh = DBI->connect('', '', '', 'mysql', {hostname => "localhost",
                      port => 3333, database => "test",
                      username => "myname", password => "mypassword",});

ПРИМЕР:

#!/usr/bin/perl
use DBI;
$drh = DBI->install_driver('mysql');
$dbh = $drh->connect('','test','','') or die "Error connecting to database";
$dbh->do("DROP TABLE foo");
$dbh->do("CREATE TABLE foo ( Field_1 VARCHAR(60) )");
$count = 1;
while ($count < 500) {
  $sth = $dbh->prepare("INSERT INTO foo VALUES('XXXYYYZZZ')");
  $sth->execute;
  $sth->finish; # Очень важно вызвать finish, иначе не освободится память.
  print "$count\n" unless $count % 10;
  $count = $count + 1;
}

Коротко о главном

DBD::mysql является драйвером для работы с базой данных, управляемой СУБД MySQL. Он портирован Michael 'Monty' Widenius of Alligator Descartes' DBD::msql. Вы должны установить DBI-модуль перед использованием DBD::mysql.

$host может быть просто именем сервера (``up.botik.ru'') или именем сервера с указанием порта (``up.botik.ru:3333'').

$database задает имя базы данных с которой надо связаться.

$user задает имя пользователя для доступа к базе данных. (если не указано, используется идентификатор пользователя текущего процесса).

$password является опциональным и нужно только для аккаунтов, которые имеют не пустые пароли.

Системные переменные, которые использует DBD::mysql:

  • hostname
  • database
  • username
  • password
  • port

Значения в системных переменных отменяют значения, переданные раньше. TCP номер порта, отменяет TCP номер порта, переданный в hostname.

Можно разрешить отладку, установив переменную MYSQL_DEBUG 'd:t:O,filename' (где filename является именем файла для записи протокола). Протокол будет записан в файл только если libmysql откомпилирована с поддержкой отладки (опция DBUG).

Поддерживаются следующие тэги:

  • TABLE
  • TYPE
  • IS_PRI_KEY
  • IS_NOT_NULL
  • LENGTH
  • MAXLENGTH
  • IS_KEY
  • IS_BLOB
  • IS_NUM

Для получения значения поля AUTO_INCREMENT INSERT, надо:

  $id = $dbh->func("_InsertID");

Очень большие числа

Ограничения на работу с ОЧЕНЬ БОЛЬШИМИ числами специфичны для языка perl вообще, а не для какого-либо API в частности. Так что все, что об этом сказано выше, справедливо и в данном случае.

Вставка двоичных строк

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

  $mystring = $dbh->quote($rawstring);

Об авторе интерфейса

Msqlperl разработан (C)1997 Alligator Descartes. Модифицирован Msqlperl by Michael 'Monty' Widenius. Все изменения доступны на условиях public domain. Pod-документация, на которой основана данная глава, и _InsertID

Что можно почитать

DBI(3) для информации об использовании DBD/DBI.

http://www.hermetica.com/technologia/perl/DBI домашняя страничка DBI,
http://www.tcx.se домашняя страничка mysql,
www.hughes.com.au домашняя страничка msql.


Библиотека отладчика MySQL - Документация на MySQL

Библиотека отладчика MySQL

  • _db_push_
  • Символы флажка отладки
  • _db_pop_
  • _db_enter_
  • _db_return_
  • _db_pargs_
  • _db_doprnt_
  • _db_dump_
  • ListParse
  • InList
  • PushState
  • DoTrace
  • DoProfile
  • _db_keyword
  • Indent
  • FreeList
  • StrDup
  • DoPrefix
  • OpenFile
  • OpenProfile
  • CloseFile
  • DbugExit
  • DbugMalloc
  • static_strtok
  • BaseName
  • Writable
  • ChangeOwner
  • _db_setjmp_
  • _db_longjmp_
  • DelayArg
  • perror

Библиотека отладчика, используемая MySQL была первоначально написана Фредом Фишом (Fred Fish). Она будет очень полезна, если Вы планируете отлаживать и/или добавлять функциональные возможности к СУБД MySQL.

Автор зачем-то приводит заголовок файла dbug.c из исходников пакета (вместе со всеми комментариями к нему). Приведу его и я, поскольку это может быть продиктовано какими-либо юридическими проблемами с копирайтом. Поскольку я не юрист, привожу этот заголовок без какого-либо перевода (во избежание ошибок или искажения смысла юридического документа при переводе).

/*************************************************************************
 *                              N O T I C E                              *
 *                                                                       *
 *                 Copyright Abandoned, 1987, Fred Fish                  *
 *                                                                       *
 *   This previously copyrighted work has been placed into the  public   *
 *   domain  by  the  author  and  may be freely used for any purpose,   *
 *   private or commercial.                                              *
 *                                                                       *
 *   Because of the number of inquiries I was receiving about the  use   *
 *   of this product in commercially developed works I have decided to   *
 *   simply make it public domain to further its unrestricted use.   I   *
 *   specifically  would  be  most happy to see this material become a   *
 *   part of the standard Unix distributions by AT&T and the  Berkeley   *
 *   Computer  Science  Research Group, and a standard part of the GNU   *
 *   system from the Free Software Foundation.                           *
 *                                                                       *
 *   I would appreciate it, as a courtesy, if this notice is  left  in   *
 *   all copies and derivative works.  Thank you.                        *
 *                                                                       *
 *   The author makes no warranty of any kind  with  respect  to  this   *
 *   product  and  explicitly disclaims any implied warranties of mer-   *
 *   chantability or fitness for any particular purpose.                 *
 *************************************************************************
*/
/*
 *  FILE
 *      dbug.c   runtime support routines for dbug package
 *
 *  SCCS
 *      @(#)dbug.c      1.25    7/25/89
 *
 *  DESCRIPTION
 *      These are the runtime support routines for the dbug package.
 *      The dbug package has two main components; the user include
 *      file containing various macro definitions, and the runtime
 *      support routines which are called from the macro expansions.
 *
 *      Externally visible functions in the runtime support module
 *      use the naming convention pattern "_db_xx...xx_", thus
 *      they are unlikely to collide with user defined function names.
 *
 *  AUTHOR(S)
 *      Fred Fish               (base code)
 *      Enhanced Software Technologies, Tempe, AZ
 *      asuvax!mcdphx!estinc!fnf
 *
 *      Binayak Banerjee        (profiling enhancements)
 *      seismo!bpa!sjuvax!bbanerje
 *
 *      Michael Widenius:
 *      DBUG_DUMP       - To dump a piece of memory.
 *      PUSH_FLAG "O"   - To be used instead of "o" if we don't
 *                        want flushing (for slow systems)
 *      Check of malloc on entry/exit (option "S")
*/

Функции библиотеки отладчика

_db_push_

Поместить в стек текущее состояние отладчика, и установить новое.

СИНТАКСИС: VOID _db_push_ (control) char *control;

ОПИСАНИЕ:

По указателю в параметре "control" на строку управления отладкой помещает в стек текущее состояние отладки, анализирует строку управления и устанавливает новое состояние отладки.

Единственный атрибут нового состояния, унаследованного из предыдущего состояния, это текущая функция вложенного уровня. Это может быть отменено, используя флажок "r" в строке управления.

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

<field_1><field_2><field_N>

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

flag[,modifier,modifier,...,modifier]

Символы флажка отладки:

d | Разрешает вывод из макроса DBUG_ для текущего состояния. Может сопровождаться списком ключевых слов, который разрешает вывод только для DBUG макрокоманд с соответствующим ключевым словом. Пустой список ключевых слов подразумевает вывод для всех макрокоманд.
D | Ждать после каждой выведенной отладчиком строки. Аргумент задает число десятых долей секунды, которое нужно ждать. Например, -#D,20 задает паузу в 2 секунды.
f | Ограничивает отладку и/или трассировку списком имен функций. Обратите внимание, что пустой список отключит все функции. Соответствующий флажок "d" или "t" должен все же быть дан, поскольку этот флажок только ограничивает их действие, если они включены.
F | Идентифицируют имя исходного файла для каждой строки отладки или трассирует вывод.
i | Идентифицируют процесс с pid для каждой строки отладки или трассирует вывод.
g | Включить профилирование. Создайте файл 'dbugmon.out', содержащий информацию, которая может использоваться, чтобы профилировать программу. Может сопровождаться списком ключевых слов, которые выбирают профилирование только для функций в этом списке. Пустой список подразумевает, что все функции подлежат профилированию.
L | Идентифицирует номер строки исходного файла для каждой строки отладки или трассирует вывод.
n | Выводит текущую глубину вложенности функции для каждой строки отладки или трассирует вывод.
N | Номер каждой строки вывода отладки.
o | Переназначает выходной поток отладчика в файл. По умолчанию задан stderr.
O | То же, что и o, но файл сбрасывается между записями. То есть, после каждой записи файл закрывается, и снова открывается только перед следующей записью. Тормозит, конечно, кошмарно, но зато гарантирует сохранность данных в этом файле на случай слета системы. Что при отладке не бесполезно...
p | Ограничивает действия отладчика определенными процессами. Процесс должен быть указан в макросе DBUG_PROCESS и совпадать с одной из записей в списке действий отладчика.
P | Выводит имя текущего процесса для каждой строки отладки или трассирует вывод.
r | При установке нового состояния отладки не наследует предыдущее состояние вложенности функции. Полезно, когда вывод должен начаться в левом поле.
S | Функция _sanity(_file_, _line_) для каждой отлаживаемой функции до _sanity() возвращает отличное от 0 значение. Обычно используется с safemalloc. Как задается это значение, и что оно вообще значит в документации не сказано (!!!), а опытным путем это установить не удалось.
t | Включить функцию трассировки строк вызова и выхода (call/exit). Может сопровождаться списком, содержащим число номер максимального уровня трассировки, вне которого никакого вывода не произойдет для отладочных или трассировочных макрокоманд. Умолчание задается при компиляции.

Некоторые примеры строк управления отладкой:

  -#d:t
  -#d:f,main,subr1:F:L:t,20
  -#d,input,output,files:n

_db_pop_

ОПИСАНИЕ:

Извлекает из стека отладки последнее записанное туда состояние отладки и устанавливает в него состояние отладки. Обратите внимание, что извлечение будет терпеть неудачу, если оно удалит последнее имеющее силу состояние из стека. Это предотвращает ошибки пользователя в последовательности действий со стеком из отладчика.

_db_enter_

СИНТАКСИС:

  VOID _db_enter_ (_func_, _file_, _line_, _sfunc_, _sfile_, _slevel_,
                   _sframep_)
  char *_func_;           points to current function name
  char *_file_;           points to current file name
  int _line_;             called from source line number
  char **_sfunc_;         save previous _func_
  char **_sfile_;         save previous _file_
  int *_slevel_;          save previous nesting level
  char ***_sframep_;      save previous frame pointer

ОПИСАНИЕ:

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

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

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

_db_return_

СИНТАКСИС:

  VOID _db_return_ (_line_, _sfunc_, _sfile_, _slevel_)
  int _line_;             current source line number
  char **_sfunc_;         where previous _func_ is to be retrieved
  char **_sfile_;         where previous _file_ is to be retrieved
  int *_slevel_;          where previous level was stashed

ОПИСАНИЕ:

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

_db_pargs_

Параметры файла протокола для последующего использования _db_doprnt_().

СИНТАКСИС:

  VOID _db_pargs_ (_line_, keyword)
  int _line_;
  char *keyword;

ОПИСАНИЕ:

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

_db_doprnt_

Печать дескриптора строк отладки.

СИНТАКСИС:

  VOID _db_doprnt_ (format, va_alist)
  char *format;
  va_dcl;

ОПИСАНИЕ:

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

Обратите внимание, что строка формата (format) НЕ ДОЛЖНА включить завершение строки (\n), это делается автоматически.

_db_dump_

Выполняет дамп строки, пока не найдет '\0'.

СИНТАКСИС:

  void _db_dump_ (_line_,keyword,memory,length)
  int _line_;               current source line number
  char *keyword;
  char *memory;             Memory to print
  int length;               Bytes to print

ОПИСАНИЕ:

Выполняет дамп N символов в двоичный массив. Используется, чтобы исследовать разрушенную память или массивы.

ListParse

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

СИНТАКСИС:

  static struct link *ListParse (ctlp)
  char *ctlp;

ОПИСАНИЕ:

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

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

InList

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

СИНТАКСИС:

  static BOOLEAN InList (linkp, cp)
  struct link *linkp;
  char *cp;

ОПИСАНИЕ:

Проверяет строку, на которую указывает "cp" чтобы определить, находится ли эта строка в списке, на который указывает "linkp". Linkp указывает на первую строку в списке. Если linkp == NULL, то строка обрабатывается, как будто она находится в списке (все строки находятся в пустом списке). Это может казаться довольно странным сначала, но ведет к желательной операции, если никакой список не задан. Результатом является то, что все строки будут приняты, когда не имеется никакого списка, но когда имеется список, будут приняты только те строки, которые есть в списке.

PushState

Сохраняет текущее состояние в стеке и устанавливает новое.

СИНТАКСИС:

  static VOID PushState()

ОПИСАНИЕ:

Сохраняет текущее состояние в стеке и устанавливает новое. Единственным параметром, унаследованным из предыдущего состояния является уровень вложения функции. Это можно отменить флажком "r".

Стек состояния это связанный список состояний, с новым состоянием, добавленным в начало. Это позволяет стеку расти до самых границ памяти в случае необходимости.

DoTrace

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

СИНТАКСИС:

  static BOOLEAN DoTrace (stack)

ОПИСАНИЕ:

Проверяет разрешена ли трассировка, не достигнута ли еще максимальная глубина трассировки, текущая функция выбрана и текущий процесс выбран. Возвращает TRUE, если все в порядке, и FALSE в противном случае.

DoProfile

Проверяет разрешено ли профилирование.

СИНТАКСИС:

  static BOOLEAN DoProfile()

ОПИСАНИЕ:

Проверяет разрешено ли профилирование, не достигнута ли еще максимальная глубина трассировки, текущая функция выбрана и текущий процесс выбран. Возвращает TRUE, если все в порядке, и FALSE в противном случае.

_db_keyword

Проверяет ключевое слово на членство в списке ключевых слов.

СИНТАКСИС:

  BOOLEAN _db_keyword_ (keyword)
  char *keyword;

ОПИСАНИЕ:

Проверяет ключевое слово на членство в списке ключевых слов. Как и в случае со строками, все ключевые слова принадлежат пустому списку. Когда отладка не включена, никакие ключевые слова не принимаются. После того, как максимальный уровень трассировки превышен, никакие ключевые слова тоже не принимаются. Дополнительно, текущая функция и текущий процесс должны входить в соответствующие списки.

Возвращает TRUE, если ключевое слово входит в список, и FALSE в противном случае.

Indent

СИНТАКСИС:

  static VOID Indent (indent)
  int indent;

ОПИСАНИЕ:

Выравнивает строку на заданный уровень indent. Отступ может быть задан во время компиляции пакета в виде количества символов на один уровень вложения.

FreeList

Освободить всю память, занятую элементами списка.

СИНТАКСИС:

  static VOID FreeList (linkp)
  struct link *linkp;

ОПИСАНИЕ:

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

StrDup

Создает копию строки в новой области памяти.

СИНТАКСИС:

  static char *StrDup (string)
  char *string;

ОПИСАНИЕ:

Параметр string задает строку, копия которой нужна. Функция распределяет количество памяти, достаточное для создания копии строки и копирует строку в эту область памяти. Сбой при распределении памяти фатален.

DoPrefix

Вывести префикс строки отладки.

СИНТАКСИС:

  static VOID DoPrefix (_line_)
  int _line_;

ОПИСАНИЕ:

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

OpenFile

Открывает новый поток вывода для вывода отладчика.

СИНТАКСИС:

  static VOID OpenFile (name)
  char *name;

ОПИСАНИЕ:

Параметр name является именем нового файла (или "-" для stdout). Файл открывается, и в него назначается вывод отладчика.

OpenProfile

Открывает новый поток вывода для вывода профайлера.

СИНТАКСИС:

  static FILE *OpenProfile (name)
  char *name;

ОПИСАНИЕ:

Параметр name задает имя файла, который открывается и назначается в качестве вывода для профайлера.

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

CloseFile

Закрывает поток вывода отладчика.

СИНТАКСИС:

  static VOID CloseFile (fp)
  FILE *fp;

ОПИСАНИЕ:

Закрывает поток вывода отладчика, если это не stdout или stderr.

DbugExit

Выводит сообщение об ошибке и завершает работу.

СИНТАКСИС:

  static VOID DbugExit (why)
  char *why;

ОПИСАНИЕ:

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

DbugMalloc

Выделяет память для библиотек поддержки отладчика.

СИНТАКСИС:

  static long *DbugMalloc (size)
  int size;

ОПИСАНИЕ:

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

static_strtok

СИНТАКСИС:

  static char *static_strtok (s1, separator)

ОПИСАНИЕ:

Аналог strtok, но 2 разделителя в строке заменены на 1 для совместимости с именами каталогов, принятыми в DOS.

BaseName

Удаляет путь из полного имени файла.

СИНТАКСИС:

  static char *BaseName (pathname)
  char *pathname;

ОПИСАНИЕ:

Параметр pathname является указателем на полное имя файла. Функция размещает в памяти короткое имя файла и возвращает указатель на него.

Writable

Проверяет возможность записи/создания файла.

СИНТАКСИС:

  static BOOLEAN Writable (pathname)
  char *pathname;

ОПИСАНИЕ:

Поскольку отладчик может быть связан и с программой, которая выполняется с битом uid прав доступа (suid), мы должны быть внимательными относительно открытия заданного пользователем файла для вывода отладчика. Это состоит из проверки доступа к файлу на запись с реальным идентификатором пользователя, или проверкой каталога, где файл будет создан.

Вернет TRUE, если все в порядке и FALSE в противном случае.

ChangeOwner

Меняет владельца на реального пользователя для suid программ.

СИНТАКСИС:

  static VOID ChangeOwner (pathname)

ОПИСАНИЕ:

Для Unix-систем, меняет владельца недавно созданного файла отладки на реального владельца. Это нужно в случаях выполнения программ, запущенных с правом доступа set-user-id.

Обратите внимание, что владелец файла уже установлен на момент выдачи этой команды. Так что, если она выполняется без права доступа set-user-id, то эта команда смысла не имеет (но безобидна).

_db_setjmp_

Сохранить окружение отладчика.

СИНТАКСИС:

  VOID _db_setjmp_ ()

ОПИСАНИЕ:

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

_db_longjmp_

Восстановить предварительно сохраненное окружение отладчика.

СИНТАКСИС:

  VOID _db_longjmp_ ()

ОПИСАНИЕ:

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

DelayArg

Преобразует параметр флажка D к системному стандарту.

СИНТАКСИС:

  static int DelayArg (value)
  int value;

ОПИСАНИЕ:

Преобразует время задержки, задаваемое в десятых долях секунды, к системному стандарту. Например, на Amiga, имеется системный вызов "Delay()" который получает параметр в импульсах таймера (50 в секунду). На Unix команда sleep работает с числом секунд. Таким образом, значение "10", для задержки в течение одной секунды, преобразуется в 50 на Amiga, и 1 на Unix. Другие системы будут должны использовать цикл синхронизации.

perror

Моделирование perror для систем, которые его не имеют.

СИНТАКСИС:

  static VOID perror (s)
  char *s;

ОПИСАНИЕ:

Perror выдает сообщение в стандартный поток ошибки, которое обеспечивает большее количество информации относительно библиотеки или ошибки системы. Выводится сообщение, заданное строкой s, затем ': ', сообщение об ошибке и перевод строки (\n).

Недокументированная возможность Unix perror сводится к тому, что если 's' является пустой строкой (но не NULL!), то не выводится ': '.

Эта версия выдает сообщение только о "неизвестной ошибке системы".


Портирование кода из mSQL в MySQL - Документация на MySQL

Портирование кода из mSQL в MySQL

  • Чем отличается реализация протокола клиент/сервер в MySQL от своего аналога в mSQL?
  • Отличия между msql 2.0b7 и MySQL

Перенос прикладных программ mSQL в MySQL относительно прост.

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

Замечания:

  • MySQL использует структуру данных MYSQL как тип для соединения с базой данных (mSQL использует int).
  • mysql_connect получает указатель на структуру MYSQL как параметр. Вы можете определять его глобально или использовать malloc, чтобы его получить.
  • mysql_connect получает 2 дополнительных параметра (логин и пароль пользователя). По умолчанию, они установлены в NULL.
  • mysql_error получает параметр типа MYSQL.

MySQL поставляется с портированными версиями тестовых программ mSQL insert_test.c и select_test.c. Хорошая идея сравнить их с их mSQL эквивалентами. Это должно дать Вам хорошее начало для понимания, что Вы будете должны сделать для портирования mSQL программы в MySQL. Это также даст Вам некоторые мысли о том, что Вы должны делать, чтобы написать свою MySQL программу.

Чем отличается реализация протокола клиент/сервер в MySQL от своего аналога в mSQL?

Имеются значительные различия. Среди них:

  • Буфер сообщений может содержать много строк результатов.
  • На стороне сервера размер буфера сообщений динамически подстраивается по мере необходимости для больших запросов пользователя.
  • Все пакеты пронумерованы, для синхронизации пакетов.
  • Все столбцы представлены в ASCII, длина столбцов и длины строк представлены с помощью двоичного кодирования (1, 2 или 3 байта).
  • MySQL может читать результаты без буферизации.
  • Если одна запись/чтение занимает свыше 30 секунд, сервер закрывает соединение.
  • Если соединение неактивно в течение 8 часов, сервер закрывает соединение.

Отличия между msql 2.0b7 и MySQL

  • CREATE TABLE:

    MySQL: имеет опции для поля: UNSIGNED, ZEROFILL, имеет значение по умолчанию для не пустых полей.

    mSQL: опций не имеет.

  • Создание индексов:

    MySQL:Все индексы должны быть заданы в CREATE TABLE.

    mSQL:Индексы должны быть созданы отдельным оператором CREATE INDEX. (msql использует новый файл ключа для каждого индекса?) Индексы могут быть удалены оператором DROP INDEX

  • Для получения уникального идентификатора при вставке:

    MySQL: Используйте 'auto_increment' как определение типа столбца. Используемый индекс может быть получен после обновления функцией API mysql_insert_id().

    mSQL: Создает структуру SEQUENCE для таблицы и использует функцию __seq для получения уникального индекса.

  • Групповые функции:

    MySQL: count(), avg(), min(), max() и sum(). min() и max() могут принимать строковые аргументы. count(*) оптимизирована для возвращения значения в случае одного столбца.

    mSQL: Нет.

  • Независимый от регистра поиск:

    MySQL: LIKE обязательно не зависит от регистра. Если возможно, MySQL использует индексы при условии, что подобный параметр не начинается с подстановочных знаков.

    mSQL: Использует CLIKE.

  • Поиск с регулярными выражениями.

    MySQL: Использует REGEXP or RLIKE

    mSQL: Использует RLIKE.

  • Какие различия в операторе WHERE:

    MySQL имеет скобки, Скоро он будет иметь полную функциональную поддержку оператора WHERE (это планируется для версии 3.21.X).

  • Имена столбцов:

    MySQL: Если имя столбца уникально, Вы не должны использовать полное имя.

    mSQL: При использовании более чем одной таблицы в SELECT, Вы должны использовать полное имя таблицы.

  • Псевдонимы:

    MySQL: Псевдонимы для таблиц и столбцов.

    mSQL: Псевдонимы для таблиц.

  • Insert/update с вычислениями:

    MySQL: Полная поддержка вычислений. В insert можно использовать значения предшествующих полей.

    mSQL: Только константы в insert и update.

  • Какие формулы могут использоваться в инструкции select:

    MySQL: См. руководство.

    mSQL: Никакие.

  • HAVING:

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

    ПРИМЕР:

       SELECT COUNT(*) AS id_count, id FROM groups GROUP BY id
   HAVING id_count > 10

    mSQL: Не поддерживается вовсе.

  • Импорт и экспорт данных:

    MySQL: MySQL имеет соответствующие функциональные возможности, включая сервис для импорта данных посредством оператора LOAD DATA INFILE, что весьма ускоряет загрузку данных.

    mSQL: Внешние программы.


Утилиты для MySQL - Документация на MySQL

Утилиты для MySQL

Web-утилиты

mod_auth MySQL:

Модуль расширения для web-сервера Apache. Обеспечивает аутенфикацию пользователей, соединяющихся с Вашим web-сайтом. http://web.tryc.on.ca/files

PTS: Проект трассировочной системы для отладчика. http://www.homeport.org/~shevett/pts


Пример базы данных - Документация на MySQL

Пример базы данных

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

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

Таблицы

# The Widget table.
#
# Detailed information on a widget.  Linked to by Purchase_Order_Item
# by way of the widget_id field.  Linked to Widget_Color by way of
# the widget_color field, and to the Widget_Size table by way of the
# widget_size field.
CREATE TABLE Widget_Table (
  widget_id MEDIUMINT(8) NOT NULL AUTO_INCREMENT,
  widget_name CHAR(60) NOT NULL,
  widget_color_id MEDIUMINT(8) NOT NULL,
  widget_size_id MEDIUMINT(8) NOT NULL,
  widgets_on_hand SMALLINT NOT NULL,
  widget_price FLOAT(8,2) NOT NULL,
  commission_percent FLOAT(2,2) NOT NULL,
  PRIMARY KEY (widget_id),
  KEY (widget_name),
  KEY (widget_color_id,widget_size_id)
);

Первая строка сообщает СУБД MySQL, что мы определяем таблицу по имени Widget_Table. Следующие шесть строк определяют поля, которые таблица содержит, тип данных, которые входят в них, и какие атрибуты эти поля имеют.

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

prompt> mysqladmin create Widget-DB

Одна из множества основных концепций в хорошем проекте реляционной базы данных это то, что Вы никогда не должны хранить избыточные данные. В случае Widget_Table это отражено в полях Widget_color_id и widget_size_id. Эти два поля могли бы быть строками. Взамен мы делаем их указателями на другие таблицы, которые будут содержать одну запись для каждого возможного значения, которое может содержать такое поле.

Это сделано по двум причинам:

  • Непротиворечивость
  • Централизация сложности

Первая причина - фактически подслучай второй. Гораздо проще поддержать непротиворечивость в базе данных, если Вы используете таблицы, чтобы искать значения. Это будет предохранять людей от создания прикладных программ, которые используют все от "L" до "HUGE", чтобы обозначить, что размер рассматриваемого объекта большой.

Widget_id поле - среда (3 байт) установленное по размеру целое число. Это имеет специальные атрибуты NOT NULL и AUTO_INCREMENT. NOT NULL является ANSI SQL стандартом и определяет что, когда кто-то вводит widget информацию в эту таблицу, они должны дать некоторое значение для этого поля. Если не дали, MySQL назначит полю значение по умолчанию. Конечно, если значение по умолчанию было определено, то будет использоваться оно, когда не задано никакого значения. Если же оно не определено, то поле получит значение, исходя из его типа.

AUTO_INCREMENT специфический атрибут MySQL. Если Вы вставляете ноль в это поле MySQL, автоматически назначит значение, которое на единицу выше, чем самое высокое предыдущее значение, назначенное к этому полю в этой таблице. Это простой метод для производства уникальных идентификаторов для нового widgets, поскольку они введены в таблицу.

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

Мы также создаем вторичные индексы использованием слова KEY. Индексирование значительно увеличивает быстродействие запросов и объединений. Индексы могут включать больше чем одно поле. Если Вы имеете индекс, который включает больше чем одно поле, Вы не нуждаетесь в создании другого индекса с первым полем в составном индексе.

Мы определили Widget_Table. Теперь надо определить путь слежения за заказами. Для этой цели мы определяем таблицу Purchase_Order.

# The Purchase Order table.
#
# customer_id links us to the Customer_Table
# Where we can get more information about the customer.
#
# To allow for N items on a Purchase order we have to
# have another table called Purchase_Order_Item that
# we link to be way of purchase_order.
CREATE TABLE Purchase_Order (
  purchase_order MEDIUMINT(8) NOT NULL AUTO_INCREMENT,
  customer_id SMALLINT NOT NULL,
  order_date DATE NOT NULL,
  due_date DATE NOT NULL,
  close_date DATE NOT NULL,
  status_code TINYINT(2) UNSIGNED NOT NULL,
  last_action_date TIMESTAMP,
  PRIMARY KEY (purchase_order),
  KEY (customer_id,order_date,status_code)
);

Мы считаем, что заказчик собирается заказывать у нас товар более чем однажды. По этой причине вместо записей об адресе и имени заказчика, мы назначаем каждому заказчику уникальный номер идентификации, который связывает нас со входом в таблице, которая содержит эту информацию. Мы назовем эту таблицу Customer. О ней поговорим немного позже. Также обратите внимание, что мы не имеем никакого упоминания о widgets в этой таблице. Это потому, что порядок приобретения может быть разным. Мы могли бы только определить некоторое фиксированное число способов покупки, но это не будет очень гибко. Взамен этого мы определяем поле, названное purchase_order, которое будет содержать уникальный номер для каждого способа приобретения. Затем мы определяем другую таблицу, которая будет содержать один вход для каждого значения порядка покупки.

Еще одно интересное поле last_action_date. Это поле имеет тип TIMESTAMP. Поля этого типа автоматически модифицируются всякий раз, когда на них выполняется команда INSERT или UPDATE. Это показывает, когда запись была в последний раз изменена.

Таблица для Purchase_Order_Item:

# The Purchase_Order_Item table.
#
# Since there can be more than one item on a purchase order
# we need a table that contains a single item.  We link back to
# The main Purchase_Order table by use of the purchase_order field.
#
# We can also link back to the Widget_Table table by use of the
# widget_id field.
#
# Last of all we link to the Status table by way of the status_code field.
CREATE TABLE Purchase_Order_Item (
  purchase_order SMALLINT NOT NULL,
  order_sequence SMALLINT NOT NULL,
  widget_id MEDIUMINT(8) NOT NULL,
  quantity SMALLINT(4) UNSIGNED NOT NULL,
  status_code TINYINT(2) UNSIGNED NOT NULL,
  order_date DATE NOT NULL,
  item_due_date DATE NOT NULL,
  deliver_date DATE NOT NULL,
  last_action_date TIMESTAMP,
  PRIMARY KEY (purchase_order,order_sequence),
  KEY (widget_id),
  KEY (status_code,order_date)
);

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

Таблица Customer:

# The Customer table.
#
# We need to know where to send those widgets.
#
# Links back to Purchase_Order by way of customer_id.
CREATE TABLE Customer (
  customer_id SMALLINT NOT NULL AUTO_INCREMENT,
  customer_name VARCHAR(80) NOT NULL,
  customer_contact VARCHAR(80) NOT NULL,
  customer_address VARCHAR(80),
  customer_city VARCHAR(80),
  customer_zip VARCHAR(10),
  customer_phone VARCHAR(20),
  customer_fax VARCHAR(20),
  PRIMARY KEY (customer_id),
  KEY (customer_name)
);

Это и совсем просто. Здесь хранится информация о каждом заказчике: его имя, с кем связаться в случае проблем, адрес, телефон и факс.

Теперь давайте подумаем. Среди заказчиков наверняка найдутся свободные торговцы, которые рады продавать Ваш товар по своим ценам. Неплохо бы их привлечь к себе, например, небольшой скидочкой. Но для этого надо хотя бы примерно представлять, кто купил товар для себя, а кто на продажу. Отлично, накроем их колпаком.

# The Sales_droid table.
#
# Keep track of the people who sell the widgets.
#
CREATE TABLE Sales_Droid (
  sales_droid_id SMALLINT NOT NULL AUTO_INCREMENT,
  sales_droid_first_name VARCHAR(80) NOT NULL,
  sales_droid_last_name VARCHAR(80) NOT NULL,
  sales_droid_phone VARCHAR(20) NOT NULL,
  PRIMARY KEY (sales_droid_id)
);

Нужны еще три простые таблицы для служебной информации:

# The Status table.
#
# Table to contain all valid status codes.
#
# Links to to Purchase_Order_Item and Purchase_Item by way of status_code.
CREATE TABLE Status (
  status_code TINYINT NOT NULL AUTO_INCREMENT,
  status_text VARCHAR(80) NOT NULL,
  PRIMARY KEY(status_code)
);

Таблица Status очень простая. Нам нужен уникальный числовой ID, который связан с коротким текстовым полем, которое содержит текст кода состояния.

# The Widget_Color table.
#
# Table to contain all valid color codes.
CREATE TABLE Widget_Color (
  widget_color_id TINYINT NOT NULL AUTO_INCREMENT,
  color_text VARCHAR(80) NOT NULL,
  PRIMARY KEY(widget_color_id)
);
# The Widget_Size table.
#
# Table to contain all valid color codes.
CREATE TABLE Widget_Size (
  widget_size_id TINYINT NOT NULL AUTO_INCREMENT,
  size_text VARCHAR(80) NOT NULL,
  PRIMARY KEY(widget_size_id)
);

Таблицы Widget_Color и Widget_Size почти идентичен таблице Status. Только имена изменены.

Все! Можно вводить данные.


Лицензия на использование MySQL - Документация на MySQL

Лицензия на использование MySQL

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

                        MYSQL FREE PUBLIC LICENSE
                       (Version 4, March 5, 1995)
           Copyright (C) 1995, 1996 TcX AB & Monty Program KB & Detron HB
                Stockholm SWEDEN, Helsingfors FINLAND and Uppsala SWEDEN,
                        All rights reserved.
        NOTE: This license is not the same as any of the GNU Licenses
        published by the Free Software Foundation.  Its terms are
        substantially different from those of the GNU Licenses.
        If you are familiar with the GNU Licenses, please read this
        license with extra care.
This License applies to the computer program known as "mysql".  The
"Program", below, refers to such program, and a "work based on the
Program" means either the Program or any derivative work of the Program,
as defined in the United States Copyright Act of 1976, such as a
translation or a modification.  The Program is a copyrighted work whose
copyright is held by TcX Datakonsult AB and Monty Program KB and Detron HB.
BY MODIFYING OR DISTRIBUTING THE PROGRAM (OR ANY WORK BASED ON THE
PROGRAM), YOU INDICATE YOUR ACCEPTANCE OF THIS LICENSE TO DO SO, AND ALL
ITS TERMS AND CONDITIONS FOR COPYING, DISTRIBUTING OR MODIFYING THE
PROGRAM OR WORKS BASED ON IT.  NOTHING OTHER THAN THIS LICENSE GRANTS YOU
PERMISSION TO MODIFY OR DISTRIBUTE THE PROGRAM OR ITS DERIVATIVE WORKS.
THESE ACTIONS ARE PROHIBITED BY LAW.  IF YOU DO NOT ACCEPT THESE TERMS
AND CONDITIONS, DO NOT MODIFY OR DISTRIBUTE THE PROGRAM.
1.  Licenses.
Licensor hereby grants you the following rights, provided that you comply
with all of the restrictions set forth in this License and provided,
further, that you distribute an unmodified copy of this License with the
Program:
(a) You may copy and distribute literal (i.e., verbatim) copies of the
Program's source code as you receive it throughout the world, in any
medium.
(b) You may modify the Program, create works based on the Program and
distribute copies of such throughout the world, in any medium.
2.  Restrictions.
This license is subject to the following restrictions:
(a) Distribution of the Program or any work based on the Program by a
commercial organization to any third party is prohibited if any payment is
made in connection with such distribution, whether directly (as in payment
for a copy of the Program) or indirectly (as in payment for some service
related to the Program, or payment for some product or service that
includes a copy of the Program "without charge"; these are only examples,
and not an exhaustive enumeration of prohibited activities).  However, the
following methods of distribution involving payment shall not in and of
themselves be a violation of this restriction:
        (i) Posting the Program on a public access information storage
and retrieval service for which a fee is received for retrieving
information (such as an on-line service), provided that the fee is not
content-dependent (i.e., the fee would be the same for retrieving the
same volume of information consisting of random data).
        (ii) Distributing the Program on a CD-ROM, provided that the
files containing the Program are reproduced entirely and verbatim on such
CD-ROM, and provided further that all information on such CD-ROM be
redistributed for non-commercial purposes without charge.
(b) Activities other than copying, distribution and modification of the
Program are not subject to this License and they are outside its scope.
Functional use (running) of the Program is not restricted, and any output
produced through the use of the Program is subject to this license only
if its contents constitute a work based on the Program (independent of
having been made by running the Program).
(c) You must meet all of the following conditions with respect to the
distribution of any work based on the Program:
        (i) If you have modified the Program, you must cause your work to
carry prominent notices stating that you have modified the Program's files
and the date of any change;
        (ii) You must cause any work that you distribute or publish, that
in whole or in part contains or is derived from the Program or any part
thereof, to be licensed as a whole and at no charge to all third parties
under the terms of this License;
        (iii) If the modified program normally reads commands
interactively when run, you must cause it, at each time the modified
program commences operation, to print or display an announcement including
an appropriate copyright notice and a notice that there is no warranty (or
else, saying that you provide a warranty).  Such notice must also state
that users may redistribute the Program only under the conditions of this
License and tell the user how to view the copy of this License included
with the Program.  (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on the
Program is not required to print an announcement.);
        (iv) You must accompany any such work based on the Program with
the complete corresponding machine-readable source code, delivered on a
medium customarily used for software interchange.  The source code for a
work means the preferred form of the work for making modifications to it.
For an executable work, complete source code means all the source code for
all modules it contains, plus any associated interface definition files,
plus the scripts used to control compilation and installation of the
executable code.  However, the source code distributed need not include
anything that is normally distributed (in either source or binary form)
with the major components (compiler, kernel, and so on) of the operating
system on which the executable runs, unless that component itself
accompanies the executable code;
        (v) If you distribute any written or printed material at all with
the Program or any work based on the Program, such material must include
either a written copy of this License, or a prominent written indication
that the Program or the work based on the Program is covered by this
License and written instructions for printing and/or displaying the copy of
the License on the distribution medium;
        (vi) You may not impose any further restrictions on the recipient's
exercise of the rights granted herein.
If distribution of executable or object code is made by offering the
equivalent ability to copy from a designated place, then offering
equivalent ability to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source code along with the object code.
3.      Reservation of Rights.
No rights are granted to the Program except as expressly set forth
herein.  You may not copy, modify, sub-license, or distribute the Program
except as expressly provided under this License.  Any attempt otherwise
to copy, modify, sub-license or distribute the Program is void, and will
automatically terminate your rights under this License.  However, parties
who have received copies, or rights, from you under this License will not
have their licenses terminated so long as such parties remain in full
compliance.
4.      Other Restrictions.
If the distribution and/or use of the Program is restricted in certain
countries for any reason, Licensor may add an explicit geographical
distribution limitation excluding those countries, so that distribution
is permitted only in or among countries not thus excluded.  In such case,
this License incorporates the limitation as if written in the body of
this License.
5.      Limitations.
THE PROGRAM IS PROVIDED TO YOU "AS IS," WITHOUT WARRANTY.  THERE IS NO
WARRANTY FOR THE PROGRAM, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE AND NON INFRINGEMENT OF THIRD PARTY RIGHTS.  THE ENTIRE
RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.
SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
SERVICING, REPAIR OR CORRECTION.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL LICENSOR, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE
PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR
THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.