Go to the first, previous, next, last section, table of contents.


1 Общая информация

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

MySQL - это торговая марка MySQL АВ.

Программное обеспечение MySQL имеет двойное лицензирование. Это означает, что пользователи могут выбирать, использовать ли ПО MySQL бесплатно по общедоступной лицензии GNU General Public License (GPL) или приобрести одну из стандартных коммерческих лицензий MySQL AB. (http://www.gnu.org/licenses/).

Для получения самой свежей информации о программном обеспечении MySQL обращайтесь на веб-сайт MySQL (http://www.mysql.com/).

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

Что важно:

Отчеты об ошибках (bugs), а также вопросы и комментарии следует посылать по адресу mysql@lists.mysql.com. See section 1.8.1.3 Как отправлять отчеты об ошибках или проблемах. Для составления отчетов об ошибках следует использовать сценарий mysqlbug. В поставках исходного текста сценарий mysqlbug находится в директории scripts. Если у вас бинарная поставка, то сценарий mysqlbug следует искать в директории `bin'.

Если вы обнаружите существенную ошибку, относящуюся к безопасности в сервере MySQL, следует сообщить об этом по адресу: security@mysql.com.

1.1 Об этом руководстве

Это - справочное руководство по MySQL; оно представляет собой документацию по MySQL версии 4.1.1-alpha. Функциональные изменения отмечены номером версии, в которой они произведены, поэтому это руководство будет полезно при освоении также и более старых версий MySQL.

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

Руководство часто обновляется, поскольку ПО СУБД MySQL находится в состоянии постоянного развития. Самая последняя версия данного руководства доступна по адресу http://www.mysql.com/documentation/ в различных форматах, включая HTML, PDF и Windows HLP.

Исходным документом для всех версий документации является файл Texinfo. HTML-версия генерируется автоматически модифицированной версией texi2html. Текстовая и Info-версии генерируются при помощи makeinfo, PostScript-версия создается texi2dvi и dvips. PDF-версия генерируется с помощью pdftex.

Если найти нужную информацию в руководстве не удается, можно прибегнуть к помощи версии руководства с функцией поиска, находящейся по адресу http://www.mysql.com/doc/.

Группа, работающая над документацией, рассмотрит любые предложения по дополнению или исправлению данного руководства. Их следует отправлять по адресу docs@mysql.com.

Данное руководство было изначально написано Дэвидом Аксмарком (David Axmark) и Майклом (Монти) Видениусом (Michael (Monty) Widenius). Сейчас это руководство поддерживается Майклом (Монти) Видениусом, Полом Дюбуа (Paul DuBois), Арйен Ленц (Arjen Lentz). Остальные разработчики упомянуты в разделе section C Благодарности.

Авторское право (2003) на данное руководство принадлежит шведской компании MySQL AB. See section 1.6.2 Авторские права и лицензии на MySQL.

1.2 Соглашения, используемые в данном руководстве

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

Моноширинный
Для имен команд и опций; SQL-операторов; имен баз данных, таблиц, столбцов; кода на C и Perl, переменных окружения применяется моноширинный шрифт. Например: ''Чтобы увидеть, как работает mysqladmin, запустите его с опцией --help.''
`filename'
Моноширинный шрифт и кавычки используются для имен файлов и путей. Например: "Дистрибутив устанавливается в каталог `/usr/local/'".
`c'
Для представления последовательности символов используется моноширинный шрифт, а сама последовательность символов заключается в кавычки. Например: "Для задания шаблонного символа используется символ `%'".
Курсив
Курсив используется для выделения текста, подобно данному.
полужирный шрифт
Полужирный шрифт используется для заголовков таблиц и для того, чтобы особо выделить фрагмент текста.

Если нужно показать, что приведенная команда должна выполняться определенной программой, она предваряется подсказкой с именем этой программы. Например, shell> указывает, что команда будет выполняться вашей оболочкой, а mysql> означает, что команда будет выполняться клиентской программой mysql:

shell> набирайте команды оболочки здесь
mysql> набирайте SQL-операторы здесь

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

shell> ПЕРЕМЕННАЯ=значение некая_команда

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

shell> setenv ПЕРЕМЕННАЯ значение
shell> некая_команда

Часто в командах имена баз данных, таблиц, столбцов следует заменять конкретными значениями. Чтобы показать необходимость такой замены, в данном руководстве используются выражения типа db_name (имя базы данных), table_name (имя таблицы) и col_name (имя столбца). Например, в тексте руководства может встретиться оператор, подобный следующему:

mysql> SELECT col_name FROM db_name.table_name;

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

mysql> SELECT author_name FROM biblio_db.author_list;

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

Для представления необязательных слов и выражений в синтаксических описаниях используются квадратные скобки (`[' и `]'). Например, в приведенном ниже операторе выражение IF EXISTS является необязательным:

DROP TABLE [IF EXISTS] имя_таблицы

Если элемент синтаксиса состоит из ряда альтернативных элементов, последние отделяются друг от друга вертикальными чертами (`|' ). В случае, когда может быть выбран один элемент из такого ряда, альтернативные элементы заключаются в квадратные скобки (`[' и `]'):

TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)

В случае, когда должен быть выбран один элемент из такого ряда, альтернативные элементы заключаются в фигурные скобки (`{' и `}'):

{DESCRIBE | DESC } имя_таблицы {имя_столбца | wild}

1.3 О русском переводе руководства

Русский перевод документации на ПО СУБД MySQL выполнен в 2002-2003гг. компанией Ensita.NET (http://www.ensita.net/).

Переводчики: (в алфавитном порядке) Василюк Елена, Добродеев Сергей, Закиянов Денис, Коротун Юрий, Пономарев Алексей, Ченцов Алексей; а также Жданов Сергей (раздел "Интерфейс DBI").

Научная редакция: Егор Егоров, Людмила Мезенко, Виктория Резниченко.

Литературный редактор: Людмила Мезенко (the best!)

Главный редактор перевода: Егор Егоров

Все замечания по русской документации направляйте по адресу docs-team@ensita.net.

* * * * *

Компания Ensita.NET (http://www.ensita.net/), являясь официальным партнером MySQL AB с января 2002г. консультирует пользователей ПО СУБД MySQL по всему миру, поддерживая список рассылки mysql@lists.mysql.com (see section 1.8.1.1 Списки рассылки MySQL).

Ensita.NET с 1999г. занимается разработкой программного обеспечения для веб-сайтов, обслуживанием СУБД и консалтингом.

1.3.1 Список терминов, принятых в русском переводе

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

Для ясности понимания мы включаем в документацию список принятых в этом переводе терминов.

Термин Значение
account аккаунт, учетная запись
ACL списки контроля доступа
banner баннер
benchmark page страничка тестов производительности
Berkeley-style copyright лицензия наподобие Berkeley
binary release, binary distribution бинарная поставка, двоичная поставка
cache кэш
case sensitive чувствительный к регистру, регистро-зависимый
change history история изменений
charset набор символов, кодировка
client/server клиент-серверный
command-line tool утилита командной строки
commit принять; commit transaction - принять транзакцию
communication protocol коммуникационный протокол
contact form форма. fill in the contact form - заполните форму
data dir каталог с данными
datadir, data dir каталог datadir, каталог данных
date type тип даты
DBA администратор (физическое лицо)
dbms см. rdbms
ddos distributed dos - распределенная атака создания отказа в обслуживании
denial of service отказ в обслуживании
deployment распространение
distribution поставка, дистрибутив
distributor производитель
dos см. denial of service
embedded встраиваемый. Не "встроенный"
environment variables переменные окружения
escape chars символы экранирования
escaped chars экранированные символы
extended regular expression расширенное регулярное выражение
fail-safe отказобезопасный
feature возможность, особенность
firewall брандмауэр
flush сброс, очистка, перегрузка
foreign key constraint ограничения внешних ключей
full precision полная точность
full-text полнотекстовый
grant tables таблицы привилегий
grants привилегии
group группа, группировка
group functions групповые функции, операции группировки данных, операции над групповыми данными
host удаленный компьютер
inserting data добавление, вставка данных
join связь
join optimizer оптимизатор связей
key cache кэш ключей
large-scale широкомасштабный
license лицензция
link линкование (в контексте линкования компиляции программ)
localhost, local host локальный хост, локальный компьютер
locking блокировка
log журнал
log position точка положения в журнале репликации
login см. account
login shell первая оболочка входа (login shell)
master (репликация) головной сервер
miscellaneous разнообразный
multi-byte мультибайтный
multi-layered многоуровневый
multithread многопоточный
mysql server MySQL или сервер
mysql user пользователь MySQL
non-updating queries запросы, не изменяющие информацию
null null
open source система с открытым кодом (open source)
optional опциональный
parser синтаксический анализатор
patch патч
port listening слушание порта, слушать порт, ожидать соединение на порту
privacy конфиденциальность
privilege привилегии
qualifier определитель
qualify определять
rdbms система управления реляционными базами данных
reference manual справочник, руководство
regular client обычный клиент
regular expression регулярное выражение; extended - расширенное р.в.
released under gpl выпущено под лицензией GPL
replica (server) сервер с копиями
robustness надежность, отказоустойчивость
rollback откат
rotation ротация
row-level locking строчная блокировка
scope контекст
script сценарий, скрипт
security безопасность
security issues вопросы безопасности
SET множество
silent молчаливо
slave (репликация) подчиненный сервер
snapshop образ, снимок
socket сокет
ssh port-forwarding пересылка по SSH (SSH port-forwarding)
SSL connections SSL-соединения
sticky прилипчив
superuser суперпользователь
symbol table см. charset
symbol value строкое значение
symlink символическая ссылка
table handler обработчик таблиц
thread поток
time stamp временная метка
timestamp тип данных временной метки
TODO-list список задач к выполнению
track последовательность, протокол
transactional транзакционный
trick трюк, хитрость
unix socket, unix domain socket unix-сокет
up-to-date своевременный
utilities инструментальные программы
vendor поставщик
verbose расширенный режим вывода сообщений
voting algorithm алгоритм голосования
warning предупреждение
wildcard шаблон, шаблонные символы
wrapper оболочка

1.4 Что представляет собой MySQL?

Разработку и сопровождение MySQL, самой популярной SQL-базы данных с открытым кодом, осуществляет компания MySQL AB. MySQL AB - коммерческая компания, основанная разработчиками MySQL, строящая свой бизнес, предоставляя различные сервисы для СУБД MySQL. See section 1.5 Что представляет собой компания MySQL AB?.

На веб-сайте MySQL (http://www.mysql.com/) представлена самая свежая информация о программном обеспечении MySQL и о компании MySQL AB.

MySQL - это система управления базами данных.
База данных представляет собой структурированную совокупность данных. Эти данные могут быть любыми - от простого списка предстоящих покупок до перечня экспонатов картинной галереи или огромного количества информации в корпоративной сети. Для записи, выборки и обработки данных, хранящихся в компьютерной базе данных, необходима система управления базой данных, каковой и является ПО MySQL. Поскольку компьютеры замечательно справляются с обработкой больших объемов данных, управление базами данных играет центральную роль в вычислениях. Реализовано такое управление может быть по-разному - как в виде отдельных утилит, так и в виде кода, входящего в состав других приложений.
MySQL - это система управления реляционными базами данных.
В реляционной базе данных данные хранятся не все скопом, а в отдельных таблицах, благодаря чему достигается выигрыш в скорости и гибкости. Таблицы связываются между собой при помощи отношений, благодаря чему обеспечивается возможность объединять при выполнении запроса данные из нескольких таблиц. SQL как часть системы MySQL можно охарактеризовать как язык структурированных запросов плюс наиболее распространенный стандартный язык, используемый для доступа к базам данных.
Программное обеспечение MySQL - это ПО с открытым кодом.
ПО с открытым кодом означает, что применять и модифицировать его может любой желающий. Такое ПО можно получать по Internet и использовать бесплатно. При этом каждый пользователь может изучить исходный код и изменить его в соответствии со своими потребностями. Использование программного обеспечения MySQL регламентируется лицензией GPL (GNU General Public License), http://www.gnu.org/licenses/, в которой указано, что можно и чего нельзя делать с этим программным обеспечением в различных ситуациях. Если работа в рамках GPL вас не устраивает или планируется встраивание MySQL-кода в коммерческое приложение, есть возможность купить коммерческую лицензированную версию у компании MySQL AB. See section 1.6.3 Лицензии на ПО MySQL.
В каких случаях следует отдавать предпочтение СУБД MySQL?
MySQL является очень быстрым, надежным и легким в использовании. Если вам требуются именно эти качества, попробуйте поработать с данным сервером. MySQL обладает также рядом удобных возможностей, разработанных в тесном контакте с пользователями. Сравнительные характеристики MySQL и других средств управления базами данных приведены на нашей странице тестов производительности (see section 5.1.4 Набор тестов MySQL (The MySQL Benchmark Suite)). Первоначально сервер MySQL разрабатывался для управления большими базами данных с целью обеспечить более высокую скорость работы по сравнению с существующими на тот момент аналогами. И вот уже в течение нескольких лет данный сервер успешно используется в условиях промышленной эксплуатации с высокими требованиями. Несмотря на то что MySQL постоянно совершенствуется, он уже сегодня обеспечивает широкий спектр полезных функций. Благодаря своей доступности, скорости и безопасности MySQL очень хорошо подходит для доступа к базам данных по Internet.
Технические возможности СУБД MySQL
Более детальную информацию по техническим возможностям MySQL можно получить в разделе section 6 Справочник по языку MySQL. ПО MySQL является системой клиент-сервер, которая содержит многопоточный SQL-сервер, обеспечивающий поддержку различных вычислительных машин баз данных, а также несколько различных клиентских программ и библиотек, средства администрирования и широкий спектр программных интерфейсов (API). Мы также поставляем сервер MySQL в виде многопоточной библиотеки, которую можно подключить к пользовательскому приложению и получить компактный, более быстрый и легкий в управлении продукт.
Доступно также большое количество программного обеспечения MySQL,
разработанного сторонними разработчиками. Вполне возможно, что СУБД MySQL уже поддерживается вашим любимым приложением или языком.

MySQL правильно произносится как ''Май Эс Кью Эль'' (а не ''майсиквел''), хотя никто не запрещает вам произносить эту аббревиатуру как ``майсиквел'' или еще каким-либо образом.

1.4.1 История MySQL

В один прекрасный день мы решили применить mSQL для доступа к нашим таблицам, для которых использовались собственные быстрые (ISAM) подпрограммы низкого уровня. Однако после тестирования мы пришли к заключению, что для наших целей скорость и гибкость mSQL недостаточны. В результате для базы данных был разработан новый SQL-интерфейс, но почти с тем же API-интерфейсом, что и mSQL. Этот API мы выбрали, чтобы упростить перенос на код сторонних разработчиков.

Происхождение имени MySQL не совсем ясно. Уже около 10 лет наша основная директория и большое количество библиотек и инструментария имеют префикс `my'. Более того, дочь Монти (она несколькими годами моложе) тоже получила имя My! Что из этих двух факторов повлияло на имя - до сих пор остается загадкой, даже для разработчиков.

1.4.2 Основные возможности MySQL

Ниже приведено описание важных характеристик программного обеспечения MySQL. See section 1.7 Кратко о MySQL 4.x.

Внутренние характеристики и переносимость
Типы столбцов
Команды и функции
Безопасность
Масштабируемость и ограничения
Установка соединений
Локализация
Клиенты и инструментарий

1.4.3 Насколько стабильным является MySQL?

Этот раздел дает ответ на следующие вопросы ''Насколько стабильным является MySQL?'' и ''Могу ли я положиться на MySQL в своем проекте?'' Мы попытаемся внести ясность в эти проблемы, а также ответить на некоторые важные вопросы, которые имеют значение для многих потенциальных пользователей. Информация данного раздела базируется на данных из списка рассылки, - наши пользователи очень активно сообщают нам о выявленных проблемах и о своем опыте использования нашего ПО.

Самые первые версии кода были созданы в начале 80-х. Это был устойчивый код с форматом таблиц ISAM, обеспечивающим обратную совместимость с предыдущими версиями. Во времена компании TcX, предшественника MySQL AB, с середины 1986 года код MySQL работал в проектах без каких-либо проблем. Но когда сервер MySQL был выпущен для широкого использования, оказалось, что существует несколько фрагментов ``непротестированного кода''. Эти фрагменты были быстро обнаружены новыми пользователями, которые составляли запросы в несколько ином виде, чем мы.

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

Каждый релиз MySQL был рабочим, проблемы возникали только при использовании кода из ``серых зон''. Естественно, что новые пользователи не знают о том, где находятся такие ``серые зоны''; в данном разделе сделана попытка описать те из них, которые известны на данный момент. Большая часть описания относится к версии 3.23 MySQL-сервера. В самой последней версии все известные ошибки устранены, за исключением тех, которые перечислены в разделе ошибок, а также конструктивных дефектов. See section 1.9.5 Известные ошибки и недостатки проектирования в MySQL.

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

Репликация - Gamma
Большие серверные кластеры, в которых применяется репликация, находятся в промышленной эксплуатации и показывают хорошие результаты. Работа над средствами репликации в MySQL 4.x продолжается.
InnoDB-таблицы - стабильно (в 3.23 с 3.23.49)
Обработчик транзакционных InnoDB-таблиц объявлен в настоящее время стабильными в дереве MySQL 3.23, начиная с версии 3.23.49. InnoDB используется в больших промышленных системах с большой нагрузкой.
BDB-таблицы - Gamma
Код Berkeley DB очень устойчив, но на настоящий момент продолжается усовершенствование интерфейса обработчика транзакционных BDB-таблиц с MySQL, поэтому должно пройти некоторое время, пока он будет так же хорошо протестирован, как и таблицы других типов.
Полнотекстовый поиск - Beta
Полнотекстовый поиск работает, но широко не используется. В версии MySQL 4.0 реализованы существенные улучшения данной возможности.
MyODBC 2.50 (использующий ODBC SDK 2.5) - Gamma
Чрезвычайно широко используется. Как оказалось, некоторые из возникших проблем являются зависящими от приложения, а не от ODBC-драйвера или сервера баз данных.
Aвтоматическое восстановление MyISAM-таблиц - Gamma
Статус Gamma относится только к новому коду в обработчике таблиц, который проверяет правильность закрытия таблицы после ее открытия и выполняет автоматическую проверку/восстановление незакрытой таблицы.
Вставка больших объемов данных - Alpha
Новая возможность в MyISAM-таблицах в MySQL 4.0 для быстрой вставки большого количества строк.
Блокировка - Gamma
В большой степени зависит от системы. В некоторых системах возникают большие проблемы с использованием стандартной для ОС блокировки (fcntl()). В таких случаях следует запустить демон mysqld с флагом --skip-external-locking. Известно, что проблемы имеют место в некоторых системах Linux и в SunOS, когда используются NFS-монтированные файловые системы.

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

1.4.4 Насколько большими могут быть таблицы в MySQL?

MySQL версии 3.22 имеет предел по размеру таблиц 4 Гб. В MySQL версии 3.23, где используется новый тип таблиц, максимальный размер таблицы доведен до 8 миллионов терабайтов (2 ^ 63 bytes).

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

Операционная система Ограничения на размеры файла
32-разрядная Linux-Intel 2Гб, 4Гб и более, в зависимости от версии Linux
Linux-Alpha 8T (?)
Solaris 2.5.1 2 Гб (с патчем возможно 4Гб)
Solaris 2.6 4Гб (может быть изменено при помощи указания флага)
Solaris 2.7 Intel 4 Гб
Solaris 2.7 UltraSPARC 512 Гб

В Linux 2.2 существует возможность создавать таблицы с размерами более 2 Гб, используя патч LFS для файловой системы ext2. Существуют также патчи, обеспечивающие поддержку больших файлов для ReiserFS в Linux 2.4.

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

По умолчанию MySQL-таблицы имеют максимальный размер около 4 Гб. Для любой таблицы можно проверить/определить ее максимальный размер с помощью команд SHOW TABLE STATUS или myisamchk -dv table_name. See section 4.5.6 Синтаксис команды SHOW.

Если необходимы таблицы большего размера, чем 4 Гб (и используемая операционная система ``не возражает''), следует при создании такой таблицы задать параметры AVG_ROW_LENGTH и MAX_ROWS (see section 6.5.3 Синтаксис оператора CREATE TABLE). Эти параметры можно задать и позже - с помощью ALTER TABLE (see section 6.5.4 Синтаксис оператора ALTER TABLE).

Если большая таблица предназначена только для чтения, можно воспользоваться myisampack, чтобы слить несколько таблиц в одну и сжать ее. Обычно myisampack ужимает таблицу по крайней мере на 50%, поэтому в результате можно получить очень большие таблицы (see section 4.7.4 myisampack, MySQL-генератор сжатых таблиц (только для чтения)).

Есть еще одна возможность обойти ограничения операционной системы на размеры файлов данных MyISAM, - это делается при помощи опции RAID (see section 6.5.3 Синтаксис оператора CREATE TABLE).

Еще одним решением может быть использование функции MERGE, которая обеспечивает возможность обрабатывать набор идентичных таблиц как одну таблицу (see section 7.2 Таблицы MERGE).

1.4.5 Вопросы, связанные с Проблемой-2000

Сам MySQL не имеет проблем, связанных с Проблемой-2000 (Y2K):

Проблемы, связанные с 2000-м годом, могут возникнуть в приложениях, которые используют MySQL так, что это может оказаться небезопасным с точки зрения Y2K. Например, во многих старых приложениях для хранения и обработки значений годов используются 2-значные величины (которые можно трактовать неоднозначно), а не 4-значные. Эта проблема может быть урегулирована при помощи приложений, которые используют 00 или 99 как ``отсутствующие'' индикаторы значений.

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

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

mysql> DROP TABLE IF EXISTS y2k;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE y2k (date DATE,
    -> date_time DATETIME,
    -> time_stamp TIMESTAMP);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO y2k VALUES
    -> ("1998-12-31","1998-12-31 23:59:59",19981231235959),
    -> ("1999-01-01","1999-01-01 00:00:00",19990101000000),
    -> ("1999-09-09","1999-09-09 23:59:59",19990909235959),
    -> ("2000-01-01","2000-01-01 00:00:00",20000101000000),
    -> ("2000-02-28","2000-02-28 00:00:00",20000228000000),
    -> ("2000-02-29","2000-02-29 00:00:00",20000229000000),
    -> ("2000-03-01","2000-03-01 00:00:00",20000301000000),
    -> ("2000-12-31","2000-12-31 23:59:59",20001231235959),
    -> ("2001-01-01","2001-01-01 00:00:00",20010101000000),
    -> ("2004-12-31","2004-12-31 23:59:59",20041231235959),
    -> ("2005-01-01","2005-01-01 00:00:00",20050101000000),
    -> ("2030-01-01","2030-01-01 00:00:00",20300101000000),
    -> ("2050-01-01","2050-01-01 00:00:00",20500101000000);
Query OK, 13 rows affected (0.01 sec)
Records: 13 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM y2k;
+------------+---------------------+----------------+
| date | date_time | time_stamp |
+------------+---------------------+----------------+
| 1998-12-31 | 1998-12-31 23:59:59 | 19981231235959 |
| 1999-01-01 | 1999-01-01 00:00:00 | 19990101000000 |
| 1999-09-09 | 1999-09-09 23:59:59 | 19990909235959 |
| 2000-01-01 | 2000-01-01 00:00:00 | 20000101000000 |
| 2000-02-28 | 2000-02-28 00:00:00 | 20000228000000 |
| 2000-02-29 | 2000-02-29 00:00:00 | 20000229000000 |
| 2000-03-01 | 2000-03-01 00:00:00 | 20000301000000 |
| 2000-12-31 | 2000-12-31 23:59:59 | 20001231235959 |
| 2001-01-01 | 2001-01-01 00:00:00 | 20010101000000 |
| 2004-12-31 | 2004-12-31 23:59:59 | 20041231235959 |
| 2005-01-01 | 2005-01-01 00:00:00 | 20050101000000 |
| 2030-01-01 | 2030-01-01 00:00:00 | 20300101000000 |
| 2050-01-01 | 2050-01-01 00:00:00 | 00000000000000 |
+------------+---------------------+----------------+
13 rows in set (0.00 sec)

Можно видеть, что при использовании типов DATE и DATETIME проблем с датами будущего не возникнет (эти типы ``справляются'' с датами вплоть до 9999 года).

Тип TIMESTAMP, который используется для сохранения текущего времени, имеет диапазон только до 2030-01-01. В 32-разрядных машинах TIMESTAMP тип имеет диапазон от 1970 до 2030 (значение со знаком). В 64-разрядных машинах этот тип ``справляется'' со значениями времени до 2106 года (значение без знака).

Таким образом, даже несмотря на то, что MySQL является Y2K-совместимым, ответственность за однозначную интерпретацию значений даты ложится на плечи пользователя. See section 6.2.2.1 Проблема 2000 года и типы данных, где приведены правила по работе MySQL с входными данными, которые имеют неоднозначные значения даты (данные, содержащие 2-значные значения года).

1.5 Что представляет собой компания MySQL AB?

MySQL AB - компания, в состав которой входят основатели MySQL и основные разработчики. MySQL AB создана в Швеции Дэвидом Аксмарком (David Axmark), Аланом Ларссом (Allan Larsson) и Майклом Монти Видениусом (Michael Monty Widenius).

Все разработчики сервера MySQL - штатные сотрудники компании. MySQL AB - виртуальная компания, состоящая из сотрудников, живущих в десятках стран по всему миру. Мы каждый день общаемся по Сети друг с другом, а также с нашими партнерами и пользователями.

Наша компания занимается разработкой и распространением СУБД MySQL и сопутствующего ПО. MySQL AB владеет всеми правами на исходный код MySQL, на логотип и торговую марку MySQL, а также на данное руководство (see section 1.4 Что представляет собой MySQL?).

Наши основные ценности - это то, что наша деятельность посвящена MySQL и идеям Open Source, открытого программного обеспечения.

Мы хотим, чтобы сервер MySQL соответствовал следующим критериям:

MySQL AB и люди, работающие в MySQL AB:

Свежая информация о MySQL и MySQL AB находится на сайте MySQL (http://www.mysql.com/).

1.5.1 Бизнес-модель и услуги, оказываемые компанией MySQL AB

Очень часто нам задают такой вопрос: ''Как вам удается зарабатывать на жизнь, ведь вы все раздаете бесплатно?''

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

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

1.5.1.1 Поддержка

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

Майкл Монти Вайдиниус (Michael Monty Widenius), главный автор MySQL Server. See section 1.6.1 Поддержка, предлагаемая компанией MySQL AB.

Для более подробной информации и заказа различных уровней поддержки обратитесь на веб-сайт https://order.mysql.com/ или свяжитесь с нашим отделом сбыта по адресу sales@mysql.com.

1.5.1.2 Обучение и сертификация

Компания MySQL AB проводит обучение по MySQL и другим смежным продуктам по всему миру. Мы предлагаем как общедоступные, так и внутрифирменные курсы, подготовленные в соответствии с конкретными потребностями вашей компании. Обучение по MySQL проводят также наши партнеры - авторизованные центры обучения по MySQL.

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

Обучение на наших курсах позволит вам достичь целей, которые вы ставите перед собой при создании своих MySQL-приложений. Помимо этого вы:

Если предлагаемое нами обучение интересует вас как потенциального участника нашего проекта или партнера в реализации учебных курсов, посетите учебный раздел на нашем веб-сайте http://www.mysql.com/training/ или свяжитесь с нами по адресу: training@mysql.com.

Для более подробной информации о программе сертификации MySQL, см. http://www.mysql.com/certification/.

1.5.1.3 Консультации

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

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

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

Заинтересованных в наших консультационных услугах, а также тех, кто хотели бы стать нашими партнерами в оказании таких услуг, приглашаем посетить консультационный раздел на нашем веб-сайте http://www.mysql.com/consulting/ или связаться с нашим консультационным отделом по адресу consulting@mysql.com.

1.5.1.4 Коммерческие лицензии

ПО баз данных MySQL выпускается по общедоступной лицензии GNU General Public License (GPL). Это означает, что при соблюдении условий GPL ПО MySQL можно пользоваться бесплатно. Если вы не хотите связывать себя лицензионными ограничениями GPL (например, вас не устраивает условие, что ваше собственное приложение также подпадает под действие GPL), есть возможность приобрести у компании MySQL AB на этот же продукт коммерческую лицензию.

См. https://order.mysql.com/).

Компания MySQL AB владеет авторскими правами на исходный код MySQL, поэтому мы вправе использовать двойное лицензирование, в соответствии с которым один и тот же продукт доступен как по лицензии GPL, так и по коммерческой лицензии, и это никоим образом не нарушает обязательств компании MySQL AB по предоставлению исходного кода. Более подробную информацию о том, в каких случаях необходимо приобретение коммерческой лицензии, вы найдете в разделе section 1.6.3 Лицензии на ПО MySQL.

Компания MySQL AB занимается также продажей коммерческих лицензий на ПО сторонних разработчиков, предоставляемое с открытым исходным кодом на условиях GPL. Это ПО расширяет возможности MySQL. Хороший пример - транзакционный обработчик таблиц InnoDB, обеспечивающий поддержку технологии ACID, строковую блокировку, восстановление системы после аварии, управление версиями, поддержку внешних ключей и многое другое (see section 7.5 Таблицы InnoDB).

1.5.1.5 О нашей программе партнерства

Компания MySQL AB реализует глобальную программу партнерства, которая охватывает учебные курсы, консультативные услуги и поддержку продукта, издательскую деятельность, а также продажу и распространение MySQL и смежных продуктов. Партнеры компании MySQL AB получают право быть представленными на веб-сайте http://www.mysql.com/ и использовать в маркировке своих продуктов специальные варианты торговой марки MySQL - с целью идентификации и продвижения этих продуктов на рынке.

Тех, кто заинтересован в получении статуса партнера MySQL, просим обращаться по адресу partner@mysql.com.

Название MySQL и логотип MySQL в виде дельфина являются торговыми марками компании MySQL AB (see section 1.6.4 Логотипы и торговые марки MySQL AB), принадлежащими компании MySQL AB. Узнаваемость этих торговых марок свидетельствует о том, что за годы своей работы основатели компании MySQL AB сумели добиться для своей компании заметного положения и признания в мире.

1.5.1.6 О рекламе

Веб-сайт компании MySQL (http://www.mysql.com/) пользуется популярностью среди разработчиков и пользователей. Например, в октябре 2001 г. мы обслужили 10 миллионов запросов на просмотр размещенных на нем страниц. Наши посетители относятся к категории лиц, принимающих решения и дающих рекомендации о покупке как программного, так и аппаратного обеспечения. 12% наших посетителей утверждают решения о приобретении, и только 9% наших посетителей совсем не имеют отношения к принятию подобных решений. Более 65% наших посетителей сделали в деловых целях как минимум одну покупку в Сети за последние полгода, а 70% - планируют совершить ее в ближайшие месяцы.

1.5.2 Как с нами связаться

Самая свежая информация о MySQL и нашей компании представлена на веб-сайте MySQL (http://www.mysql.com/).

По вопросам связи с прессой и темам, не затронутым в наших сообщениях для печати (http://www.mysql.com/news/), обращайтесь по адресу press@mysql.com.

Для получения своевременных и точных ответов на технические вопросы, касающиеся ПО MySQL, необходимо иметь действующий контракт с компанией MySQL AB по поддержке (за дополнительной информацией обращайтесь к разделу section 1.6.1 Поддержка, предлагаемая компанией MySQL AB). Чтобы заказать контракт по поддержке, следует обратиться на сайт https://order.mysql.com/ или направить сообщение по адресу sales@mysql.com.

Для получения информации об учебных курсах, которые проводит компания MySQL AB, посетите раздел по обучению на веб-сайте http://www.mysql.com/training/. Тех, кто имеет ограниченный доступ в Internet, просим связаться с учебным отделом компании MySQL AB по адресу training@mysql.com (see section 1.5.1.2 Обучение и сертификация).

Информацию о программе сертификации компании MySQL AB вы найдете на странице http://www.mysql.com/certification/index.html нашего веб-сайта. Если вы желаете быть в курсе текущего состояния программы сертификации по MySQL, просим сообщить об этом по адресу certification@mysql.com. See section 1.5.1.2 Обучение и сертификация.

Заинтересованных в получении консультаций приглашаем посетить раздел консультаций на веб-сайте http://www.mysql.com/consulting/. Тех, у кого имеется ограниченный доступ в Internet, просим связаться с консультационным отделом компании MySQL AB по адресу consulting@mysql.com. Обращайтесь к разделу section 1.5.1.3 Консультации.

Коммерческие лицензии можно приобрести по Сети, на веб-сайте https://order.mysql.com/. Здесь вы найдете также информацию о том, как передать в компанию MySQL AB свой заказ на покупку по факсу. Более подробная информация о лицензировании доступна на http://www.mysql.com/products/pricing.html.

Если у вас имеются вопросы, касающиеся лицензирования, или вы хотите знать расценки на лицензии в случае массового выпуска продукта, заполните форму на нашем веб-сайте (http://www.mysql.com/) или пошлите сообщение по электронной почте: вопросы, касающиеся лицензирования, направляйте по адресу licensing@mysql.com, а запросы на покупку - по адресу sales@mysql.com. Обращайтесь также к разделу section 1.6.3 Лицензии на ПО MySQL.

Если вы представляете деловые круги, заинтересованные в партнерских отношениях с компанией MySQL AB, напишите нам по адресу partner@mysql.com. Обращайтесь к разделу section 1.5.1.5 О нашей программе партнерства.

Для получения дополнительной информации о политике компании MySQL в отношении торговых марок обращайтесь на наш веб-сайт http://www.mysql.com/company/trademark.html или напишите письмо по адресу trademark@mysql.com. Обратитесь к разделу section 1.6.4 Логотипы и торговые марки MySQL AB.

Если вас заинтересовало какое-либо из предложений, перечисленных в нашем разделе предложений работы (http://www.mysql.com/company/jobs/), направляйте свои письма по адресу jobs@mysql.com. Просьба не оформлять свои личные данные в виде вложения в письмо: лучше добавьте эту информацию в виде обычного текста в конце своего сообщения.

Если вы желаете принять участие в общей дискуссии с нашими многочисленными пользователями, обращайтесь на соответствующий список рассылки (see section 1.8.1 Списки рассылки MySQL).

Сообщения об ошибках (или bugs), а также вопросы и комментарии следует направлять в список рассылки по адресу mysql@lists.mysql.com. При обнаружении в MySQL ошибок, влияющих на безопасность баз данных, просим сообщать об этом по адресу security@mysql.com. Обратитесь также к разделу section 1.8.1.3 Как отправлять отчеты об ошибках или проблемах.

Если у вас имеются сравнительные результаты тестирования, которые мы можем опубликовать, свяжитесь с нами по адресу benchmarks@mysql.com.

Предложения по внесению дополнений или исправлений в данное руководство пользователя следует направлять коллективу разработчиков руководства по адресу docs@mysql.com.

Вопросы и замечания по работе или содержанию веб-сайта MySQL (http://www.mysql.com/) направляйте по адресу webmaster@mysql.com.

Компания MySQL AB придерживается определенной политики относительно конфиденциальности информации. Об этом вы можете прочитать на странице http://www.mysql.com/company/privacy.html нашего веб-сайта. По вопросам этой политики просим обращаться по адресу privacy@mysql.com.

По всем другим вопросам обращайтесь по адресу info@mysql.com.

1.6 Лицензии и поддержка MySQL

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

1.6.1 Поддержка, предлагаемая компанией MySQL AB

Что подразумевается под технической поддержкой компании MySQL AB? Это означает, что на каждый свой вопрос вы получите адресованный лично вам ответ непосредственно от программистов, пишущих программы баз данных MySQL.

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

Подробная информация о различных видах поддержки, которую предлагает компания, приведена на веб-сайте http://www.mysql.com/support/. Там же вы можете заказать по Сети контракты по поддержке. Те, кто имеет ограниченный доступ в Internet, могут связаться с нашим отделом сбыта по адресу sales@mysql.com.

Техническая поддержка - это своего рода страхование жизни. Без такой страховки можно успешно обходиться долгие годы, но наступит критический момент - и придется сожалеть о своей беспечности! Если вы используете сервер MySQL для важных приложений и внезапно сталкиваетесь с неполадками в их работе, может оказаться, что на самостоятельное выяснение ответов на все вопросы потребуется слишком много времени. В таких случаях не обойтись без срочной помощи самых опытных специалистов по устранению аварийных ситуаций в MySQL, а они работают именно в компании MySQL AB.

1.6.2 Авторские права и лицензии на MySQL

Компания MySQL AB является владельцем авторских прав на исходный код ПО MySQL, логотипы и торговые марки MySQL, а также на данное руководство пользователя. Обратитесь к разделу section 1.5 Что представляет собой компания MySQL AB? Распространение MySQL подпадает под действие нескольких различных лицензий:

  1. Весь код ПО сервера, специфичный только для MySQL, библиотека mysqlclient и клиентское ПО, а также библиотека GNU readline подпадают под действие общедоступной лицензиии GNU General Public License (see section H GNU General Public License). Текст этой лицензии имеется также в составе дистрибутива ПО, в файле `COPYING'.
  2. Библиотека GNU getopt подпадает под действие GNU Lesser General Public License (see section I GNU Lesser General Public License).
  3. Некоторые фрагменты исходного кода (библиотека regexp) подпадают под действие Berkeley-подобной лицензии.
  4. Старые версии MySQL (3.22 и более ранние) подпадают под действие более строгой лицензии (http://www.mysql.com/products/mypl.html). Информация об условиях лицензии имеется в документации на конкретную версию.
  5. Распространение руководства пользователя в данное время не подпадает под действие лицензии типа GPL. Его использование допускается на следующих условиях: Для получения дополнительной информации или в случае, если вы хотели бы принять участие в переводе руководства, обращайтесь по адресу docs@mysql.com.

Дополнительная информация о том, как практически осуществляется лицензирование MySQL, находится в разделе section 1.6.3 Лицензии на ПО MySQL. Обращайтесь также к разделу section 1.6.4 Логотипы и торговые марки MySQL AB.

1.6.3 Лицензии на ПО MySQL

ПО MySQL распространяется в соответствии с условиями общедоступной лицензии GNU General Public License (GPL), которая является одной из наиболее широко распространенных лицензий на ПО с открытым исходным кодом. Официальные условия лицензии GPL вы найдете на веб-сайте http://www.gnu.org/licenses/. Обратитесь также к http://www.gnu.org/licenses/gpl-faq.html и http://www.gnu.org/philosophy/enforcing-gpl.html.

Так как ПО MySQL выпускается по лицензии GPL, зачастую им можно пользоваться бесплатно, но в некоторых случаях желательно или необходимо приобрести коммерческую лицензию у компании MySQL AB (это можно сделать на веб-сайте https://order.mysql.com/).

См. http://www.mysql.com/products/licensing.html для получения более подробной информации.

Старые версии MySQL (3.22 и более ранние) подпадают под действие более строгой лицензии (http://www.mysql.com/products/mypl.html). Информацию об условиях лицензии вы найдете в документации на конкретную версию.

Обращаем ваше внимание на то, что использование ПО MySQL, подпадающего под коммерческую лицензию, лицензию GPL или старую лицензию MySQL, не означает, что вы автоматически получаете право на использование торговых марок, принадлежащих компании MySQL AB. Об этом читайте в разделе section 1.6.4 Логотипы и торговые марки MySQL AB.

1.6.3.1 Использование ПО MySQL под коммерческой лицензией

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

Коммерческая лицензия является необходимой в следующих случаях:

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

По поводу коммерческих лицензий, см. http://www.mysql.com/products/licensing.html. Для контрактов на поддержку, см. http://www.mysql.com/support/. Тех, для кого требуются особые условия лицензирования, а также тех, у кого имеется ограниченный доступ в Internet, просим связаться с нашим отделом сбыта по адресу sales@mysql.com.

1.6.3.2 Бесплатное использование ПО MySQL по лицензии GPL

По лицензии GPL допускается бесплатное использование ПО MySQL если вы согласны с условиями GPL. Подробнее по поводу лицензии GPL и освещение наиболее популярных вопросов вы найдете по адресу http://www.gnu.org/licenses/gpl-faq.html.

Некоторые общие примеры GPL-использования MySQL:

В общем случае мы рекомендуем приобретать контракт на поддержку компании MySQL AB и тем, кому для использования ПО баз данных MySQL не требуется коммерческой лицензии: этим вы будете способствовать развитию технологии MySQL и заодно немедленно получите для себя дополнительные преимущества (see section 1.6.1 Поддержка, предлагаемая компанией MySQL AB).

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

1.6.4 Логотипы и торговые марки MySQL AB

Многие пользователи СУБД MySQL выражают желание расположить логотип MySQL AB с изображением дельфина на своих веб-сайтах, книгах или коробках со своими программными продуктами. Мы приветствуем это желание, хотя и обязаны напомнить, что MySQL и логотип MySQL с изображением дельфина являются торговыми марками компании MySQL AB и могут применяться только в соответствии с нашими правилами использования торговых знаков, с которыми вы можете ознакомиться по адресу http://www.mysql.com/company/trademark.html.

1.6.4.1 Оригинальный логотип MySQL

Логотип MySQL с изображением дельфина был создан финским рекламным агентством Priority в 2001 году. Мы решили сделать эмблемой СУБД MySQL дельфина - умное, проворное и изящное животное, с удивительной легкостью плавающее в океане, так же как и наша СУБД - в океане данных. К тому же дельфины нам просто нравятся.

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

1.6.4.2 Логотипы MySQL, которые могут использоваться без письменного разрешения

Мы разработали несколько специальных логотипов для договорного использования, которые можно загрузить с нашего сайта, расположенного по адресу http://www.mysql.com/press/logos.html и применять на сайтах третьих сторон без письменного разрешения MySQL AB. Возможности использования этих логотипов, как и следует из их названия, определенным образом ограничены: они регламентируются правилами применения наших торговых знаков (которые также приведены у нас на сайте). Если вы планируете использовать данные логотипы, необходимо ознакомиться с указанными правилами. Они в основном сводятся к следующим:

Связаться с нами с целью заключения соответствующих вашим потребностям соглашений можно по адресу trademark@mysql.com.

1.6.4.3 В каком случае для использования логотипов необходимо письменное разрешение?

Письменное разрешение MySQL AB для использования логотипов MySQL необходимо в следующих случаях:

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

1.6.4.4 Партнерские логотипы MySQL AB

Партнерские логотипы MySQL могут использоваться только теми компаниями и частными лицами, которые подписали письменное соглашение о партнерстве с MySQL AB. В условия подписания такового соглашения входит сертификация в качестве преподавателя или консультанта MySQL. See section 1.5.1.5 О нашей программе партнерства.

1.6.4.5 Использование слова MySQL в текстовых документах и презентациях

MySQL AB приветствует упоминания о СУБД MySQL, но не следует забывать о том, что слово MySQL - торговая марка MySQL AB. Поэтому первое встречающееся в тексте слово MySQL следует снабдить символом, обозначающим торговую марку (TM), а также (по возможности) упомянуть о том, что MySQL является зарегистрированной торговой маркой компании MySQL AB. Дополнительную информацию вы сможете получить, ознакомившись с нашими правилами использования торговых знаков, расположенными по адресу http://www.mysql.com/company/trademark.html.

1.6.4.6 Использование слова MySQL в названиях компаний и продуктов

Использовать слово MySQL в названиях компаний, продуктов или в именах доменов без письменного разрешения MySQL AB запрещено.

1.7 Кратко о MySQL 4.x

Наконец-то появилась давно обещанная компанией MySQL AB бета-версия MySQL Server 4.0, которую так долго ждали пользователи. Ее можно загрузить с веб-сайта http://www.mysql.com/ или с наших зеркал.

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

1.7.1 Поэтапный выпуск

Начиная с 4.0.6, MySQL имеет статус gamma, что означает что версии 4.0.x в течении более чем 2 месяцев (сначала в alpha-, затем и в beta-статусе) используются без каких-либо известных серьезных и сложных для исправления ошибок и готовы для промышленного использования.

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

Все новые функции будут добавляться в версию MySQL 4.1, доступную сейчас из нашего репозитория bk, выпуск alpha-версии которой запланирован на первый квартал 2003. See section 2.3.4 Установка из экспериментального набора исходных кодов.

1.7.2 Можно использовать уже прямо сейчас

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

1.7.3 Встроенный MySQL

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

Большинство пользователей libmysqld оценят преимущество Двойной лицензии MySQL. Для тех, кто не хочет связывать себя условиями GPL лицензии, программное обеспечение доступно также на условиях коммерческой лицензии. Для встроенной библиотеки MySQL используется такой же интерфейс, как и для обычной клиентской библиотеки, поэтому ею удобно и легко пользоваться. See section 8.4.9 libmysqld, встраиваемая библиотека сервера MySQL.

1.7.4 Другие функции, доступные в MySQL 4.0

1.7.5 Функции MySQL 4.x, которые будут добавлены в будущем

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

1.7.6 MySQL 4.1, следующая ветка в разработке

MySQL 4.0 готовит базу для реализации новых возможностей в сервере MySQL 4.1 и более новых версиях. Имеются в виду такие возможности, как вложенные подзапросы (nested subqueries) (4.1), хранимые процедуры (5.0) и правила целостности ссылок (foreign key integrity rules) для MyISAM-таблиц (5.0).

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

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

1.8 Источники информации по MySQL

1.8.1 Списки рассылки MySQL

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

1.8.1.1 Списки рассылки MySQL

Чтобы подписаться на главный список рассылки MySQL, следует отправить сообщение на адрес электронной почты mysql-subscribe@lists.mysql.com.

Чтобы отказаться от подписки на главный список рассылки MySQL, следует отправить сообщение на адрес электронной почты mysql-unsubscribe@lists.mysql.com.

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

Если адрес, с которого было отправлено ваше сообщение, не действителен, можно точно указать адрес для подписки или адрес, подписку для которого следует аннулировать. Для этого в указанных выше адресах электронной почты следует добавить дефис в конце командного слова, обозначающего подписку (subscribe) или отказ от нее (unsubscribe), а за ним - нужный адрес электронной почты, заменив в нем символ `@' на символ `='. Например, чтобы подписать адрес your_name@host.domain, необходимо отправить сообщение на mysql-subscribe-your_name=host.domain@lists.mysql.com.

Сообщения, посланные по адресам mysql-subscribe@lists.mysql.com или mysql-unsubscribe@lists.mysql.com, обрабатываются автоматически программой обслуживания списка рассылки ezmlm. Информация по программе ezmlm доступна на веб-узле ezmlm (http://www.ezmlm.org/).

Чтобы отправить сообщение в список рассылки, следует послать сообщение по адресу mysql@lists.mysql.com. Пожалуйста, не отправляйте сообщения о подписке или отказе от подписки на адрес mysql@lists.mysql.com, поскольку все сообщения, направленные на этот адрес, автоматически распространяются среди тысяч других подписчиков.

Если на вашем локальном веб-узле уже есть подписчики на mysql@lists.mysql.com, то на нем может существовать локальный список рассылки, поэтому сообщения, отправленные из lists.mysql.com на ваш веб-узел, будут также дублироваться в местный список. В таких случаях необходимо связаться со своим системным администратором, чтобы он добавил вас в местный список рассылки MySQL или исключил из него.

Если необходимо, чтобы сообщения, поступающие со списка рассылки, направлялись в отдельный почтовый ящик вашего почтового клиента, установите фильтр по заголовкам сообщений. Чтобы выделить сообщения из списка рассылки, можно использовать заголовки List-ID: или Delivered-To:.

Существуют следующие списки рассылки MySQL:

announce-subscribe@lists.mysql.com announce
Список для объявлений о выходах новых версий MySQL и относящихся к нему программ. Количество сообщений здесь небольшое, и на этот список желательно подписаться всем пользователям MySQL.
mysql-subscribe@lists.mysql.com mysql
Главный список для обсуждения общих вопросов по MySQL. Обратите внимание: некоторые темы лучше обсуждать в более специализированных списках. Если отправить сообщение не в тот список, то можно не получить ответа!
mysql-digest-subscribe@lists.mysql.com mysql-digest
Список mysql в виде сборника. Это означает, что вы получите все сообщения, отправленные за день, в виде одного большого почтового сообщения, которое отправляется раз в день.
bugs-subscribe@lists.mysql.com bugs
В этот список можно отправлять только подробные отчеты о повторяющихся ошибках, используя макропрограмму mysqlbug (если вы работаете в Windows, необходимо включить описание операционной системы и указать версию MySQL). Прежде чем отправлять отчет об ошибке, желательно проверить, при использовании какой версии MySQL данная ошибка возникает - последней окончательной или находящейся на стадии разработки! Чтобы любой желающий мог воспроизвести эту ошибку, желательно также включить в отчет контрольный тестовый пример, который можно было бы запустить при помощи mysql test < script. Все ошибки, сообщения о которых будут направлены в список рассылки, будут либо исправлены, либо включены в список ошибок в следующей версии MySQL! Если необходимо только небольшое изменение кода, мы также отправим исправляющую эту ошибку заплатку для программы.
bugs-digest-subscribe@lists.mysql.com bugs-digest
Список bugs в виде сборника.
internals-subscribe@lists.mysql.com internals
Список для тех, кто работает над кодом MySQL. В этом списке также можно обсуждать разработку MySQL и отправлять в него вставки в программу.
internals-digest-subscribe@lists.mysql.com internals-digest
Версия в виде сборника для списка internals.
java-subscribe@lists.mysql.com java
Обсуждение вопросов, связанных с MySQL и Java. В основном обсуждение по драйверам JDBC включая MySQL Connector/J.
java-digest-subscribe@lists.mysql.com java-digest
Версия в виде сборника для списка java.
win32-subscribe@lists.mysql.com win32
Все вопросы, касающиеся программного обеспечения MySQL в операционных системах Microsoft, таких как Windows 9x/Me/NT/2000/XP.
win32-digest-subscribe@lists.mysql.com win32-digest
Версия в виде сборника для списка win32.
myodbc-subscribe@lists.mysql.com myodbc
Все вопросы, касающиеся соединения MySQL через ODBC.
myodbc-digest-subscribe@lists.mysql.com myodbc-digest
Версия в виде сборника для списка myodbc.
mysqlcc-subscribe@lists.mysql.com mysqlcc
Все вопросы, касающиеся графического клиента MySQL Control Center (MyCC).
mysqlcc-digest-subscribe@lists.mysql.com mysqlcc-digest
Версия в виде сборника для списка mysqlcc.
plusplus-subscribe@lists.mysql.com plusplus
Все вопросы, касающиеся программирования на C++ API для MySQL.
plusplus-digest-subscribe@lists.mysql.com plusplus-digest
Версия в виде сборника для списка plusplus.
msql-mysql-modules-subscribe@lists.mysql.com msql-mysql-modules
Список по поддержке Perl для MySQL при помощи msql-mysql-modules.
msql-mysql-modules-digest-subscribe@lists.mysql.com msql-mysql-modules-digest
Версия в виде сборника для списка msql-mysql-modules.

Подписаться или отказаться от подписки на все списки рассылки можно способом, указанным выше. В своем сообщении о подписке или отказе от подписки вместо mysql просто укажите соответствующее название списка рассылки. Например, чтобы подписаться на список рассылки myodbc или отказаться от подписки на него, следует отправить сообщение по адресу myodbc-subscribe@lists.mysql.com или myodbc-unsubscribe@lists.mysql.com.

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

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

mysql-france-subscribe@yahoogroups.com Французский список рассылки
list@tinc.net Корейский список рассылки
Чтобы подписаться на этот список рассылки, отправьте сообщение subscribe mysql your@e-mail.address.
mysql-de-request@lists.4t2.com Немецкий список рассылки
Чтобы подписаться на этот список рассылки, отправьте сообщение subscribe mysql-de your@e-mail.address. Информацию по этому списку рассылки можно найти на http://www.4t2.com/mysql/.
mysql-br-request@listas.linkway.com.br Португальский список рассылки
Чтобы подписаться на этот список рассылки, отправьте сообщение subscribe mysql-br your@e-mail.address.
mysql-alta@elistas.net Испанский список рассылки
Чтобы подписаться на этот список рассылки, отправьте сообщение subscribe mysql your@e-mail.address.

1.8.1.2 Как задавать вопросы и направлять сообщения об ошибках

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

Если в руководстве или архивах не удалось найти ответ, обратитесь к локальному эксперту по MySQL. Если же и таким образом не удалось получить ответы на вопросы, переходите к следующему разделу, в котором описано, как отправлять почту на mysql@lists.mysql.com.

1.8.1.3 Как отправлять отчеты об ошибках или проблемах

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

Мы рекомендуем для создания отчетов об ошибках (или отчетов о любых проблемах), всегда, если это возможно, использовать сценарий mysqlbug. mysqlbug можно найти в каталоге `scripts' раздела распространения исходных текстов, или в разделе распространения исполняемых программ, в каталоге `bin' инсталляционного каталога MySQL. Если же не удается воспользоваться mysqlbug, то все равно необходимо указать в своем отчете все данные, перечисленные ниже в этом разделе.

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

Обычно отчеты об ошибках и проблемах направляются в mysql@lists.mysql.com. Если же вы можете создать подробное описание, четко определяющее ошибку, его можно направить в список рассылки bugs@lists.mysql.com. Обратите внимание: в этот список рассылки можно посылать только полный отчет о повторяющейся ошибке, составленный при помощи сценария mysqlbug. Если вы работаете в Windows, необходимо включить описание операционной системы и версии MySQL. Прежде чем направлять отчет, желательно проверить, проявляется ли данная проблема при использовании последней окончательной или находящейся в стадии разработки версии MySQL! Чтобы любой желающий мог воспроизвести эту ошибку, желательно также включить в отчет контрольный тестовый пример, который можно было бы запустить при помощи ``mysql test < script'', либо Perl-сценарий или сценарий оболочки, которые можно запустить непосредственно. Все ошибки, сообщения о которых будут направлены в список рассылки, будут либо исправлены, либо включены в список ошибок в следующей версии MySQL! Если необходимо только небольшое изменение кода, мы также отправим исправляющий эту ошибку патч для программы.

Если вы нашли ошибку в системе безопасности MySQL, необходимо отправить сообщение по адресу security@mysql.com.

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

Чаще всего наши корреспонденты не указывают используемую версию MySQL или платформу, на которой установлен сервер MySQL (включая версию платформы). Это довольно существенная информация, и в 99 случаях из 100 отчет об ошибке без нее будет совершенно бесполезным! Очень часто бывает и так: мы получаем вопрос типа: ''Почему это у меня не работает?'', а потом оказывается, что указанная функция в данной версии MySQL отсутствует или что ошибка, описанная в отчете, уже была исправлена в более новой версии MySQL. Иногда ошибка зависит от используемой платформы. В таких случаях практически невозможно ничего исправить, не имея информации об операционной системе и о версии платформы.

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

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

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

Если возникли проблемы с MyODBC, необходимо попытаться создать файл трассировки MyODBC. See section 8.3.7 Составление отчетов о проблемах с MyODBC.

Не забывайте, что у большинства людей, которые будут читать ваш отчет, экраны дисплеев имеют ширину в 80 символов. При создании отчетов или примеров при помощи средств командной строки mysql необходимо использовать параметр --vertical (или терминатор оператора \G) для выходных данных, которые будут превышать ширину для таких дисплеев (пример для оператора EXPLAIN SELECT приведен ниже в данном разделе).

В свой отчет вам необходимо включить следующую информацию:

Если вы пользователь, пользующийся официальной поддержкой, направьте отчет об ошибке на mysql-support@mysql.com, чтобы его рассмотрели в первую очередь, а также в соответствующий список рассылки, чтобы узнать, сталкивался ли кто-нибудь еще с этой проблемой (и, возможно, нашел решение).

Чтобы получить информацию по отчетам об ошибках в MyODBC, See section 8.3.4 Как сообщать о проблемах с MyODBC.

Решения для наиболее часто встречающихся проблем можно найти в разделе section A Проблемы и распространенные ошибки.

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

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

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

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

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

1.8.2 Пользователи MySQL на IRC

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

Вот сети/каналы, известные нам на данный момент:

Мы можем рекомендовать вам X-Chat для подключения к IRC-сети. X-Chat доступен как для Unix, так и для Windows по адресу: http://www.xchat.org/.

1.9 Насколько MySQL соответствует стандартам?

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

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

Одним из главных направлений разработки данного продукта является продолжение работы в области соответствия его стандартам ANSI 99, но не за счет ущерба для скорости или надежности. Мы без опаски добавляем к серверу MySQL расширения к SQL или поддержку не предусмотренных в SQL возможностей, если это заметно увеличивает удобство его использования для значительной части наших пользователей (одним из примеров такой стратегии является новый интерфейс HANDLER в версии сервера MySQL 4.0; see section 6.4.2 Синтаксис оператора HANDLER).

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

С самого начала сервер MySQL был спроектирован для работы с базами данных среднего размера (10-100 миллионов строк или около 100 MB на таблицу) на малых вычислительных системах. Мы будем продолжать расширять сервер MySQL для работы с базами данных с размерами даже больше терабайта, и наряду с этим - предоставлять возможность компиляции упрощенной версии MySQL, которая больше подходит для портативных устройств и встраивания. Благодаря компоновочной схеме сервера MySQL оба эти направления возможны без каких-либо конфликтов в дереве исходных кодов.

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

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

1.9.1 Каким стандартам соответствует MySQL ?

Начальный уровень SQL92. Для ODBC уровни 0-3.51.

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

1.9.2 Запуск MySQL в режиме ANSI

При запуске mysqld с опцией --ansi поведение сервера MySQL изменяется следующим образом:

Использование данной опции равносильно применению --sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES, IGNORE_SPACE,SERIALIZE,ONLY_FULL_GROUP_BY.

1.9.3 Расширения MySQL к ANSI SQL92

Сервер MySQL включает в себя ряд расширений, которые могут отсутствовать в других базах данных SQL. Если вы их используете, то следует иметь в виду, что такой код не будет переносимым на другие SQL-серверы. В некоторых случаях можно написать код, включающий расширения MySQL, но, тем не менее, являющийся переносимым, воспользовавшись комментариями вида /*! ... */. В этом случае сервер MySQL будет анализировать и выполнять данный код внутри этого комментария как обычную команду MySQL, в то время как другие SQL-серверы будут игнорировать данное расширение. Например:

SELECT /*! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ...

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

CREATE /*!32302 TEMPORARY */ TABLE t (a int);

Это означает, что при наличии версии 3.23.02 или выше сервер MySQL будет использовать ключевое слово TEMPORARY.

Ниже приводится перечень расширений MySQL:

1.9.4 Отличия MySQL от ANSI SQL92

Наши усилия направлены на то, чтобы сервер MySQL соответствовал стандартам ANSI SQL и ODBC SQL, но в некоторых случаях сервер MySQL функционирует по-другому. Ниже приведен перечень таких отличий:

Если вас интересует, когда к серверу MySQL будут добавляться новые расширения, необходимо обратиться к онлайновому списку перспективных задач к выполнению, в котором дан их перечень в порядке приоритетности. Он находится по адресу http://www.mysql.com/doc/en/TODO.html. Это самая последняя версия списка задач к выполнению (TODO list) в данном руководстве (see section 1.10 MySQL и будущее (что предстоит сделать)).

1.9.4.1 Вложенные SELECTы

В сервер MySQL поддерживает вложенные запросы вида INSERT ... SELECT ... и REPLACE ... SELECT .... В других контекстах можно использовать и функцию IN().

Вложенные операции выборки реализованы в версии 4.1.

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

SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);

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

SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;

Запросы:

SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);
SELECT * FROM table1 WHERE NOT EXISTS (SELECT id FROM table2
         WHERE table1.id=table2.id);

эквивалентны следующему:

SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id
                WHERE table2.id IS NULL;

Для более сложных подзапросов часто можно создать временные таблицы, содержащие данный подзапрос. Иногда, однако, этот способ не годится, чаще всего для команд DELETE, для которых в стандарте SQL не поддерживаются объединения (за исключением вложенных выборок). В этой ситуации возможны два временных (пока вложенные запросы не поддерживаются сервером MySQL) варианта решения проблемы.

Первый вариант следующий: при помощи какого-либо процедурно-ориентированного языка программирования (такого как Perl или PHP) делается запрос SELECT для получения первичных ключей тех записей, которые должны быть удалены, а затем полученные величины используются для составления команды DELETE (DELETE FROM ... WHERE ... IN (key1, key2, ...)).

Второй вариант предполагает применение диалогового SQL для автоматического создания набора команд DELETE с использованием расширения MySQL CONCAT() (вместо стандартного оператора ||). Например:

SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', "'", tab1.pkid, "'", ';')
       FROM tab1, tab2
       WHERE tab1.col1 = tab2.col2;

Можно поместить этот запрос в файл скрипта, перенаправить стандартный вход клиента командной строки с этого файла, а стандартный выход - на еще один экземпляр клиента командной строки:

shell> mysql --skip-column-names mydb < myscript.sql | mysql mydb

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

1.9.4.2 Оператор SELECT INTO TABLE

Для сервера MySQL пока не реализована поддержка расширения Oracle SQL: SELECT ... INTO TABLE .... Вместо этого сервер MySQL поддерживает синтаксис ANSI SQL INSERT INTO ... SELECT ..., который, по существу, представляет собой то же самое (see section 6.4.3.1 Синтаксис оператора INSERT ... SELECT).

INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID
       FROM tblTemp1 WHERE tblTemp1.fldOrder_ID > 100;

Можно также использовать выражения SELECT INTO OUTFILE... или CREATE TABLE ... SELECT.

1.9.4.3 Транзакции и атомарные операции

Поддержка транзакций в сервере MySQL реализуется при помощи обработчиков транзакционных таблиц типов InnoDB и BDB (see section 7 Типы таблиц MySQL). Таблицы InnoDB обеспечивают соответствие требованиям ACID.

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

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

  1. Транзакционная парадигма обеспечивает следующие возможности: если приложения написаны таким образом, что в критических ситуациях зависят от вызова ROLLBACK вместо COMMIT, то транзакции предпочтительней атомарных операций. Транзакции также обеспечивают гарантию того, что незаконченные обновления или искаженные действия не будут фиксироваться в базе данных; серверу предоставляется возможность выполнить автоматический откат, и база данных будет сохранена. Почти во всех случаях при работе с сервером MySQL решить возможные проблемы можно путем включения простых проверок перед обновлениями и запуска простых скриптов, которые выполняют проверку баз данных на нарушение целостности с автоматическим исправлением повреждений или выдачей предупреждения, если такое нарушение возникает. Отметим, что полноценное выявление и устранение ошибок в таблицах без потери целостности данных можно обеспечить, просто используя системный журнал MySQL или добавив еще один дополнительный журнал.
  2. Во многих случаях транзакционные обновления можно переписать как атомарные. В общем случае все проблемы, которые решаются с помощью транзакций, можно решить с помощью LOCK TABLES или атомарных UPDATE, при гарантии того, что в базе данных никогда не произойдет автоматического прерывания (что является часто встречающейся проблемой для транзакционных баз данных).
  3. Даже в транзакционной системе возможна потеря данных в случае внезапной остановки сервера (если сервер ``упадет''). Разница между различными системами состоит только в том, насколько мал промежуток времени, в течение которого данные могут быть потеряны. Ни одна система не является надежной на 100%, только ``достаточно надежной''. Даже для сервера Oracle (эта база данных считается наиболее надежной транзакционной базой данных), по сообщениям, в подобных ситуациях иногда возможна потеря данных. Что же касается использования сервера MySQL, то в любом случае, независимо от того, применяются или нет транзакционные таблицы, для обеспечения безопасности необходимо только иметь резервные копии и включенную регистрацию обновлений. Благодаря этим мерам в MySQL, так же как и в других транзакционных базах данных, можно восстановить информацию в любой ситуации. Резервные копии вообще хорошо иметь всегда, независимо от того, какая база данных используется.

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

В ситуациях, где целостность данных чрезвычайно важна, сервер MySQL обеспечивает даже для нетранзакционных таблиц надежность и целостность данных уровня транзакций или лучше. При блокировании таблиц с помощью LOCK TABLES все обновления останавливаются до тех пор, пока не будут выполнены все проверки на целостность. При наличии только блокировки чтения (в противоположность блокировке записи) операции чтения и вставки, тем не менее, производятся. Новые внесенные записи не будут видны никому из имеющих блокировку чтения клиентов до освобождения этих блокировок. С iомощью INSERT DELAYED вставки становятся в очередь и находятся там до тех пор, пока не будут сняты все блокировки. При этом клиент не вынужден ждать, пока отработает INSERT (see section 6.4.4 Синтаксис оператора INSERT DELAYED).

То, что мы подразумеваем под термином ``атомарные'', не означает ничего сверхъестественного. Имеется в виду лишь следующее: гарантируется, что при выполнении каждого конкретного обновления никакой другой пользователь не может повлиять на него и никогда не произойдет автоматического отката (который возможен на транзакционных таблицах, если не приняты должные меры предосторожности). Сервер MySQL также гарантирует, что не случится грязного чтения (dirty read)".

Ниже описаны некоторые технические приемы работы с нетранзакционными таблицами:

1.9.4.4 Хранимые процедуры и триггеры

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

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

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

1.9.4.5 Внешние ключи

Следует учитывать, что в SQL внешние ключи используются не для объединения таблиц, а главным образом для проверки целостности ссылочных данных (ограничения внешних ключей). Если необходимо получить результаты из большого количества таблиц от команды SELECT, следует делать это через объединение таблиц:

SELECT * FROM table1,table2 WHERE table1.id = table2.id;

См. разделы section 6.4.1.1 Синтаксис оператора JOIN и See section 3.5.6 Использование внешних ключей.

В версии сервера MySQL 3.23.44 и выше таблицы InnoDB поддерживают проверку ограничений внешних ключей (see section 7.5 Таблицы InnoDB). Для таблиц других типов сервер MySQL производит анализ синтаксиса FOREIGN KEY в командах CREATE TABLE, но без выполнения дальнейших действий.

Синтаксис FOREIGN KEY без ON DELETE ... главным образом применяется для целей документирования. В некоторых ODBC-приложениях его можно использовать для автоматического создания выражений WHERE, но обычно это легко сделать вручную. FOREIGN KEY иногда используется в качестве проверки ограничений, но на практике такая проверка не является необходимой, если строки вносятся в таблицу в правильном порядке.

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

В версии сервера MySQL 4.0 можно использовать многотабличное удаление, чтобы удалить строки из многих таблиц одной командой (see section 6.4.6 Синтаксис оператора DELETE).

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

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

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

Недостатки:

1.9.4.6 Представления

Представления планируется реализовать примерно в версии сервера MySQL 5.0.

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

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

Для сервера MySQL нет необходимости в применении представлений для ограничения доступа к столбцам, так как в нем реализована хорошо продуманная система привилегий (see section 4.2 Общие проблемы безопасности и система привилегий доступа MySQL).

1.9.4.7 Символы `--' как начало комментария

В некоторых отличных от MySQL базах данных SQL символы `--' используются как начальные символы комментариев. В сервере MySQL символом начала комментариев является `#'. Для сервера MySQL можно также использовать стиль комментирования из C: /* this is a comment */ (see section 6.1.6 Синтаксис комментариев).

В версии сервера MySQL 3.23.3 и выше поддерживается комментирование с помощью символов `--' - при условии, что за комментарием следует пробел. Это объясняется тем, что данный стиль комментирования вызвал много проблем при автоматической генерации SQL-запросов, в которых присутствовал код, подобный приведенному ниже (величина платежа вставляется в выражение !payment! автоматически):

UPDATE tbl_name SET credit=credit-!payment!

Давайте представим себе, что произойдет в случае, если величина payment окажется отрицательной. Поскольку выражение 1--1 в SQL является допустимым, то просто страшно себе вообразить последствия в случае, если будут разрешены комментарии, начинающиеся с `--',

Использование нашей реализации этого метода комментирования в версии сервера MySQL 3.23.3 и выше - в форме 1-- This is a comment - является действительно безопасным.

Существует еще один безопасный способ решения этой проблемы. Он заключается в том, что клиент командной строки mysql удаляет все строки, начинающиеся с `--'.

Приведенная ниже информация относится только к работе более ранних, чем 3.23.3, версий MySQL.

Если ваша SQL-программа представлена в виде текстового файла, содержащего комментарии `--', необходимо использовать:

shell> replace " --" " #" < text-file-with-funny-comments.sql \
	| mysql database

вместо обычного:

shell> mysql database < text-file-with-funny-comments.sql

Можно также отредактировать сам командный файл, заменив комментарии `--' комментариями `#':

shell> replace " --" " #" -- text-file-with-funny-comments.sql

Привести эти комментарии к первоначальному виду можно с помощью следующей команды:

shell> replace " #" " --" -- text-file-with-funny-comments.sql

1.9.5 Известные ошибки и недостатки проектирования в MySQL

1.9.5.1 Ошибки, известные в 3.23 и исправленные в более поздних версиях MySQL

Следующие ошибки не исправлены в MySQL 3.23, поскольку исправление их требует слишком значительных изменений кода, которые могут повлечь создание еще большего количества ошибок. Эти ошибки классифицированы как "не фатальные" и "переносимые".

1.9.5.2 Открытые ошибки / особенности строения MySQL

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

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

В более ранних версиях MySQL известны следующие ошибки:

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

1.10 MySQL и будущее (что предстоит сделать)

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

Разработка приведенных в списке пунктов будет проходить примерно в порядке их перечисления. Если вы считаете, что это порядок следует изменить, то, пожалуйста, зарегистрируйте лицензию или окажите поддержку MySQL АВ и сообщите нам, что желательно было бы разработать побыстрее. See section 1.6 Лицензии и поддержка MySQL.

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

1.10.1 Что планируется реализовать в версии в 4.0

Уже все сделано. Сейчас мы только исправляем обнаруженные ошибки в MySQL 4.0. See section D.2 Изменения в версии 4.0.x (В разработке; Альфа). Сейчас ведется разработка версий 4.1 и 5.0.

1.10.2 Что планируется реализовать в версии 4.1

Следующие возможности планируются для реализации в MySQL 4.1. Список того, что уже сделано, можно найти в See section D.1 Изменения в версии 4.1.x (Alpha).

1.10.3 Что планируется реализовать в версии 5.0

Перечисленные ниже функции планируется реализовать в MySQL 5.0.

Отметим также, что поскольку у нас над новыми проектами работает большое количество разработчиков, появятся и дополнительные возможности. Существует - хотя и очень небольшая - вероятность, что эти возможности будут введены уже в MySQL 4.1. Список того, что уже сделано в 4.1, можно найти в See section D.1 Изменения в версии 4.1.x (Alpha).

1.10.4 Что должно быть сделано в ближайшем будущем

1.10.5 То, что надо сделать когда-нибудь

Время отводится согласно объемам работ, а не реальному времени.

1.10.6 То, чего не планируется делать

1.11 Сравнение MySQL с другими СУБД

Наши пользователи провели исследование скорости работы нескольких обычных серверов баз данных и серверов баз данных с открытым кодом. Нам известно о проводившихся сравнениях MySQL с сервером Oracle, сервером DB/2, Microsoft SQL Server и другими коммерческими программными продуктами. Однако по причинам юридического характера опубликовать результаты некоторых из этих сравнений в документации не представляется возможным.

В данном разделе приведены результаты сравнения с mSQL (проводившегося по историческим причинам) и с PostgreSQL (так как эта СУБД также распространяется как ПО с открытым кодом). Если у вас имеются результаты подобного тестирования, которые мы могли бы опубликовать, просьба связаться с нами по адресу benchmarks@mysql.com.

Сравнения всех имеющихся функций и типов а также данные о пределах возможностей различных СУБД вы найдете на веб-странице crash-me, расположенной по адресу http://www.mysql.com/information/crash-me.php.

1.11.1 Сравнение MySQL и mSQL

Производительность
Точные результаты сравнения скорости работы можно найти в постоянно пополняющейся библиотеке проведенных тестов по MySQL (see section 5.1.4 Набор тестов MySQL (The MySQL Benchmark Suite)). СУБД mSQL, благодаря отсутствию затрат дополнительных ресурсов на создание потоков, а также за счет компактности синтаксического анализатора, небольшого количества функций и упрощенной системы безопасности, должна выигрывать в скорости выполнения: Поскольку такие операции очень просты, при больших затратах ресурсов на начальном этапе выиграть в скорости их выполнения достаточно сложно. Поэтому лучшие результаты MySQL может показать лишь после установки соединения. С другой стороны, MySQL значительно превосходит mSQL (и большинство других реализаций SQL) при:
Возможности SQL
Эффективность использования дискового пространства
Можно ли уменьшить таблицы, и если да, то насколько? В MySQL имеются очень точные типы данных, а с их помощью можно создавать таблицы, занимающие минимум пространства. Примером чрезвычайно полезного типа данных MySQL может служить MEDIUMINT, длина значений которого составляет 3 байта. При наличии 100 миллионов записей значение экономии даже одного байта на каждой из них трудно переоценить. Выбор типов столбцов в mSQL2 значительно беднее, и поэтому снизить размеры таблиц заметно трудней.
Стабильность
Объективно оценить этот параметр трудно. Подробно вопрос стабильности MySQL рассмотрен в разделе section 1.4.3 Насколько стабильным является MySQL?. Данных и опыта, позволяющих судить о стабильности mSQL, у нас не имеется.
Стоимость
Цена лицензии является немаловажным фактором. По гибкости лицензии MySQL Server превосходит mSQL, да и стоит меньше. Вне зависимости от того, какой из продуктов вы выберете, не забудьте принять во внимание стоимость лицензии или технической поддержки по электронной почте.
Perl-интерфейсы
Perl-интерфейсы MySQL практически идентичны своим аналогам из mSQL, хотя и обладают некоторыми дополнительными возможностями.
JDBC (Java)
В настоящее время для MySQL разработано много разнообразных JDBC-драйверов: Рекомендуется использование драйвера mm. Драйвер Resin тоже, возможно, неплох (по крайней мере, результаты тестов выглядят хорошо), но достаточного количества информации по нему у нас пока нет. Мы знаем, что в mSQL имеется JDBC-драйвер, но для сравнения у нас не хватает опыта работы с ним.
Скорость разработки
Основная команда разработчиков MySQL немногочисленна, но мы привыкли писать код на C и C++ очень быстро. Так как потоки, функции, оператор GROUP BY и т.п. в mSQL все еще не реализованы, этой системе еще долго придется догонять нас. Более точное представление о положении вещей вы сможете получить, прочитав файл `HISTORY' от mSQL за последний год, и сравнив его с разделом новостей (News) MySQL Reference Manual (see section D История изменений и обновлений MySQL). После этого сомнений относительно того, какая система развивалась быстрее, остаться не должно.
Инструментальные программы
Как для mSQL, так и для MySQL сторонними разработчиками было создано множество интересных инструментальных средств. Поскольку перенос программ из mSQL в MySQL сложностей не представляет, почти все интересные приложения, разработанные первоначально для mSQL,имеются и в вариантах для MySQL. В комплект поставки MySQL входит простая программа msql2mysql, исправляющая различия в написании наиболее популярных функций C API между mSQL и MySQL. Вызовы функции msqlConnect(), например, она заменяет на mysql_connect(). Обычно для перевода клиентской программы из mSQL в MySQL оказывается достаточно минимальных усилий.

1.11.1.1 Как конвертировать инструментальные средства mSQL в MySQL

Согласно нашему опыту, переделать такие инструментальные программы, как msql-tcl и msqljava, созданные на основе C API mSQL для работы с C API MySQL, несложно.

Сделать это можно так:

  1. Пропустите исходный файл через сценарий оболочки msql2mysql. Для этого необходима программа replace, распространяющаяся вместе с MySQL Server.
  2. Откомпилируйте.
  3. Исправьте все найденные компилятором ошибки.

Различия между реализациями C API в mSQL и MySQL заключаются в следующем:

1.11.1.2 Различия в клиент-серверных коммуникационных протоколах mSQL и MySQL

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

Ниже приведены наиболее заметные различия между коммуникационными протоколами MySQL и mSQL:

1.11.1.3 Различия в синтаксисе SQL между mSQL 2.0 и MySQL

Типы столбцов

MySQL
Имеются следующие дополнительные типы (не считая остальных; see section 6.5.3 Синтаксис оператора CREATE TABLE):
Кроме того, MySQL поддерживает следующие атрибуты дополнительных типов:
mSQL2
Типы столбцов в mSQL соответствуют приведенным в таблице типам MySQL:
Тип в mSQL Соответствующий тип в MySQL
CHAR(len) CHAR(len)
TEXT(len) TEXT(len). len - максимальная длина. Работает LIKE.
INT INT. Со множеством опций!
REAL REAL. Или FLOAT. Имеются как 4-битовые, так и 8-битовые варианты.
UINT INT UNSIGNED
DATE DATE. Использует формат ANSI SQL, а не собственный формат mSQL.
TIME TIME
MONEY DECIMAL(12,2). Значение с фиксированной точкой и двумя знаками после нее.

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

MySQL
Индексы могут указываться во время создания таблицы при помощи оператора CREATE TABLE.
mSQL
Индексы создаются после создания таблицы с помощью операторов CREATE INDEX.

Вставка уникального идентификатора в таблицу

MySQL
Для указания типа столбца достаточно использовать AUTO_INCREMENT. See section 8.4.3.31 mysql_insert_id().
mSQL
Необходимо создать в таблице SEQUENCE и выбрать столбец _seq.

Получение уникального идентификатора для строки

MySQL
Следует добавить к таблице первичный или уникальный ключ и использовать его. Новое в версии 3.23.11: если ключ PRIMARY или UNIQUE состоит только из одного целочисленного столбца, к нему можно обращаться и как к _rowid.
mSQL
Следует использовать столбец _rowid. Нельзя забывать о том, что _rowid может, в зависимости от множества факторов, со временем измениться.

Получение времени последнего изменения столбца

MySQL
Нужно вставить в таблицу столбец TIMESTAMP. Этому столбцу автоматически присваиваются текущая дата и время при вызове операторов INSERT или UPDATE, если ему не присвоить определенного значения или присвоить значение NULL.
mSQL
Следует использовать столбец _timestamp.

Сравнение значений NULL

MySQL
MySQL соответствует стандарту ANSI SQL, поэтому сравнение с NULL всегда возвращает результат NULL.
mSQL
В mSQL выражение NULL = NULL имеет значение TRUE. Поэтому при переводе старого кода из mSQL в MySQL =NULL необходимо заменить на IS NULL, а <>NULL - на IS NOT NULL.

Сравнение строк

MySQL
Обычно сравнение строк проводится без учета регистра символов, с порядком сортировки, который определяется текущим набором символов (ISO-8859-1 Latin1 по умолчанию). Если вам это не подходит, необходимо установить при объявлении столбцов атрибут BINARY, тогда сравнение будет проводиться в соответствии с ASCII-порядком, установленным на сервере MySQL.
mSQL
Все сравнения строк проводятся с учетом регистра символов в ASCII-порядке сортировки.

Поиск без учета регистра символов

MySQL
LIKE может быть как чувствительным, так и нечувствительным к регистру оператором, в зависимости от столбцов, к которым он применяется. По возможности MySQL использует индексы, если аргумент LIKE не начинается с шаблонного символа.
mSQL
Следует использовать CLIKE.

Обработка концевых пробелов

MySQL
Все пробелы в конце столбцов CHAR и VARCHAR удаляются. Если такое поведение нежелательно, используйте столбцы TEXT.
mSQL
Концевые пробелы сохраняются.

Операторы WHERE

MySQL
MySQL правильно определяет приоритеты действий (AND имеет приоритет перед OR). Заставить MySQL вести себя так, как mSQL, можно при помощи скобок (как можно видеть в соответствующем примере).
mSQL
Все действия производятся слева направо. А это значит, что некоторые логические вычисления, в которых наличествует более трех аргументов, не могут быть выполнены вообще. Кроме того, это означает, что при переносе в MySQL некоторые запросы необходимо менять. Это довольно просто сделать при помощи скобок. Возьмем, к примеру, следующий запрос mSQL:
mysql> SELECT * FROM table WHERE a=1 AND b=2 OR a=3 AND b=4;
Чтобы MySQL вычислил результат этого запроса так же, как это сделал бы mSQL, нужно расставить скобки:
mysql> SELECT * FROM table WHERE (a=1 AND (b=2 OR (a=3 AND (b=4))));

Ограничения доступа

MySQL
Для хранения привилегий для каждого пользователя, удаленного компьютера и базы имеются соответствующие таблицы. See section 4.2.6 Как работает система привилегий.
mSQL
Имеется файл `mSQL.acl', в котором можно определить привилегии чтения/записи для пользователей.

1.11.2 Сравнение MySQL c PostgreSQL

Читая этот раздел, помните о том, что оба программных продукта находятся в постоянном развитии. Мы (разработчики MySQL) и разработчики PostgreSQL постоянно заняты улучшением наших СУБД, поэтому обе системы являются серьезными альтернативами любым коммерческим СУБД.

Приведенное ниже сравнение проводилось в MySQL AB. Мы старались быть как можно более точными и объективными, однако, зная MySQL наизусть, мы не можем похвастаться таким же знанием возможностей PostgreSQL, поэтому в чем-то могли и ошибиться. Однако мы будем тут же исправлять все замеченные неточности.

Прежде всего хотелось бы отметить, что PostgreSQL и MySQL являются широко используемыми программными продуктами, которые разрабатывались с разными целями (хотя создатели обоих и стремятся довести их до полной совместимости со стандартом ANSI SQL). Это значит, что для решения одних задач больше подходит MySQL, для других же - PostgreSQL. Выбирая СУБД, проверьте, соответствуют ли ее возможности требованиям, предъявляемым решаемой задачей. Если требуется максимальная скорость работы, лучше всего, вероятно, будет остановить свой выбор на MySQL Server. Если же вам необходимы дополнительные возможности, имеющиеся только у PostgreSQL, этой СУБД и стоит пользоваться.

1.11.2.1 Стратегии развития MySQL и PostgreSQL

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

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

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

Еще одно значительное отличие MySQL от PostgreSQL заключается в том, что практически весь содержащийся в MySQL код создан разработчиками, работающими в MySQL AB и постоянно занятыми совершенствованием кода сервера. Исключением из этого правила являются системы транзакций и библиотека регулярных выражений regexp.

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

У обоих вышеупомянутых методов разработки есть достоинства и недостатки. Мы, сотрудники MySQL AB, разумеется, считаем, что наша модель лучше, так как обеспечивает большую логичность кода, оптимальность и возможность его повторного использования, а также - меньшее количество ошибок. Будучи авторами кода сервера MySQL, мы с большим успехом можем координировать включение в систему новых возможностей и выход ее новых версий.

1.11.2.2 Сравнение возможностей MySQL и PostgreSQL

На странице crash-me (http://www.mysql.com/information/crash-me.php) приведен список ограничений и особенностей СУБД, которые могут быть обнаружены автоматически с помощью специальных программ. Однако не стоит забывать о том, что многие ограничения могут быть изменены настройкой соответствующих баз данных. Впрочем, эта web-страница оказывается очень кстати, если необходимо, чтобы создаваемое приложение нормально работало с несколькими СУБД или для перевода приложения с одной СУБД в другую.

MySQL обладает следующими преимуществами перед PostgreSQL:

Недостатки MySQL по сравнению с PostgreSQL:

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

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

Возможность Версия MySQL
Подзапросы 4.1
Внешние ключи 5.0 (3.23 с InnoDB)
Представления 5.0
Хранимые процедуры 5.0
Триггеры 5.0
Объединения 4.0
Полные связи 4.1
Ограничения 4.1 или 5.0
Курсоры 4.1 или 5.0
R-деревья 4.1 (для таблиц MyISAM)
Наследование таблиц Не планируется
Расширяемая система типов Не планируется

Другие причины, по которым можно предпочесть PostgreSQL:

Недостатки PostgreSQL по сравнению с MySQL:

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

1.11.2.3 Тестирование скорости работы MySQL и PostgreSQL

Единственная тестовая система с открытым кодом, способная тестировать скорость работы как MySQL Server, так и PostgreSQL (а также других СУБД), о существовании которой нам известно, - наша собственная разработка. Ее можно найти по адресу http://www.mysql.com/information/benchmarks.html.

Мы много раз просили разработчиков PostgreSQL и некоторых пользователей PostgreSQL помочь нам расширить эту систему и превратить ее в совершенный инструмент тестирования скорости работы СУБД, но, к сожалению, безрезультатно.

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

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

При тестировании PostgreSQL в режиме --fast мы запускаем VACUUM после каждой операции UPDATE и DROP TABLE, чтобы обеспечить отличное состояние базы для последующих операторов SELECT. Время, уходящее на работу VACUUM, измеряется отдельно.

Однако при тестировании PostgreSQL 7.1.1 мы не смогли запустить программу в режиме --fast, так как во время теста INSERT, postmaster (демон PostgreSQL) дал сбой и база данных была повреждена настолько, что перезапустить демон не удалось. Когда это случилось дважды, мы решили отложить тестирование в режиме --fast до выхода следующей версии PostgreSQL. Подробную информацию о компьютере, на котором выполнялись тесты, вы найдете на странице тестов.

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

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

Это то же самое, если бы мы решили сравнить скорость работы MySQL Server и PostgreSQL просто сравнив общие результаты тестов MySQL, приведенных на нашей странице. По таким результатам MySQL Server оказался бы более чем в 40 раз быстрее PostgreSQL, а это, конечно, неверно. Можно было бы подлить масла в огонь, избрав для тестирования PostgreSQL тесты, на которые эта система тратит больше всего времени, - и утверждать что MySQL Server более чем в 2000 раз быстрее PostgreSQL.

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

Исследуя результаты тестов, нужно искать задачи, которые должно выполнять ваше приложение, и результаты их выполнения использовать для принятия решения о выборе СУБД. Результаты тестов позволяют определить и задачи, с решением которых выбранная СУБД справляется не слишком хорошо, - таким образом можно определить, чего следует избегать и обходить в своих программах.

Нам известно о двух тестах, утверждающих, что PostgreSQL по производительности превосходит MySQL Server. Оба они - многопользовательские, а у сотрудников MySQL AB пока что не нашлось времени написать такой тест. Основная причина - довольно сложно сделать это так, чтобы не поставить ни одну из СУБД в заведомо проигрышное положение.

Один из этих тестов был заказан компанией Great Bridge, которая в течение 16 месяцев пыталась построить бизнес на основе PostgreSQL, но в конце концов прекратила свою деятельность. Вероятно, это худший из когда-либо проводившихся кем-либо тестов. Он не только принимает во внимание лишь те области, в которых PostgreSQL оказывается ``на коне'', но и ставит абсолютно все остальные СУБД в заведомо проигрышное положение.

Примечание: Нам стало известно о том, что даже некоторым ключевым разработчикам PostgreSQL отнюдь не понравилось то, как фирма Great Bridge проводила свое тестирование, так что команду разработчиков PostgreSQL мы в связи с этим тестом ни в чем не обвиняем.

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

Тим Пердью (Tim Perdue), преданный обожатель PostgreSQL и не слишком большой любитель MySQL, опубликовал свое сравнение на сайте PHPbuilder (http://www.phpbuilder.com/columns/tim20001112.php3).

Узнав об этом, мы связались с Тимом по телефону с тем, чтобы обсудить некоторые странности в полученных им результатах. Он, например, утверждал, что MySQL Server в его тестах с трудом справлялся с обслуживанием пяти пользователей, хотя нам были известны пользователи с примерно такими же, как у Тима, компьютерами, работающие с MySQL Server при 2000 активных соединениях, выдающих до 400 запросов в секунду (причем в данном случае производительность ограничивалась каналом связи с web, а не базой данных).

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

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

Мы спросили Тима, может ли он предоставить нам его данные с тем, чтобы мы могли повторить тест, а также попросили его проверить свою версию MySQL и сообщить нам. Пока что он этого не сделал.

Из за этого его тесту мы тоже не можем доверять. :(

Все течет, все изменяется, и старые тесты теряют актуальность. Теперь MySQL обзавелся парой новых обработчиков таблиц, которые обеспечивают совершенно разные характеристики в разрезе скорости/параллелизма. See section 7 Типы таблиц MySQL. Было бы интересно узнать, какие результаты показали бы вышеупомянутые тесты с разными типами транзакционных таблиц в MySQL. Конечно, в PostgreSQL с тех пор тоже появились новые возможности. Так как эти тесты недоступны общественности, выяснить, как СУБД показала бы себя в них сегодня, мы не можем.

Заключение:

Единственные существующие на сегодня тесты, позволяющие сравнить MySQL Server и PostgreSQL, которые любой может загрузить и запустить, - это тесты из комплекта MySQL. Мы, сотрудники MySQL AB, считаем, что Open Source-СУБД должны тестироваться при помощи Open Source-инструментов! Только так можно получить гарантии того, что никто не сможет провести невоспроизводимые тесты и на основе их результатов утверждать, что одна СУБД лучше другой. Не зная всех фактов, подтвердить или опровергнуть подобные утверждения просто невозможно.

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

Дополнительную информацию о нашей тестовой системе вы можете получить из раздела section 5.1.4 Набор тестов MySQL (The MySQL Benchmark Suite).

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


Go to the first, previous, next, last section, table of contents.