Версия для печати

Архив документации на OpenNet.ru / Раздел "Базы данных, SQL" (Многостраничная версия)

Руководство пользователя СУБД MYSQL

Автор: Алексей Паутов

Источник: RussianLDP:MySQL
Число страниц (страница равна 2000 символов) Краткое описание главы
5Введение. Основные термины и соглашения, использованные в книге. Также обсуждает хронологию.
7Глава 1 Описание стандартов, принятых в MySQL.
35Глава 2 дает краткое введение в MySQL.
8Глава 3 имеет дело со структурой языка.
30Глава 4 рассматривает введение в администрирование.
25Глава 5 подробно рассматривает типы столбцов.
34Глава 6 рассматривает функции для использования в самых главных операторах языка: SELECT и WHERE
18Глава 7 описывает определение данных: вызовы CREATE, DROP и ALTER.
25Глава 8 объясняет манипуляции с данными: команды SELECT, INSERT, UPDATE и DELETE.
11Глава 9 охватывает обзор прочих инструментов языка MySQL.
33Глава 10 обсуждает общие проблемы защиты и систему привилегий доступа в MySQL.
27Глава 11 объясняет проблемы и общие ошибки.
19Глава 12 описывает клиентские скрипты и утилиты MySQL.
11Глава 13 охватывает поддержку MySQL ODBC.
75Глава 14 рассказывает об оптимизации запросов.
5Заключение. Ссылки на источники дополнительной информации по СУБД MySQL.
1Приложение 1. Здесь описан комплектный CD-ROM.
1Приложение 2. Переменные окружения.
1Приложение 3. Выяснение вопросов или сообщение об ошибках в пакете
Приложение 4. GNU GENERAL PUBLIC LICENSE.
Приложение 5. GNU LESSER GENERAL PUBLIC LICENSE.

Всего: 370 страниц в формате А4.


Приложение 1. Сопроводительный CD-ROM

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

Все архивы на диске поставляются в форматах Tar+Gzip и RPM, принятых в Linux и вообще почти всех Unix-системах. Основная масса архивов взята мной с сайта разработчиков MySQL. Диск охватывает все возможные дистрибутивы и дополнения к ним, которые официально представлены для этого пакета.

ВСЕ ПРОГРАММЫ НА СОПРОВОДИТЕЛЬНОМ CD-ROM ВЗЯТЫ МНОЙ ИЗ ОТКРЫТЫХ СЕТЕВЫХ ИСТОЧНИКОВ И РАСПРОСТРАНЯЮТСЯ В СТРОГОМ СООТВЕТСТВИИ С ИХ ЛИЦЕНЗИЯМИ. ДИСК НЕ СОДЕРЖИТ ПИРАТСКИХ КОПИЙ КАКОГО БЫ ТО НИ БЫЛО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ. ОСНОВНАЯ ЧАСТЬ ПРОГРАММ НА НЕМ ПОСТАВЛЯЕТСЯ В ИСХОДНЫХ ТЕКСТАХ.


Приложение 2. Переменные окружения

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

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

Во многих случаях предпочтительно использовать файл выбора конфигурации вместо системных переменных, чтобы изменить поведение MySQL. Подробности в разделе "4.11 Файл опций my.cnf".

DBI_USERЗаданный по умолчанию пользователь для интерфейса Perl DBI.
DBI_TRACEИспользуется при трассировке Perl DBI.
HOMEЗаданный по умолчанию путь для файла хронологии mysql, обычно $HOME/.mysql_history.
LD_RUN_PATHИспользуется, чтобы определить, где находится Ваша библиотека libmysqlclient.so.
MYSQL_DEBUGОпции трассировки при отладке.
MYSQL_HISTFILEПуть к файлу хронологии mysql.
MYSQL_HOSTЗаданное по умолчанию имя хоста, используемое подсказкой командной строки mysql.
MYSQL_PWDЗаданный по умолчанию пароль при соединении с mysqld. Обратите внимание, что использование этой возможности задания пароля опасно!
MYSQL_TCP_PORTЗаданный по умолчанию порт TCP/IP.
MYSQL_UNIX_PORTСокет по умолчанию. Используется для связи с localhost.
PATHИспользуется оболочкой для поиска программ и утилит пакета MySQL.
TMPDIRКаталог, где будут созданы временные таблицы или файлы.
TZЭто должно быть установлено к Вашей зоне местного времени. Подробности в разделе "11.4.6 Проблемы часового пояса".
UMASK_DIRСоздание каталога пользователя будет выполнено с данной маской прав доступа. Обратите внимание, что это значение будет использовано в операции AND с UMASK!
UMASKТо же самое, но для создания файлов.
USERЗаданный по умолчанию пользователь в Windows, чтобы использовать при соединении с mysqld.

Приложение 3. Выяснение вопросов или сообщение об ошибках в пакете

Перед отправкой отчета об ошибке или вопроса сделайте следующее:

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

Как сообщать об ошибках и сбоях

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

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

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

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

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

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

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

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

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

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

Пожалуйста, включите следующую информацию в Ваш отчет:

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

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

Руководящие принципы ответов на вопросы в списках рассылки

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

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


Приложение 4. GNU GENERAL PUBLIC LICENSE

Version 2, June 1991

Copyright © 1989, 1991 Free Software Foundation, Inc.
59 Temple Place - Suite 330, Boston, MA  02111-1307, USA

Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.

Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification follow.

2 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  1. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The ``Program'', below, refers to any such program or work, and a ``work based on the Program'' means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term ``modification''.) Each licensee is addressed as ``you''. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
  2. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
  3. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
    1. You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
    2. You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
    3. If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
    These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
  4. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
    1. Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
    2. Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
    3. Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
    The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
  5. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
  6. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
  7. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
  8. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
  9. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
  10. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and ``any later version'', you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
  11. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

    9.4 NO WARRANTY

  12. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
  13. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

9.5 END OF TERMS AND CONDITIONS

3 How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the ``copyright'' line and a pointer to where the full notice is found.

one line to give the program's name and a brief idea of what it does.

Copyright (C) yyyy name of author

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this when it starts in an interactive mode:

Gnomovision version 69, Copyright (C) 19yy name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.

The hypothetical commands show w and show c should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than show w and show c; they could even be mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your school, if any, to sign a ``copyright disclaimer'' for the program, if necessary. Here is a sample; alter the names:

Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.

signature of Ty Coon, 1 April 1989
Ty Coon, President of Vice

This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.


Приложение 5. GNU LESSER GENERAL PUBLIC LICENSE

Version 2.1, February 1999

Copyright © 1991, 1999 Free Software Foundation, Inc.
59 Temple Place -- Suite 330, Boston, MA 02111-1307, USA

Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

[This is the first released version of the Lesser GPL.  It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]

1 Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.

This license, the Lesser General Public License, applies to some specially designated software--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.

When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.

To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.

For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.

We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.

To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.

Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.

Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.

When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.

We call this license the Lesser General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.

For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.

In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.

Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.

The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a ``work based on the library'' and a ``work that uses the library''. The former contains code derived from the library, whereas the latter must be combined with the library in order to run.

2 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  1. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called ``this License''). Each licensee is addressed as ``you''. A ``library'' means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The ``Library'', below, refers to any such software library or work which has been distributed under these terms. A ``work based on the Library'' means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term ``modification''.) ``Source code'' for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
  2. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
  3. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
    1. The modified work must itself be a software library.
    2. You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
    3. You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
    4. If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
    These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
  4. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
  5. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
  6. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a ``work that uses the Library''. Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a ``work that uses the Library'' with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a ``work that uses the library''. The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a ``work that uses the Library'' uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
  7. As an exception to the Sections above, you may also combine or link a ``work that uses the Library'' with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
    1. Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable ``work that uses the Library'', as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
    2. Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
    3. Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
    4. If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
    5. Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
    For an executable, the required form of the ``work that uses the Library'' must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
  8. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
    1. Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
    2. Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
  9. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
  10. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
  11. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
  12. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
  13. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
  14. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and ``any later version'', you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
  15. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

    9.6 NO WARRANTY

  16. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
  17. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

9.7 END OF TERMS AND CONDITIONS

3 How to Apply These Terms to Your New Libraries

If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).

To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the ``copyright'' line and a pointer to where the full notice is found.

one line to give the library's name and an idea of what it does.
Copyright (C) year name of author

This library is free software; you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or (at
your option) any later version.

This library is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.

Also add information on how to contact you by electronic and paper mail.

You should also get your employer (if you work as a programmer) or your school, if any, to sign a ``copyright disclaimer'' for the library, if necessary. Here is a sample; alter the names:

Yoyodyne, Inc., hereby disclaims all copyright interest in the library
`Frob' (a library for tweaking knobs) written by James Random Hacker.

signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice

That's all there is to it!


Заключение

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

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

Чего нет в этой книге

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

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

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

К сожалению, не могу порекомендовать никакой литературы на русском языке по данному направлению: литература-то есть, хоть ее и мало, но она ориентирована на совсем иной уровень подготовки читателя и другие решаемые задачи. Зато имеется огромное количество ресурсов Internet по MySQL. Большая их часть на английском языке, однако, именно там можно найти много ценного.

Информация и руководства по SQL

Очень хорошую подборку книг по MySQL, разделенную по темам, можно найти на http://www.mysql.com/portal/books/html/index.html. Сразу предупреждаю, что на русском языке в сети есть только одна работа (написана автором этой книги) http://www.botik.ru/~rldp/articles/mysqlrus/mysqlrus.htm. Она есть на множестве зеркал в сети, так что Вы ее без труда найдете. Вся прочая информация доступна, главным образом, на английском языке.

Учебники могут быть найдены на: http://www.mysql.com/portal/development/html/development-61-1.html

Полезные ссылки по MySQL

Много ссылок есть на сайте разработчиков MySQL: http://www.mysql.com/portal/development/html/index.html

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

Учебники и руководства по MySQL

MySQL Myths Debunked
MySQL используемый в реальном мире.
http://www.4t2.com/mysql
Информация о списке рассылки German MySQL.
http://www2.rent-a-database.de/mysql
MySQL-руководство на немецком.
http://www.bitmover.com:8888//home/bk/mysql
Web-доступ к репозитарию MySQL BitKeeper.
http://www.analysisandsolutions.com/code/mybasic.htm
Учебник для новичков в MySQL о том, как устанавливать MySQL под Windows.
http://www.devshed.com/Server_Side/MySQL
Много учебников MySQL.
http://mysql.hitstar.com
Руководство по MySQL на китайском.
http://www.linuxplanet.com/linuxplanet/tutorials/1046/1/
Создание MySQL-Web сайта.
http://www.hotwired.com/webmonkey/backend/tutorials/tutorial1.html
Описание связки MySQL-Perl.
http://www.iserver.com/support/contrib/perl5/modules.html
Установка новых Perl-модулей.
http://www.hotwired.com/webmonkey/databases/tutorials/tutorial4.html
Описание связки PHP/MySQL.
http://www.useractive.com
Краткий учебник по MySQL.

Портирование MySQL и применение MySQL на разных системах

http://www.entropy.ch/software/macosx/mysql
Двоичный клиент MySQL для Mac OS X. Включает информацию относительно того, как формировать и использовать MySQL на Mac OS X.
http://xclave.macnn.com/MySQL
Mac OS Xclave. Запуск MySQL на Mac OS X.
http://www.prnet.de/RegEx/mysql.html
MySQL для Mac OS X Server.
http://www.latencyzero.com/macosx/mysql.html
Построение MySQL для Mac OS X.
http://www.essencesw.com/Software/mysqllib.html
Новая клиентская библиотека для Mac OS Classic (Macintosh).
http://www.lilback.com/macsql
Клиентская библиотека для Mac OS Classic (Macintosh).
http://sixk.maniasys.com/index_en.html
MySQL для Amiga

Ссылки по языку Perl

http://dbimysql.photoflux.com
Perl DBI с MySQL FAQ.

Дискуссионные форумы по MySQL

http://www.weberdev.com
Примеры использования MySQL; (check Top 20)
http://futurerealm.com/forum/futureforum.htm
FutureForum Web Discussion Software.

Коммерческие приложения, поддерживающие MySQL

http://www.supportwizard.com
SupportWizard. Интерактивный Web-ассистент (включает запатентованную копию MySQL).
http://www.sonork.com
Sonork, агент мгновенных сообщений, который ориентирован не только на Internet. Это ориентировано на частные сети, и на маленькие и средние компании. Клиент свободен, сервер тоже свободен, но до 5 пользователей.
http://www.stweb.org
StWeb (Stratos Web and Application server). Удобная в работе, кроссплатформенная Internet/Intranet система разработки и развертывания для web-приложений. Стандартная версия StWeb имеет свой интерфейс к MySQL.
http://www.rightnowtech.com
Right Now Web. Web-автоматизация для обслуживания заказчика.
http://www.icaap.org/Bazaar
Bazaar. Интерактивный дискуссионный форум с Web-интерфейсом.
http://www.phonesweep.com
PhoneSweepT первый в мире коммерческий телефонный сканер. Много взломов за последние годы пришли не через Internet, а через несанкционированные dial-up модемы. PhoneSweep позволяет Вам находить эти модемы, отслеживая обращения по телефону к каждому номеру телефона, которым Ваша организация управляет. PhoneSweep имеет встроенную экспертную систему, которая может распознавать больше, чем 250 различных видов программ с удаленным доступом, включая Carbon Copy(TM), pcANYWHERE(TM) и Windows NT RAS. Вся информация сохранена в SQL базе данных.

SQL-клиенты и генераторы отчетов

urSQL
Редактор SQL и утилита запросов. Заказная подсветка синтаксиса, доступная для редактирования сетка результатов, экспорт результатов, основные функции администрирования MySQL и так далее. Работает под Windows.
MySQL Data Manager
Менеджер данных MySQL является платформно-независимым web-клиентом (написан на perl) для сервера MySQL с поддержкой TCP/IP.
http://ksql.sourceforge.net
Клиент MySQL для KDE.
http://www.ecker-software.de
Клиент для Windows GUI (автор David Ecker).
http://www.icaap.org/software/kiosk
Kiosk. Клиент MySQL для управления базами данных. Написан на Perl. Будет частью пакета Bazaar.
http://www.casestudio.com
Утилита для создания баз данных с поддержкой MySQL 3.23.
http://home.skif.net/~voland/zeos/eng/index.html
Zeos. Клиент, который поддерживает MySQL, Interbase и PostgreSQL.
http://www.geocities.com/SiliconValley/Ridge/4280/GenericReportWriter/grwhome.html
Свободный генератор отчетов на Java
http://www.javaframework.de
MySQLExport. Экспорт инструкций create и данных из MySQL в разные форматы (SQL, HTML, CVS, чистый текст, ZIP, GZIP...)
http://dlabs.4t2.com
M2D, клиент администрирования MySQL для Windows. M2D поддерживает администрирование баз данных MySQL, создание новых баз данных и таблиц, редактирование и многое другое.
http://dlabs.4t2.com
Dexter, маленький сервер, написанный на Perl, который может использоваться как прокси-сервер для MySQL или как расширитель базы данных.
http://www.scibit.com/Products/Software/Utils/Mascon.asp
Mascon представляет собой мощный Win32 GUI-инструмент для управления базами данных MySQL.
http://www.rtlabs.com/
MacSQL Monitor. GUI для баз данных MySQL, ODBC и JDBC для Mac OS.

Дистрибутивы, которые включают MySQL

http://www.suse.com
SuSE Linux (6.1 и выше)
http://www.redhat.com
RedHat Linux (7.0 и выше)
http://distro.conectiva.com.br
Conectiva Linux (4.0 и выше)

Инструменты разработки для Web, которые поддерживают MySQL

http://www.php.net
PHP: серверный язык, встраиваемый в HTML.
http://www.midgard-project.org
Midgard Application Server. Мощная среда Web-разработки, основанная на MySQL и языке PHP.
http://www.smartworker.org
SmartWorker, платформа для разработки Web-приложений.
http://xsp.lentus.se
XSP, e(X)tendible (S)erver (P)ages, встраиваемый в HTML язык, написан на Java (ранее был известен как XTAGS)
http://www.dbServ.de
dbServ расширение web-сервера, чтобы интегрировать вывод базы данных в Ваш HTML-код. Вы можете использовать любую функцию HTML в Вашем выводе. Это работает как автономный сервер или Java servlet.
http://www.chilisoft.com
Платформно-независимый ASP Chili!Soft
http://www.voicenet.com/~zellert/tjFM
Драйвер JDBC для MySQL.
http://www.wernhart.priv.at/php
Демонстрашки MySQL+PHP.
http://www.dbwww.com
ForwardSQL: HTML-интерфейс для работы с базами данных MySQL.
http://www.daa.com.au/~james/www-sql
WWW-SQL: отображает информацию из баз данных.
http://www.minivend.com/minivend
Minivend: система покупок через Web.
http://www.heitml.com
HeiTML: серверное расширение HTML и язык 4GL в то же самое время.
http://www.metahtml.com
Metahtml: язык динамического программирования для программ WWW.
http://www.binevolve.com
VelocityGen для Perl и Tcl.
http://hawkeye.net
Hawkeye Internet Server Suite.
http://www.fastflow.com
Сетевое подключение к базам данных для Linux.
http://www.wdbi.net
WDBI: Web-браузер как универсальный внешний интерфейс к базам данных, который хорошо поддерживает MySQL.
http://www.webgroove.com
WebGroove Script: компилятор HTML и серверный скриптовый язык.
http://www.ihtml.com
Серверный скриптовый язык для Web.
ftp://ftp.igc.apc.org/pub/myodbc/README
Как использовать MySQL с ColdFusion на Solaris.
http://calistra.com/MySQL
Администратор Calistra ODBC MySQL.
http://www.webmerger.com
Webmerger. CGI-инструмент интерпретирует файлы и генерирует динамический вывод, основанный на наборе простых отметок. Готов выполнять драйверы для MySQL и PostgreSQL через ODBC.
http://phpclub.net
PHPclub: много советов по PHP, CGI, MySQL, Perl и всему, что с этим хоть как-то связано.
http://www.penguinservices.com/scripts
MySQL и Perl скрипты.
http://www.widgetchuck.com
Widgetchuck: утилиты и примочки для Web-сайта.
http://www.adcycle.com
AdCycle: менеджер рекламы.
http://sourceforge.net/projects/pwpage
pwPage обеспечивает чрезвычайно быстрый и простой подход к созданию форм базы данных. То есть если таблица базы данных существует, и HTML-страница была создана, используя несколько простых руководящих принципов, то pwPage может немедленно использоваться для выборок данных из таблицы, вставок, модификаций, стирания и выборочного просмотра содержания таблицы.
http://www.omnis-software.com/products/studio/studio.html
OMNIS Studio: RAD-инструмент с поддержкой MySQL.
http://www.webplus.com
talentsoft Web+ 4.6 представляет собой мощный и всесторонний язык разработок для использования в создании web-приложений класса клиент-сервер без того, чтобы писать сложные и отнимающие много времени программы низкого уровня по протоколу CGI.

Утилиты разработки баз данных с поддержкой MySQL

http://www.mysql.com/documentation/dezign
"DeZign for databases" является инструментом разработки базы данных, который хорошо использует диаграмму связи объекта (ERD).

Web-сверверы с инструментами MySQL

ftp://ftp.kcilink.com/pub
mod_auth_mysql. Модуль авторизации для сервера Apache.
http://www.roxen.com
Roxen Challenger Web-сервер.

Расширения для других программ

http://www.seawood.org/msql_bind
Поддержка MySQL для BIND (Internet Domain Name Server).
http://www.inet-interactive.com/sendmail
Поддержка MySQL для Sendmail и Procmail.

Применение MySQL с другими программами

http://www.iserver.com/support/addonhelp/database/mysql/msaccess.html
Использование MySQL с Access.
http://www.iserver.com/support/contrib/perl5/modules.html
Установка новых модулей для Perl.

Ссылки по ODBC

http://www.iodbc.org
Популярный менеджер драйверов iODBC Driver Manager (libiodbc), ныне доступен как Open Source.
http://users.ids.net/~bjepson/freeODBC
Страничка FreeODBC.
http://genix.net/unixODBC
Цели проекта unixODBC состоят в том, чтобы разрабатывать и поддержать unixODBC, который должен стать окончательным стандартом для ODBC на платформе Linux. Это должно включать поддержку GUI для KDE. Самое смешное в том, что таких "окончательных стандартов" много...
http://www.sw-soft.com/products/BtrieveODBC
MySQL-ODBC драйвер для Btrieve.

Ссылки по API

http://www.jppp.com
Частично готовые TDataset-совместимые компоненты для MySQL.
http://www.riverstyx.net/qpopmysql
qpopmysql: заплата, чтобы позволить POP3 брать удостоверение из MySQL базы данных. Имеется также связь с заплатой (автор Paul Khavkine) для Procmail, чтобы позволить любому MTA работать с пользователями в MySQL.
http://www.pbc.ottawa.on.ca
Генератор классов Visual Basic для Active X.
http://www.essencesw.com/Software/mysqllib.html
Новая клиентская библотека для Mac OS Classic (Macintosh).
http://www.lilback.com/macsql
Клиентская библотека для Macintosh.
http://www.essencesw.com/Plugins/mysqlplug.html
Присоска для REALbasic (Macintosh)
http://www.iis.ee.ethz.ch/~neeri/macintosh/gusi-qa.html
Библиотека, которая эмулирует сокеты BSD и pthreads на Macintosh. Это может использоваться, если Вы хотите компилировать клиентскую библиотеку MySQL на Mac.
http://www.dedecker.net/jessie/scmdb
SCMDB дополнение для SCM, который портирует MySQL C library (SCM). С этими библиотечными разработчиками можно делать подключения к базе данных MySQL и использовать SQL в своих программах.

Прочие ссылки по MySQL

SAT
Small Application Toolkit (SAT) представляет собой совокупность утилит, предназначенную, чтобы упростить разработку маленьких, многопользовательских прикладных GUI-программ в среде клиент-сервер. Клиент работает под Microsoft Windows или X Window, сервер базируется под Unix.
http://www.wix.com/mysql-hosting
Реестр интернет-провайдеров, поддерживающих MySQL.
http://www.softagency.co.jp/mysql/index.en.html
Ссылки по использованию MySQL в Japan/Asia.
http://abattoir.cc.ndsu.nodak.edu/~nem/mysql/udf
Перечень MySQL UDF.
http://www.open.com.au/products.html
Система коммерческого Web-мониторинга ошибок.
http://www.stonekeep.com/pts
PTS: Project Tracking System.
http://tomato.nvgc.vt.edu/~hroberts/mot
Программное обеспечение, отслеживающее систему.
http://www.cynergi.net/exportsql
ExportSQL: скрипт, чтобы экспортировать данные из Access95+.
http://SAL.KachinaTech.COM/H/1/MYSQL.html
SAL (Scientific Applications on Linux) MySQL.
http://www.pmpcs.com/
PMP Computer Solutions. Разработчики баз данных, использующие MySQL и mSQL.
http://www.aewa.org
Ассоциация Airborne Early Warning.
http://www.dedserius.com/y2kmatrix
Тестер совместимости с Y2K.

Интерфейсы SQL и баз данных

http://java.sun.com/products/jdbc
JDBC API для доступа к БД.
http://www.gagme.com/mysql
Патч для mSQL Tcl.
http://www.amsoft.ru/easysql
EasySQL: ODBC-совместимый менеджер.
http://www.lightlink.com/hessling/rexxsql.html
REXX-интерфейс для SQL.
http://www.mytcl.cx
Tcl-интерфейс, основанный на tcl-sql.
http://www.binevolve.com/~tdarugar/tcl-sql
Интерфейс для Tcl.
http://www.contrib.andrew.cmu.edu/~shadow/sql.html
SQL Reference Page с большим количеством интересных ссылок.

Примеры использования MySQL

http://www.little6.com/about/linux
Little6 Inc. Интерактивный сайт поиска контрактов, использующий MySQL, PHP3 и Linux.
http://www.delec.com/is/products/prep/examples/BookShelf/index.html
DELECis. Инструмент, который делает очень простой автоматическую генерацию документации для таблицы.
http://www.worldrecords.com
World Records. Поисковик для информации относительно музыки, который использует MySQL и PHP.
http://www.webtechniques.com/archives/1998/01/note
База данных контактов, использующая MySQL и язык PHP.
http://modems.rosenet.net/mysql
Web-интерфейс с календарем на PHP.
http://www.odbsoft.com/cook/sources.htm
Perl-пакет, чтобы генерировать html из SQL-таблицы и для производства инструкций SQL из формы html.
http://www.gusnet.cx/proj/telsql
Базисная телефонная база данных, использующая DBI/DBD.
http://tecfa.unige.ch/guides/java/staf2x/ex/jdbc/coffee-break
Примеры работы с JDBC (автор: Daniel K. Schneider).
http://www.spade.com/linux/howto/PostgreSQL-HOWTO-41.html
SQL BNF
http://www.ooc.com/
Object Oriented Concepts Inc. Прикладные программы CORBA с примерами.
http://www.pbc.ottawa.on.ca
DBWiz. Включает пример того, как управлять курсорами в VB.
http://keilor.cs.umass.edu/pluribus
Pluribus свободный поисковик, который обучается, чтобы улучшить качество результатов поиска через какое-то время. Pluribus работает, делая запись о том, какие страницы пользователь предпочитает среди результатов поиска. Пользователь голосует за страницу, выбирая ее. Затем Pluribus использует это знание, чтобы улучшить качество результатов, когда кто-то еще представляет на рассмотрение тот же самый (или подобный) запрос. Использует PHP и MySQL.
http://www.stopbit.com/
Stopbit. Сайт новостей технологий, использующий MySQL и PHP.
http://www.linuxsupportline.com/~kalendar
Менеджер календарей для KDE.
http://tim.desert.net/~tim/imger
Пример сохранения и получения изображений с помощью MySQL и CGI.
http://www.city-gallery.com/album
Old Photo Album. Совместная популярная хронология проекта фотографий, который генерирует все страницы из данных, сохраненных в MySQL базе данных. Страницы будут динамически сгенерированы через интерфейс php3 к содержанию базы данных. Пользователи поставляют изображения и описания. Присланные изображения сохранены на web-сервере, чтобы избежать сохранения их в базе данных как объекты типа BLOB. Вся другая информация сохранена на общедоступном сервере MySQL.

Ссылки по базам данных

http://www.pcslink.com/~ej/dbweb.html
Database Jump Site
http://black.hole-in-the.net/guy/webdb
Домашняя страница списка рассылки webdb-l (Web Databases).
http://www.symbolstone.org/technology/perl/DBI/index.html
Страница модулей Perl DBI/DBD.
http://www.student.uni-koeln.de/cygwin
Проект Cygwin. Unix поверх Windows.
http://dbasecentral.com
dbasecentral.com. Разработка и распространение мощных и удобных в работе прикладных программ базы данных и систем.
http://www.tek-tips.com
Tek-Tips Forums: свыше 800 некоммерческих форумов для компьютерных профессионалов. Свойства включают: автоматическое сообщение по электронной почте ответов, библиотеки связей и гарантируемую конфиденциальность члена.
http://www.public.asu.edu/~peterjn/btree
B-Trees: структуры сбалансированных деревьев данных.
http://www.fit.qut.edu.au/~maire/baobab/lecture/sld001.htm
Лекции по B-деревьям.

Имеется также много Web-страниц по использованию MySQL. Подробности в разделе "Некоторые пользователи MySQL". Пошлите любые добавления к этому списку на webmaster@mysql.com. Авторы пакета требуют, чтобы Вы показали эмблему MySQL где-нибудь, если Вы желаете, чтобы Ваш сайт был добавлен в список.

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

Этот раздел представляет списки рассылки по 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 доступна на Web-сайте пакета ezmlm http://www.ezmlm.org .

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

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

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

Есть следующие списки рассылки:

announce-subscribe@lists.mysql.com announce
Объявления относительно новых версий 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 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-драйверов.
java-digest-subscribe@lists.mysql.com java-digest
Дайджест-версия рассылки java.
win32-subscribe@lists.mysql.com win32
Все относительно MySQL на операционных системах Microsoft типа Win95, Win98, WinNT и Win2000.
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.
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.

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

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

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

1 Основная информация про MySQL

MySQL очень быстрый, многопоточный, многопользовательский и поддерживающий SQL (Structured Query Language) сервер баз данных.

MySQL является free software. Он лицензируется по GNU GENERAL PUBLIC LICENSE http://www.gnu.org.

Сайт MySQL предоставляет последнюю информацию касательно MySQL.

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

ВАЖНО:

Сообщения об ошибках также как вопросы и комментарии, должны быть посланы списку рассылки mysql@lists.mysql.com. Подробности в разделе "Как сообщать о проблемах и сбоях". Скрипт mysqlbug должен использоваться, чтобы генерировать отчеты об ошибках. Для дистрибутивов исходных текстов скрипт mysqlbug может быть найден в каталоге scripts. Для двоичных дистрибутивов mysqlbug находится в каталоге bin. Если Вы нашли ошибку защиты в MySQL, Вы должны послать e-mail на security@mysql.com.

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

1.1 MySQL, MySQL AB и Open Source

1.1.1 Что такое MySQL

MySQL представляет собой очень популярную систему управления базами данных с открытыми исходными текстами, разрабатываемую MySQL AB. MySQL AB является коммерческой компанией, строящей свой бизнес на сервисах, сосредоточенных на базе данных MySQL. Подробности в разделе "1.1.2 Что такое MySQL AB".

MySQL представляет собой систему управления базами данных.
Базой данных называют структурированный набор данных. Это может быть чем угодно: от простого перечня покупок до галереи изображений. Чтобы добавлять, обращаться и обрабатывать данные, сохраненные в компьютерной базе данных, Вы нуждаетесь в системе управления базы данных, типа MySQL. Так как компьютеры очень хороши при обработке больших количеств данных, базы данных играют центральную роль в вычислениях, как автономные утилиты, или как части других пакетов прикладных программ.
MySQL является реляционной СУБД.
Реляционная база данных сохраняет данные в отдельных таблицах. Это добавляет быстродействие и гибкость. Таблицы связаны определенными отношениями, делающими возможным объединить данные из нескольких таблиц в одном запросе. SQL-часть MySQL ориентирована на Structured Query Language, наиболее общий стандартизированный язык, используемый, чтобы обратиться к компьютерным базам данных.
MySQL является Open Source Software.
Open Source означает, что тексты открыты для чтения и правки всем желающим. Любой может скачать MySQL из Internet и использовать его совершенно бесплатно. Любой желающий может изучать исходный текст и изменять его по своему усмотрению. MySQL использует лицензию GPL (GNU General Public License) http://www.gnu.org, чтобы определить то, что Вы можете делать с программным обеспечением в различных ситуациях. Если Вы считаете GPL неудобной или должны внедрить MySQL в коммерческую прикладную программу, Вы можете купить коммерчески запатентованную версию у авторов.
Почему используют MySQL?
MySQL очень быстр, надежен и легок в использовании. Если это то, что Вы ищете, Вы должны попробовать его. MySQL также имеет очень практичный набор свойств, разработанных в очень близком сотрудничестве с пользователями. Вы можете найти сравнение эффективности MySQL с некоторыми другими администраторами баз данных на странице эталонных тестов. Подробности в разделе "14.1.4 Пакет тестов MySQL Benchmark Suite". MySQL был первоначально разработан, чтобы обработать очень большие базы данных намного быстрее, чем существующие решения, и успешно использовался в высокотребовательных промышленных средах в течение нескольких лет. При постоянной разработке MySQL сегодня предлагает богатый и очень полезный набор функций. Связность, быстродействие и защита делают MySQL очень подходящим для обращения к базам данных из Internet.
Технические возможности MySQL.
За подробностями отсылаю Вас к разделу "9 Обзор языка MySQL". MySQL является системой "клиент-сервер", состоящей из многопоточного SQL-сервера, который поддерживает различные функции, нескольких различных клиентских программ и библиотек, административных инструментальных средств и нескольких интерфейсов программирования.
MySQL имеет много дополнительных программ.
Вероятно, Вы обнаружите, что Ваша любимая прикладная программа или язык программирования уже поддерживает MySQL.

Официально MySQL произносится как "Май-Эс-Ку-Эль", а не как MY-SEQUEL.

1.1.2 Что такое MySQL AB?

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

Авторы ищут партнеров, которые хотели бы поддерживать разработку MySQL так, чтобы они могли бы ускорить темп разработки. Если Вы заинтересованы в этом, напишите на e-mail partner@mysql.com!

MySQL AB имеет в настоящее время свыше 20 разработчиков ( http://www.mysql.com/development/team.html) в платежной ведомости, и это число возрастает быстро.

Основные источники дохода:

Авторы пакета хотят, чтобы MySQL всегда был:

MySQL AB и команда MySQL AB:

1.1.3 История MySQL

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

Название возникло из сокращения (а вернее, слияния) слов My SQL, что на английском языке значит "мой SQL". Названию около десяти лет, оно прижилось еще в те времена, когда пакет не был коммерческой разработкой.

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

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

1.1.5 Насколько стабилен MySQL?

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

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

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

Каждый выпуск MySQL был пригоден для использования, и имелись проблемы только, когда пользователи начинали использовать код из серых зон. Естественно, пользователи снаружи не видят то, чем являются серые зоны, этот раздел пытается указать, которые зоны в настоящее время известны. Описания имеют дело с MySQL Version 3.23. Все известные и сообщенные ошибки выправлены в последней версии, за исключением ошибок, перечисленных в отдельном разделе, которые являются проблемами, связанными с проектом. Подробности в разделе "1.2.7 Известные ошибки и проблемы".

MySQL написан на нескольких уровнях и различных независимых модулях. Эти модули перечислены ниже с индикацией относительно того, как хорошо проверен каждый из них (сравните с MS SQL Server!):

Драйвер ISAM-таблиц: стабилен.
Это управляет хранением и поиском всех данных в MySQL Version 3.22 и ранее. Во всех выпусках MySQL не имелось сообщений об ошибках в этом коде. Единственный известный способ получить разрушенную таблицу состоит в том, чтобы уничтожить сервер в середине модификации. Даже это вряд ли уничтожит любые данные потому, что все данные сбрасываются на диск между запросами. Не было отчетов об ошибках относительно потерянных данных из-за ошибок в MySQL.
Драйвер MyISAM-таблиц: стабилен.
Это ноовведение MySQL Version 3.23. Это в значительной степени основано на коде ISAM-таблиц, но имеет много новых и очень полезных свойств.
Лексический анализатор и обработчик команд: стабильны.
Не было сообщений об ошибках в этой системе в течение длительного времени.
Клиентский код на C: стабилен.
Никаких известных проблем. До Version 3.20 имелись некоторые ограничения в размере буферов передачи/приема. Начиная с Version 3.21, буферный размер теперь динамически меняется до значения по умолчанию в 16M.
Стандартные клиентские программы: стабильны.
Это касается утилит mysql, mysqladmin, mysqlshow, mysqldump и mysqlimport.
Поддержка SQL: стабильна.
Базисная система функций SQL, классы строк и динамическая обработка памяти. Ни одной сообщенной ошибки в этой системе.
Оптимизатор запросов: стабилен.
Оптимизатор диапазонов: стабилен.
Оптимизатор объединений: стабилен.
Блокировки: пока Gamma.
Это очень зависит от системы. На некоторых системах имеются большие проблемы при использовании стандарта блокировки OS (fcntl()). В этих случаях Вы должны выполнить MySQL с опцией --skip-locking. Проблемы, как известно, происходят на некоторых Linux-системах и на SunOS при использовании файловых систем по NFS.
Linux threads: стабильно.
Главная найденная проблема была с обращением fcntl(), которое исправлено, используя опцию --skip-locking для mysqld. Некоторые пользователи сообщали о проблемах тупика в Version 0.5. LinuxThreads должен быть перетранслирован, если Вы планируете использовать свыше 1000 параллельных подключений. Хотя можно выполнить много подключений с LinuxThreads по умолчанию (однако, Вы никогда не будете иметь более, чем 1021 подключение), заданный по умолчанию лимит стека в 2 МБ делает прикладную программу ненадежной, и она способна свалиться в дамп ядра после создания 1021 неактивных подключений.
Solaris 2.5+ pthreads: стабильно.
Мы используем это для всей нашей промышленной работы.
MIT-pthreads (прочие системы): стабильно.
Не имелось никаких сообщенных ошибок, начиная с Version 3.20.15, и никаких известных авторам (почувствуйте разницу!) ошибок, начиная с Version 3.20.16. На некоторых системах имеется сильное замедление операций (до 1/20 секунды бездействия между каждыми двумя запросами). Конечно, MIT-pthreads может все немного замедлять, но индексные инструкции SELECT обычно выполняются в одном пакете.
Другие реализации потоков: Beta-Gamma.
Версии для других систем все еще очень новые и могут иметь ошибки, возможно, в MySQL, но наиболее часто непосредственно в реализации потоков.
LOAD DATA..., INSERT...SELECT: стабильно.
Некоторые люди думали, что они нашли ошибки здесь, но они обычно просто не поняли ситуацию. Пожалуйста, внимательно проверьте руководство перед тем, как сообщать о возникших проблемах!
ALTER TABLE: стабильно.
Маленькие изменения в Version 3.22.12.
DBD: стабильно.
Сейчас поддерживает Jochen Wiedmann (wiedmann@neckar-alb.de). Спасибо!
mysqlaccess: стабильно.
Написан и поддерживается Yves Carlier (Yves.Carlier@rug.ac.be). Спасибо!
GRANT: стабильно.
Большие изменения внесены в MySQL Version 3.22.12.
MyODBC (используется ODBC SDK 2.5): Gamma.
Это, кажется, уже работает хорошо с некоторыми программами.
Репликация: Beta/Gamma.
Авторы все еще работают над репликацией, так что не ожидайте, что это будет твердой скалой. С другой стороны, некоторые пользователи MySQL уже вовсю применяют это свойство с очень хорошими результатами.
Таблицы BDB: Beta.
Код Berkeley DB сам по себе очень устойчив, но разработчики пакета все еще улучшают интерфейс между MySQL и таблицами BDB, так что будет требоваться некоторое время прежде, чем все будет надежно.
Таблицы InnoDB: Beta.
Это недавнее добавление к MySQL. Они работают хорошо и могут использоваться после начального тестирования.
Автоматический ремонт таблиц MyISAM: Beta.
Это воздействует только на новый код, который проверяет, была ли таблица закрыта правильно, и выполняет автоматическую проверку/ремонт таблицы, если это не так.
Таблицы MERGE: Beta/Gamma.
Использование ключей на таблицах MERGE все еще не оттестировано как следует. Другая часть кода MERGE проверена.
FULLTEXT: Beta.
Текстовый поиск работает, но все еще не используется широко.

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

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

MySQL Version 3.22 имеет лимит в 4G на размер таблицы. С новым кодом MyISAM в MySQL Version 3.23 максимальный размер таблицы увеличен до 8 миллионов терабайт (2^63 байт).

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

Операционная системаОграничение размера файла
Linux-Intel 32 bit2G, 4G или больше, зависит от версии Linux
Linux-Alpha8T (?)
Solaris 2.5.12G (возможно, до 4G с патчем)
Solaris 2.64G
Solaris 2.7 Intel4G
Solaris 2.7 ULTRA-SPARC8T (?)

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

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

По умолчанию таблицы MySQL имеют максимальный размер около 4G. Вы можете проверять максимальный размер таблицы для каждой конкретной таблицы с помощью команды SHOW TABLE STATUS или утилитой myisamchk -dv table_name. Подробности приведены в разделе "4.10 Синтаксис вызова SHOW".

Если Вы нуждаетесь в таблицах, больших, чем 4G (и Ваша операционная система поддерживает это), Вы должны установить параметры AVG_ROW_LENGTH и MAX_ROWS, когда Вы создаете Вашу таблицу. Подробности в разделе "7.3 Синтаксис CREATE TABLE". Вы можете установить их и позже с помощью ALTER TABLE. Подробности в разделе "7.4 Синтаксис ALTER TABLE ".

Если Ваша большая таблица нужна только для чтения, Вы могли бы использовать myisampack, чтобы объединить и сжать много таблиц в одну. Утилита myisampack обычно сжимает таблицу по крайней мере на 50%, так что Вы можете иметь намного большие таблицы.

Вы можете обойти ограничения размера файла операционной системы для файлов данных MyISAM, используя опцию RAID. Подробности в разделе "7.3 Синтаксис CREATE TABLE".

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

1.1.7 Совместимость с проблемой 2000

MySQL непосредственно не имеет никаких трудностей с проблемой 2000 (Y2K):

Вы можете сталкиваться с проблемами в прикладных программах, которые используют MySQL, но сами несовместимы с проблемой Y2K. Например, много старых прикладных программ сохраняют или управляют значениями лет, используя числа с 2 цифрами (которые являются неоднозначными). Эта проблема также может быть составлена прикладными программами, которые используют 00 или 99 как значения для индикатора "пропустить". В свое время пришлось столкнуться с программой, которая помечала удаленные записи, выставляя им год 00...

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

Имеется простой пример, иллюстрирующий, что MySQL не имеет любых проблем с датами до года 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. TIMESTAMP имеет диапазон от 1970 до 2030 на 32-разрядных машинах (значение со знаком). На 64-разрядных машинах это обрабатывает времена до 2106 года (значение без знака).

Даже при том, что MySQL Y2K-совместим, Вы отвечаете за то, чтобы обеспечить однозначный ввод. Подробности в разделе "5.2.1 Проблема Y2K и типы Date", там описаны правила MySQL для ввода дат с неоднозначными данными (данные, содержащие значения года с 2 цифрами).

1.2 MySQL и стандарты

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

1.2.1 MySQL-расширения для стандарта ANSI SQL92

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

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

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

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

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

MySQL-расширения перечислены ниже:

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

Авторы пробуют заставить MySQL следовать стандартам ANSI SQL и ODBC SQL, но в некоторых случаях MySQL обрабатывает некоторые дела по-другому:

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

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

Этого также можно достичь опцией --sql-mode=REAL_AS_FLOAT, PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,SERIALIZE,ONLY_FULL_GROUP_BY.

1.2.4 Функциональные возможности, отсутствующие в MySQL

Следующие функциональные возможности отсутствуют в текущей версии MySQL. Есть список, указывающий, когда новые расширения могут быть добавлены к MySQL (с их приоритетами), его можно посмотреть в Интернете по адресу http://www.mysql.com/documentation/manual.php?section=TODO.

1.2.4.1 Вложенные операторы select (sub-selects)

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

Во многих случаях Вы можете переписать запрос без sub-select:

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 не поддерживает объединения (за исключением sub-selects). Для этой ситуации имеются два решения, доступные пока подзапросы не поддержаны.

Первое должно использовать процедурный язык программирования (типа 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;

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

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

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

1.2.4.2 SELECT INTO TABLE

MySQL не поддерживает Oracle SQL-расширение SELECT ... INTO TABLE .... MySQL вместо него поддерживает синтаксис ANSI SQL INSERT INTO ... SELECT ..., который является в основном той же самой функциональностью. Подробности в разделе "8.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.2.4.3 Транзации

Поскольку MySQL в настоящее время поддерживает транзакции, следующее обсуждение имеет силу, только если Вы используете не транзакционно-безопасные типы таблицы. Подробности в разделе "9.2.1 Синтаксис BEGIN/COMMIT/ROLLBACK".

Часто спрашивают, почему MySQL не транзационная база данных?

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

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

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

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

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

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

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

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

Наконец, в ситуациях, где целостность имеет самую высокую важность, текущие свойства MySQL учитывают уровень транзакции или лучшую надежность и целостность. Если Вы блокируете таблицы с помощью LOCK TABLES, все модификации остановятся, пока любые проверки целостности не будут сделаны. Если Вы только получаете блокировку чтения (в противоположность блокировке записи), то чтение и вставки продолжают работать. Новые вставленные записи не будут замечены клиентами, имеющими блокировку READ, пока они не освободят их блокировки чтения. С помощью INSERT DELAYED Вы можете поместить вставки в локальную очередь, где они останутся до тех пор, пока блокировки не будут освобождены. Таким образом, сервер не будет иметь пользователя, который ждет завершения вставки. Подробности в разделе "8.4 Синтаксис INSERT DELAYED".

"Атомная" означает, что Вы можете убедиться в том, что в то время как каждая специфическая модификация выполняется, никакой другой пользователь не может сталкиваться с ней, и никакой автоматической обратной перемотки не будет никогда (хотя это может случаться на транзакционных системах, если Вы не очень осторожны). MySQL также гарантирует, что не будет иметься лишних чтений. Вы можете найти пример того, как писать атомные модификации в разделе "1.2.6 Как справиться без COMMIT/ROLLBACK".

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

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

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

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

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

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

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

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

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

SELECT * from table1,table2 where table1.id = table2.id;

Подробности есть в разделах "8.1.1 Синтаксис JOIN" и "2.5.6 Использование внешних ключей".

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

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

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

1.2.4.6 Почему не реализована поддержка для Foreign Keys

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

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

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

Противопоказания:

1.2.4.7 Views

MySQL не поддерживает views, но это планируется исправить примерно к 4.1.

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

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

Чтобы ограничить доступ к столбцам в MySQL views тоже не требуются: MySQL имеет очень сложную систему предоставления привилегий. Подробности в разделе "10 Общие проблемы защиты и система привилегий доступа MySQL".

1.2.4.8 `--' как начало комментария

Некоторые базы данных SQL применяют -- как начало комментария. MySQL имеет # как символ начала комментария, даже если инструмент командной строки mysql удаляет все строки, начинающиеся с --. Вы можете также использовать стиль комментариев языка C (/* это комментарий */) в MySQL.

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

UPDATE tbl_name SET credit=credit-!payment!

Как Вы думаете, что случится, когда значение payment отрицательное? А вот что. Поскольку 1--1 допустимо в SQL, пакет думает, что начался комментарий типа --. Вряд ли это входит в Ваши планы...

В MySQL Version 3.23 Вы можете использовать: 1-- Это был комментарий

Следующее обсуждение касается Вас, только если Вы управляете MySQL Version 3.23 или ранее:

Если Вы имеете программу 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.2.5 Каким стандартам соответствует MySQL?

Entry level SQL92. ODBC levels 0-2.

1.2.6 Как обойтись без COMMIT/ROLLBACK

Следующее обычно применяется только для таблиц ISAM, MyISAM и HEAP. Если Вы используете только транзакционно-безопасные таблицы (BDB или InnoDB) в модификации, Вы можете также делать COMMIT и ROLLBACK в MySQL. Подробности в разделе "9.2.1 Синтаксис BEGIN/COMMIT/ROLLBACK".

Проблема с эффективной обработкой COMMIT-ROLLBACK с вышеупомянутыми типами таблиц требует полностью иного размещения таблицы, чем используемое MySQL сегодня. Тип таблицы также нуждался бы в дополнительных потоках, которые вели бы автоматические очистки на таблицах, да и использование дисков было бы намного выше. Это сделало бы эти типы таблицы приблизительно в 2-4 медленнее, чем они есть сейчас.

Текущей проблемой является ROLLBACK. Без ROLLBACK Вы можете делать любой вид COMMIT с помощью LOCK TABLES. Для поддержки ROLLBACK с вышеупомянутыми типами таблицы MySQL должен быть изменен так, чтобы сохранять все старые записи, которые модифицировались, и иметь возможность быстро вернуться к отправной точке, если была выдана команда ROLLBACK. Для простых случаев это довольно просто (можно приспособить сюда isamlog), но будет намного трудней выполнить ROLLBACK для ALTER/DROP/CREATE TABLE.

Чтобы избежать использования ROLLBACK, Вы можете использовать следующую стратегию действий:

  1. Примените LOCK TABLES ..., чтобы блокировать все таблицы, к которым Вы хотите обращаться.
  2. Проверьте все условия.
  3. Модифицируйте, если все в порядке.
  4. Вызовите команду UNLOCK TABLES, чтобы снять блокировки.

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

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

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

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

UPDATE tablename SET pay_back=pay_back+'relative change';
UPDATE customer SET customer_date='current_date',
                    address='new address', phone='new phone',
                    money_he_owes_us=money_he_owes_us+'new_money'
       WHERE customer_id=id AND address='old address' AND phone='old phone';

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

Во многих случаях пользователи хотели использовать ROLLBACK и/или LOCK TABLES с целью управления уникальными идентификаторами для некоторых таблиц. Это может быть обработано намного более эффективно, используя столбец AUTO_INCREMENT и функцию SQL LAST_INSERT_ID() или функцию C API mysql_insert_id().

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

UPDATE tbl_name SET row_flag=1 WHERE id=ID;

MySQL вернет для числа обработанных строк, если строка была найдена, и row_flag не был 1 в первоначальной строке.

1.2.7 Известные ошибки и проблемы

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

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

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

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


2 Введение в MySQL

Эта глава обеспечивает введение в MySQL, показывая, как использовать клиент mysql, чтобы создавать и использовать простую базу данных. mysql (иногда упоминаемый как "terminal monitor" или "monitor") представляет собой интерактивную программу, которая позволяет Вам соединяться с сервером MySQL, выполнять запросы и просматривать результаты. Она может также использоваться в пакетном режиме: Вы помещаете Ваши запросы в файл заранее, затем сообщаете, чтобы клиент mysql выполнил содержимое файла. Оба пути использования будут здесь рассмотрены.

Чтобы увидеть список параметров mysql, вызовите его с опцией --help:

shell> mysql --help

Эта глава предполагает, что mysql установлен на Вашей машине, и что сервер MySQL доступен.

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

2.1 Соединение с сервером

Чтобы соединяться с сервером, Вы обычно должны обеспечить имя пользователя, когда Вы вызываете mysql и, вероятно, пароль. Если сервер выполняется на другой машине, Вы будете также должны определить hostname. Войдите в контакт с Вашим администратором, чтобы выяснить, какие параметры соединения Вы должны использовать, чтобы подключиться (то есть, какой hostname, порт, имя пользователя и пароль). Как только Вы узнаете соответствующие параметры, Вы должны иметь возможность соединиться так:

shell> mysql -h host -u user -p
Enter password: ********

Здесь ******** представляет Ваш пароль. Введите его, когда mysql отобразит сообщение Enter password:.

Если это работает, Вы должны увидеть некоторую вводную информацию, сопровождаемую подсказкой mysql>:

shell> mysql -h host -u user -p
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 459 to server version: 3.22.20a-log

Type 'help' for help.

mysql>

Подсказка сообщает Вам, что mysql готов принять команды.

Некоторые инсталляции MySQL позволяют пользователям соединяться как анонимным (неназванным) пользователям с сервером на локальной машине. Если у Вас дело обстоит именно так, Вы можете соединиться с таким сервером, вызывая mysql без параметров:

shell> mysql

После того, как Вы успешно соединились, Вы можете разъединять соединение в любое время, набрав команду QUIT в ответ на подсказку mysql>:

mysql> QUIT
Bye

Вы можете также разъединять связь, нажимая Control-D.

Большинство примеров в следующих разделах считает, что Вы связаны с сервером. Они указывают это подсказкой mysql>.

2.2 Ввод запросов

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

Имеется простая команда, которая просит, чтобы сервер сообщил свою версию и текущую дату. Напечатайте это как показано ниже после подсказки mysql> и нажмите клавишу RETURN:

mysql> SELECT VERSION(), CURRENT_DATE;
+--------------+--------------+
| version()    | CURRENT_DATE |
+--------------+--------------+
| 3.22.20a-log | 1999-03-19   |
+--------------+--------------+
1 row in set (0.01 sec)
mysql>

Этот запрос иллюстрирует несколько вещей относительно mysql:

Ключевые слова могут быть введены в любом регистре. Следующие запросы эквивалентны:

mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;

Имеется другой запрос. Он показывает, что Вы можете использовать mysql как простой калькулятор:

mysql> SELECT SIN(PI()/4), (4+1)*5;
+-------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+-------------+---------+
|    0.707107 |      25 |
+-------------+---------+

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

mysql> SELECT VERSION(); SELECT NOW();
+--------------+
| version()    |
+--------------+
| 3.22.20a-log |
+--------------+
+---------------------+
| NOW()               |
+---------------------+
| 1999-03-19 00:15:33 |
+---------------------+

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

Имеется простая инструкция с длинной строкой:

mysql> SELECT
    -> USER()
    -> ,
    -> CURRENT_DATE;
+--------------------+--------------+
| USER()             | CURRENT_DATE |
+--------------------+--------------+
| joesmith@localhost | 1999-03-18   |
+--------------------+--------------+

В этом примере обратите внимание, как подсказка изменяется с mysql> на -> после того, как Вы вводите первую строку запроса. Этим mysql указывает, что пока не видел полную инструкцию и ждет остальное. Подсказка Ваш друг потому, что обеспечивает ценную обратную связь. Если Вы используете эту обратную связь, Вы будете всегда знать, чего ждет от Вас mysql.

Если Вы решаете, что Вы не хотите выполнять команду, но находитесь в процессе ввода, отмените ее вводом \c:

mysql> SELECT
    -> USER()
    -> \c
mysql>

Здесь также обратите внимание на подсказку. Она переключилась назад в mysql> после ввода \c, обеспечивая обратную связь, чтобы указать, что mysql готов для новой команды.

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

ПодсказкаСмысл
mysql>Ожидание новой команды
->Ожидание следующей строки многострочной команды
'>Ожидание следующей строки при сборе строки, которая начинается с одиночной кавычки (')
">Ожидание следующей строки при сборе строки, которая начинается с двойной кавычки (")

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

mysql> SELECT USER()
    ->

Если это случается с Вами (Вы думаете, что ввели оператор, но единственный ответ представляет собой подсказку ->), наиболее вероятно, что mysql ждет точку с запятой. Введите точку с запятой, чтобы завершить инструкцию, и mysql ее выполнит:

mysql> SELECT USER()
    -> ;
+--------------------+
| USER()             |
+--------------------+
| joesmith@localhost |
+--------------------+

Подсказки '> и "> появляются при работе со строкой в кавычках. В MySQL Вы можете писать строки в символах ' или " (например, 'hello' или "goodbye"), и mysql позволяет Вам вводить длинные строки в виде нескольких коротких строк. Когда Вы видите подсказку '> или ">, это означает, что Вы ввели строку, которая начинается с символа кавычки ' или ", но еще не ввели вторую кавычку, которая завершает эту строку. Это также может сообщать и об ошибке:

mysql> SELECT * FROM my_table WHERE name="Smith AND age < 30;
    ">

Если Вы вводите эту инструкцию SELECT, то нажатие RETURN ничего не вернет. Вместо того, чтобы задаваться вопросом, почему этот запрос так долго выполняется, обратите внимание на подсказку ">. Это сообщает Вам, что mysql ожидает увидеть остальную часть незавершенной строки. Вы видите ошибку в инструкции? Строка "Smith пропускает вторую кавычку.

Что делать? Самая простая вещь: отменить команду. Однако, Вы не можете в этом случае просто напечатать \c, так как mysql интерпретирует это как часть, которая вводится! Вместо этого, введите заключительный символ кавычки (чтобы mysql понял, что Вы закончили строку), а уж потом \c:

mysql> SELECT * FROM my_table WHERE name = "Smith AND age < 30;
    "> "\c
mysql>

Подсказка изменяется обратно на mysql>, указывая, что mysql готов для новой команды.

Важно знать, что сообщают подсказки '> и ">, так как если Вы по ошибке вводите незавершенную строку, любые дальнейшие строки, которые Вы введете, будут игнорироваться mysql, включая строку QUIT! Это может крепко запутать, особенно, если Вы не знаете, что должны ввести кавычку завершения прежде, чем Вы сможете отменить текущую команду.

2.3 Создание и использование баз данных

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

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

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

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

mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql    |
| test     |
| tmp      |
+----------+

Список баз данных, вероятно, иной на Вашей машине, но базы с именами mysql и test, вероятно, будут среди них. База данных mysql вообще обязательна потому, что она описывает привилегии доступа пользователей. База данных test часто обеспечивается как рабочая область для начинающих пользователей (лягушатник). Именно там проводятся разные "опыты со взрывами".

Если существует база данных test, попробуйте обратиться к ней:

mysql> USE test
Database changed

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

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

mysql> GRANT ALL ON menagerie.* TO your_mysql_name;

Здесь your_mysql_name представляет собой имя пользователя MySQL, назначенное Вам.

2.3.1 Создание и выбор баз данных

Если администратор создал базу данных для Вас и установил Ваши права доступа, Вы можете начинать использовать ее. Иначе, Вы должны создать базу данных самостоятельно. Например:

mysql> CREATE DATABASE menagerie;

Под Unix имена баз данных чувствительны к регистру (в отличие от ключевых слов SQL), так что Вы должны всегда обращаться к Вашей базе данных как к menagerie, но не как Menagerie, MENAGERIE или еще как-то. Это также верно для имен таблицы. Под Windows это ограничение не применяется, хотя Вы должны обращаться к базам данных и таблицам, используя тот же самый регистр символов в течение запроса.

Создание базы данных не выбирает ее для использования, Вы должны сделать это явно. Чтобы объявить menagerie текущей (актуальной) базой данных, используйте эту команду:

mysql> USE menagerie
Database changed

Ваша база данных должна быть создана только однажды, но Вы должны выбирать ее для использования каждый раз, когда Вы начинаете сеанс mysql. Вы можете сделать это, выдавая инструкцию USE как показано выше. Альтернативно, Вы можете выбирать базу данных в командной строке, когда Вы вызываете mysql. Только определите имя после любых параметров подключения к серверу, которые Вы должны обеспечить. Например:

shell> mysql -h host -u user -p menagerie
Enter password: ********

Обратите внимание, что menagerie не Ваш пароль. Если Вы хотите указать пароль в командной строке после опции -p, Вы должны сделать это без пробела (например, как -pmypassword, но не как -p mypassword). Однако, помещение Вашего пароля в командную строку не рекомендуется потому, что это выставит его на всеобщее обозрение всем пользователям Вашей машины.

2.3.2 Создание таблицы

Создание базы данных дело простое, но сейчас база пустая, о чем и сообщает команда SHOW TABLES:

mysql> SHOW TABLES;
Empty set (0.00 sec)

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

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

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

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

Используйте инструкцию CREATE TABLE, чтобы определить размещение Вашей таблицы:

mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
    -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);

VARCHAR представляет собой хороший выбор для столбцов имени, владельца и разновидности потому, что значения столбца изменяются по длине. Длины столбцов name, owner и species не должны превышать 20 символов. Вообще-то, для этого типа столбцов Вы можете выбирать любую длину от 1 до 255, какая кажется наиболее приемлемой Вам. Если Вы делаете столбец недостаточных размеров, а позже окажется, что Вы нуждаетесь в более длинном поле, MySQL обеспечивает инструкцию ALTER TABLE.

Пол животных можно представить разными путями, например, "m" и "f" или словами "male" и "female". Самое простое: использовать одиночные символы "m" и "f".

Использование типа данных DATE для столбцов рождения и гибели (birth и death) явно довольно очевидный выбор.

Теперь, когда Вы создали таблицу, SHOW TABLES должен произвести некоторый вывод:

mysql> SHOW TABLES;
+---------------------+
| Tables in menagerie |
+---------------------+
| pet                 |
+---------------------+

Чтобы проверить, что Ваша таблица была создана тем путем, каким Вы ожидали, используйте инструкцию DESCRIBE:

mysql> DESCRIBE pet;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name    | varchar(20) | YES  |     | NULL    |       |
| owner   | varchar(20) | YES  |     | NULL    |       |
| species | varchar(20) | YES  |     | NULL    |       |
| sex     | char(1)     | YES  |     | NULL    |       |
| birth   | date        | YES  |     | NULL    |       |
| death   | date        | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

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

2.3.3 Загрузка данных в таблицу

После создания Вашей таблицы Вы должны заполнить ее. Инструкции LOAD DATA и INSERT полезны для этого.

Предположим, что Ваши записи о живности могут быть описаны как показано ниже. Заметьте, что MySQL ожидает даты в формате YYYY-MM-DD, это может быть отлично от того, к чему Вы привыкли.

nameowner speciessexbirth death
FluffyHaroldкошкаf1993-02-04
ClawsGwenкошкаm1994-03-17
BuffyHaroldсобакаf1989-05-13
FangBennyсобакаm1990-08-27
BowserDianeсобакаm1989-08-31 1995-07-29
ChirpyGwenптичкаf1998-09-11
WhistlerGwenптичка1997-12-09
SlimBennyзмеяm1996-04-29

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

Вы могли бы создать текстовый файл pet.txt, содержащий одну запись на строку, со значениями, отделяемыми позициями табуляции, указанными в том порядке, в котором столбцы были перечислены в инструкции CREATE TABLE. Для отсутствующих значений (типа неизвестного пола или дат гибели для животных, которые все еще живут), Вы можете использовать значения NULL. Чтобы представить их в Вашем текстовом файле, используйте \N. Например, запись для птички Whistler выглядит примерно так (пробелом я обозначил табуляцию):

Whistler Gwen птичка \N 1997-12-09 \N

Чтобы загрузить текстовый файл pet.txt в таблицу pet, используйте эту команду:

mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;

Вы можете определять разделитель значений столбцов и маркер конца строки в инструкции явно LOAD DATA, если Вы желаете, но значениями по умолчанию являются табуляция и перевод строки. Они достаточны, чтобы правильно прочитать файл pet.txt.

Когда Вы хотите добавить новые записи по одной, полезна инструкция INSERT. В самой простой ее форме Вы обеспечиваете значения для каждого столбца в том порядке, в котором столбцы были перечислены в инструкции CREATE TABLE. Предположим, что Diane получила нового хомяка Puffball. Вы можете добавить новую запись, используя инструкцию INSERT, подобно этому:

mysql> INSERT INTO pet
    -> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);

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

Из этого примера Вы видите, что для непосредственной загрузки в таблицу пришлось бы печатать довольно много. Инструкция LOAD DATA сберегла много времени.

2.3.4 Получение информации из таблицы

Инструкция SELECT используется, чтобы получить информацию из таблицы. Общая форма инструкции:

SELECT what_to_select FROM which_table WHERE conditions_to_satisfy

what_to_select указывает то, что Вы хотите увидеть. Это может быть список столбцов или *, чтобы указать все столбцы. which_table указывает таблицу, из которой Вы хотите получить данные. Предложение WHERE факультативно. Если оно представлено, conditions_to_satisfy определяет условия, которым должны удовлетворять искомые строки.

2.3.4.1 Выбор всех данных

Самая простая форма SELECT получает все из таблицы:

mysql> SELECT * FROM pet;
+----------+--------+---------+------+------------+------------+
| name     | owner  | species | sex  | birth      | death      |
+----------+--------+---------+------+------------+------------+
| Fluffy   | Harold | cat     | f    | 1993-02-04 | NULL       |
| Claws    | Gwen   | cat     | m    | 1994-03-17 | NULL       |
| Buffy    | Harold | dog     | f    | 1989-05-13 | NULL       |
| Fang     | Benny  | dog     | m    | 1990-08-27 | NULL       |
| Bowser   | Diane  | dog     | m    | 1998-08-31 | 1995-07-29 |
| Chirpy   | Gwen   | bird    | f    | 1998-09-11 | NULL       |
| Whistler | Gwen   | bird    | NULL | 1997-12-09 | NULL       |
| Slim     | Benny  | snake   | m    | 1996-04-29 | NULL       |
| Puffball | Diane  | hamster | f    | 1999-03-30 | NULL       |
+----------+--------+---------+------+------------+------------+

Эта форма SELECT полезна, если Вы хотите сделать обзор всей Вашей таблицы, например, после того, как Вы только что загрузили ее начальным набором данных. Удобно искать ошибки.

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

2.3.4.2 Выбор конкретных строк

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

mysql> SELECT * FROM pet WHERE name = "Bowser";
+--------+-------+---------+------+------------+------------+
| name   | owner | species | sex  | birth      | death      |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+

Вывод подтверждает, что год теперь правильно зарегистрирован как 1989, а не 1998.

Сравнения строк обычно не чувствительны к регистру, так что Вы можете определять имя как "bowser", "BOWSER" или как хотите. Результат запроса будет тот же самый.

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

mysql> SELECT * FROM pet WHERE birth >= "1998-1-1";
+----------+-------+---------+-----+------------+-------+
| name     | owner | species | sex | birth      | death |
+----------+-------+---------+-----+------------+-------+
| Chirpy   | Gwen  | bird    | f   | 1998-09-11 | NULL  |
| Puffball | Diane | hamster | f   | 1999-03-30 | NULL  |
+----------+-------+---------+-----+------------+-------+

Вы можете объединять условия, например, найти самок собак:

mysql> SELECT * FROM pet WHERE species="dog" AND sex="f";
+-------+--------+---------+-----+------------+-------+
| name  | owner  | species | sex | birth      | death |
+-------+--------+---------+-----+------------+-------+
| Buffy | Harold | dog     | f   | 1989-05-13 | NULL  |
+-------+--------+---------+-----+------------+-------+

Предшествующий запрос использует логический оператор AND. Имеется также оператор OR:

mysql> SELECT * FROM pet WHERE species="snake" OR species="bird";
+----------+-------+---------+------+------------+-------+
| name     | owner | species | sex  | birth      | death |
+----------+-------+---------+------+------------+-------+
| Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL  |
| Slim     | Benny | snake   | m    | 1996-04-29 | NULL  |
+----------+-------+---------+------+------------+-------+

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

mysql> SELECT * FROM pet WHERE (species = "cat" AND sex = "m")
    -> OR (species = "dog" AND sex = "f");
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

2.3.4.3 Выбор произвольных столбцов

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

mysql> SELECT name, birth FROM pet;
+----------+------------+
| name     | birth      |
+----------+------------+
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Buffy    | 1989-05-13 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+

Чтобы выяснить, кто обладает домашним животным, используйте такой запрос:

mysql> SELECT owner FROM pet;
+--------+
| owner  |
+--------+
| Harold |
| Gwen   |
| Harold |
| Benny  |
| Diane  |
| Gwen   |
| Gwen   |
| Benny  |
| Diane  |
+--------+

Однако, обратите внимание, что запрос просто находит поле owner из каждой записи, и некоторые из них появляются больше, чем однажды. Чтобы минимизировать вывод, получите каждую уникальную запись вывода только однажды, добавляя ключевое слово DISTINCT:

mysql> SELECT DISTINCT owner FROM pet;
+--------+
| owner  |
+--------+
| Benny  |
| Diane  |
| Gwen   |
| Harold |
+--------+

Вы можете использовать предложение WHERE, чтобы объединить выбор строки с выбором столбца. Например, чтобы получить даты рождения только для кошек и собак, используйте запрос:

mysql> SELECT name, species, birth FROM pet
    -> WHERE species = "dog" OR species = "cat";
+--------+---------+------------+
| name   | species | birth      |
+--------+---------+------------+
| Fluffy | cat     | 1993-02-04 |
| Claws  | cat     | 1994-03-17 |
| Buffy  | dog     | 1989-05-13 |
| Fang   | dog     | 1990-08-27 |
| Bowser | dog     | 1989-08-31 |
+--------+---------+------------+

2.3.4.4 Сортировка строк

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

Отсортируем дни рождения нашей живности:

mysql> SELECT name, birth FROM pet ORDER BY birth;
+----------+------------+
| name     | birth      |
+----------+------------+
| Buffy    | 1989-05-13 |
| Bowser   | 1989-08-31 |
| Fang     | 1990-08-27 |
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Slim     | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy   | 1998-09-11 |
| Puffball | 1999-03-30 |
+----------+------------+

Чтобы сортировать в обратном порядке, добавьте к имени столбца, по которому Вы сортируете, ключевое слово DESC:

mysql> SELECT name, birth FROM pet ORDER BY birth DESC;
+----------+------------+
| name     | birth      |
+----------+------------+
| Puffball | 1999-03-30 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Claws    | 1994-03-17 |
| Fluffy   | 1993-02-04 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Buffy    | 1989-05-13 |
+----------+------------+

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

mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC;
+----------+---------+------------+
| name     | species | birth      |
+----------+---------+------------+
| Chirpy   | bird    | 1998-09-11 |
| Whistler | bird    | 1997-12-09 |
| Claws    | cat     | 1994-03-17 |
| Fluffy   | cat     | 1993-02-04 |
| Fang     | dog     | 1990-08-27 |
| Bowser   | dog     | 1989-08-31 |
| Buffy    | dog     | 1989-05-13 |
| Puffball | hamster | 1999-03-30 |
| Slim     | snake   | 1996-04-29 |
+----------+---------+------------+

Обратите внимание, что ключевое слово DESC применяется только к имени столбца непосредственно перед ним (birth), а значения species сортируются в порядке возрастания.

2.3.4.5 Вычисление дат

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

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

mysql> SELECT name, birth, CURRENT_DATE,
    -> (YEAR(CURRENT_DATE)-YEAR(birth))
    -> -(RIGHT(CURRENT_DATE,5)<RIGHT(birth,5)) AS age FROM pet;
+----------+------------+--------------+------+
| name     | birth      | CURRENT_DATE | age  |
+----------+------------+--------------+------+
| Fluffy   | 1993-02-04 | 2001-08-29   |    8 |
| Claws    | 1994-03-17 | 2001-08-29   |    7 |
| Buffy    | 1989-05-13 | 2001-08-29   |   12 |
| Fang     | 1990-08-27 | 2001-08-29   |   11 |
| Bowser   | 1989-08-31 | 2001-08-29   |   11 |
| Chirpy   | 1998-09-11 | 2001-08-29   |    2 |
| Whistler | 1997-12-09 | 2001-08-29   |    3 |
| Slim     | 1996-04-29 | 2001-08-29   |    5 |
| Puffball | 1999-03-30 | 2001-08-29   |    2 |
+----------+------------+--------------+------+

Здесь YEAR() выделяет часть года даты, RIGHT() убирает пять символов, которые представляют часть MM-DD даты. Часть выражения, которое сравнивает значения MM-DD, выставляется в 1 или 0, что корректирует различие лет, если CURRENT_DATE стоит ранее в году, чем рождение (birth). Полное выражение несколько перегружено, так что псевдоним (age) используется, чтобы заставить столбец вывода обрести более читабельный заголовок.

Запрос работает, но результат мог бы быть просмотрен более легко, если строки были выведены в некотором порядке. Это может быть выполнено, добавляя предложение ORDER BY name, чтобы сортировать вывод:

mysql> SELECT name, birth, CURRENT_DATE,
    -> (YEAR(CURRENT_DATE)-YEAR(birth))
    -> -(RIGHT(CURRENT_DATE,5)<RIGHT(birth,5))
    -> AS age FROM pet ORDER BY name;
+----------+------------+--------------+------+
| name     | birth      | CURRENT_DATE | age  |
+----------+------------+--------------+------+
| Bowser   | 1989-08-31 | 2001-08-29   |   11 |
| Buffy    | 1989-05-13 | 2001-08-29   |   12 |
| Chirpy   | 1998-09-11 | 2001-08-29   |    2 |
| Claws    | 1994-03-17 | 2001-08-29   |    7 |
| Fang     | 1990-08-27 | 2001-08-29   |   11 |
| Fluffy   | 1993-02-04 | 2001-08-29   |    8 |
| Puffball | 1999-03-30 | 2001-08-29   |    2 |
| Slim     | 1996-04-29 | 2001-08-29   |    5 |
| Whistler | 1997-12-09 | 2001-08-29   |    3 |
+----------+------------+--------------+------+

Чтобы отсортировать вывод по возрасту (age), а не по имени (name), примените другое предложение ORDER BY:

mysql> SELECT name, birth, CURRENT_DATE,
    -> (YEAR(CURRENT_DATE)-YEAR(birth))
    -> -(RIGHT(CURRENT_DATE,5)<RIGHT(birth,5))
    -> AS age FROM pet ORDER BY age;
+----------+------------+--------------+------+
| name     | birth      | CURRENT_DATE | age  |
+----------+------------+--------------+------+
| Chirpy   | 1998-09-11 | 2001-08-29   |    2 |
| Puffball | 1999-03-30 | 2001-08-29   |    2 |
| Whistler | 1997-12-09 | 2001-08-29   |    3 |
| Slim     | 1996-04-29 | 2001-08-29   |    5 |
| Claws    | 1994-03-17 | 2001-08-29   |    7 |
| Fluffy   | 1993-02-04 | 2001-08-29   |    8 |
| Fang     | 1990-08-27 | 2001-08-29   |   11 |
| Bowser   | 1989-08-31 | 2001-08-29   |   11 |
| Buffy    | 1989-05-13 | 2001-08-29   |   12 |
+----------+------------+--------------+------+

Подобный запрос может использоваться, чтобы определить возраст для животных, которые умерли. Вы определяете такие случаи, проверяя, является или нет значение death равным NULL. Затем, для тех, которые не-NULL, вычислите разницу между death и birth:

mysql> SELECT name, birth, death,
    -> (YEAR(death)-YEAR(birth)) - (RIGHT(death,5)<RIGHT(birth,5))
    -> AS age
    -> FROM pet WHERE death IS NOT NULL ORDER BY age;
+--------+------------+------------+------+
| name   | birth      | death      | age  |
+--------+------------+------------+------+
| Bowser | 1989-08-31 | 1995-07-29 |    5 |
+--------+------------+------------+------+

Запрос использует death IS NOT NULL вместо death != NULL потому, что NULL специальное значение. Подробности в разделе "2.3.4.6 Работа со значениями NULL".

Что делать, если Вы хотите знать, какие животные имеют дни рождения в следующем месяце? Для этого типа вычисления, год и день не годятся. Вы просто хотите извлекать часть месяца из столбца birth. MySQL обеспечивает несколько функций извлечения частей даты, типа YEAR(), MONTH() и DAYOFMONTH(). Чтобы увидеть, как это работает, выполните простой запрос, который отображает значения birth и MONTH(birth):

mysql> SELECT name, birth, MONTH(birth) FROM pet;
+----------+------------+--------------+
| name     | birth      | MONTH(birth) |
+----------+------------+--------------+
| Fluffy   | 1993-02-04 |            2 |
| Claws    | 1994-03-17 |            3 |
| Buffy    | 1989-05-13 |            5 |
| Fang     | 1990-08-27 |            8 |
| Bowser   | 1989-08-31 |            8 |
| Chirpy   | 1998-09-11 |            9 |
| Whistler | 1997-12-09 |           12 |
| Slim     | 1996-04-29 |            4 |
| Puffball | 1999-03-30 |            3 |
+----------+------------+--------------+

Поиск животных с днями рождения в наступающем месяце прост. Предположим, что текущий месяц апрель. Значение month равно 4, и Вы ищете животных, рожденных в мае (month=5):

mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5;
+-------+------------+
| name  | birth      |
+-------+------------+
| Buffy | 1989-05-13 |
+-------+------------+

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

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

mysql> SELECT name, birth FROM pet
    -> WHERE MONTH(birth) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));

2.3.4.6 Работа со значениями NULL

Значение NULL может удивлять, пока Вы не привыкнете к нему. Концептуально, NULL означает отсутствие средств для оценки или неизвестное значение, и это обрабатывается несколько по-другому, чем другие значения. Для проверки на NULL Вы не можете использовать арифметические операторы, например, =, < или !=. Чтобы показать это, попробуйте следующий запрос:

mysql> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
|     NULL |      NULL |     NULL |     NULL |
+----------+-----------+----------+----------+

Очевидно, что никакого толка от таких сравнений нет и не будет. Используйте взамен операторы IS NULL и IS NOT NULL:

mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
|         0 |             1 |
+-----------+---------------+

В MySQL 0 или NULL означает false в логических операциях, а все остальное значит true. Заданное по умолчанию значение истины в булевых операциях равно 1.

Эта специальная обработка NULL является причиной того, почему в предыдущем разделе было необходимо определить, которые животные умерли, используя именно death IS NOT NULL вместо death!=NULL.

2.3.4.7 Сравнение по шаблону

MySQL обеспечивает стандартные шаблоны SQL, основанные на расширенных регулярных выражениях, подобных используемым Unix-приложениями, вроде vi, grep и sed.

SQL-шаблоны позволяют Вам использовать _, чтобы соответствовать любому одиночному символу и %, чтобы соответствовать произвольному числу символов (включая нулевое количество). В MySQL SQL-шаблоны по умолчанию не чувствительны к регистру. Некоторые примеры показываются ниже. Обратите внимание, что Вы не используете = или !=, когда Вы применяете образцы SQL; используйте операторы сравнения LIKE или NOT LIKE.

Чтобы найти имена, начинающиеся с `b', введите:

mysql> SELECT * FROM pet WHERE name LIKE "b%";
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

Чтобы найти имена, заканчивающиеся на `fy', введите:

mysql> SELECT * FROM pet WHERE name LIKE "%fy";
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+

Чтобы найти имена, содержащие `w', введите:

mysql> SELECT * FROM pet WHERE name LIKE "%w%";
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+

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

mysql> SELECT * FROM pet WHERE name LIKE "_____";
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

Другой тип образца, поддерживаемый MySQL, это расширенные регулярные выражения. Когда Вы проверяете соответствия для этого типа образца, используйте операторы REGEXP и NOT REGEXP (или RLIKE и NOT RLIKE, которые являются синонимами).

Некоторые характеристики расширенных регулярных выражений:

Чтобы проиллюстрировать, как выполняется работа регулярных выражений, показанные выше запросы LIKE переделаны ниже так, чтобы использовать их с REGEXP.

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

mysql> SELECT * FROM pet WHERE name REGEXP "^b";
+--------+--------+---------+-----+------------+------------+
| name   | owner  | species | sex | birth      | death      |
+--------+--------+---------+-----+------------+------------+
| Buffy  | Harold | dog     | f   | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m   | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+-----+------------+------------+

До MySQL Version 3.23.4 REGEXP чувствителен к регистру, и предыдущий запрос не возвратит никаких строк. Чтобы соответствовать нижнему или верхнему регистру b, используйте этот запрос взамен:

mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";

В MySQL 3.23.4, чтобы вынудить сравнение REGEXP быть чувствительным к регистру, используют ключевое слово BINARY, чтобы сделать одну из строк двоичной. Этот запрос будет соответствовать только нижнему регистру b в начале имени:

mysql> SELECT * FROM pet WHERE name REGEXP BINARY "^b";

Чтобы находить имена, заканчивающиеся на fy, примените $, чтобы соответствовать концу имени:

mysql> SELECT * FROM pet WHERE name REGEXP "fy$";
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+

Чтобы находить имена, содержащие `w', неважно в каком регистре, используйте этот запрос:

mysql> SELECT * FROM pet WHERE name REGEXP "w";
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+

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

Чтобы находить имена, содержащие точно пять символов, используйте ^ и $, чтобы соответствовать началу, концу имени и пяти образцам точки . между ними:

mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

Вы могли бы также переписать предыдущий запрос, используя {n} в операторе repeat-n-times:

mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$";
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

2.3.4.8 Подсчет строк

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

Подсчет общего количества животных, которых Вы имеете, аналогичен вопросу о том, сколько строк находятся в таблице pet? Дело в том, что имеется одна запись на домашнее животное. Функция COUNT() считает число не-NULL результатов, так что запрос для подсчета животных выглядит следующим образом:

mysql> SELECT COUNT(*) FROM pet;
+----------+
| COUNT(*) |
+----------+
|        9 |
+----------+

Ранее Вы нашли имена людей, которые имели домашние животных. Вы можете использовать COUNT(), если хотите выяснить, сколько домашних животных имеет каждый владелец:

mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
+--------+----------+
| owner  | COUNT(*) |
+--------+----------+
| Benny  |        2 |
| Diane  |        2 |
| Gwen   |        3 |
| Harold |        2 |
+--------+----------+

Обратите внимание на использование ключевого слова GROUP BY, чтобы сгруппировать вместе все записи для каждого владельца (owner). Без него все, что Вы получите, это сообщение об ошибках:

mysql> SELECT owner, COUNT(owner) FROM pet;
ERROR 1140 at line 1: Mixing of GROUP columns (MIN(),MAX(),COUNT()...)
with no GROUP columns is illegal if there is no GROUP BY clause

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

Число животных на разновидность:

mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;
+---------+----------+
| species | COUNT(*) |
+---------+----------+
| bird    |        2 |
| cat     |        2 |
| dog     |        3 |
| hamster |        1 |
| snake   |        1 |
+---------+----------+

Число животных на пол:

mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;
+------+----------+
| sex  | COUNT(*) |
+------+----------+
| NULL |        1 |
| f    |        4 |
| m    |        4 |
+------+----------+

В этом выводе NULL указывает неизвестный пол.

Число животных на комбинацию разновидности и пола:

mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
+---------+------+----------+
| species | sex  | COUNT(*) |
+---------+------+----------+
| bird    | NULL |        1 |
| bird    | f    |        1 |
| cat     | f    |        1 |
| cat     | m    |        1 |
| dog     | f    |        1 |
| dog     | m    |        2 |
| hamster | f    |        1 |
| snake   | m    |        1 |
+---------+------+----------+

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

mysql> SELECT species, sex, COUNT(*) FROM pet
    -> WHERE species = "dog" OR species = "cat" GROUP BY species, sex;
+---------+------+----------+
| species | sex  | COUNT(*) |
+---------+------+----------+
| cat     | f    |        1 |
| cat     | m    |        1 |
| dog     | f    |        1 |
| dog     | m    |        2 |
+---------+------+----------+

Если Вы хотите получить число животных каждого пола (только для животных, пол которых известен):

mysql> SELECT species, sex, COUNT(*) FROM pet
    -> WHERE sex IS NOT NULL GROUP BY species, sex;
+---------+------+----------+
| species | sex  | COUNT(*) |
+---------+------+----------+
| bird    | f    |        1 |
| cat     | f    |        1 |
| cat     | m    |        1 |
| dog     | f    |        1 |
| dog     | m    |        2 |
| hamster | f    |        1 |
| snake   | m    |        1 |
+---------+------+----------+

2.3.4.9 Использование нескольких таблиц в одном запросе

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

Согласно этим данным инструкция CREATE TABLE для таблицы событий (event) могла бы выглядеть следующим образом:

mysql> CREATE TABLE event (name VARCHAR(20), date DATE,
    -> type VARCHAR(15), remark VARCHAR(255));

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

Fluffy1995-05-15Потомство4 котенка, 3 female, 1 male
Buffy1993-06-23Потомство5 щенков, 2 female, 3 male
Buffy1994-06-19Потомство3 щенка, 3 female
Chirpy1999-03-21ВетеринарНеобходимо выпрямление клюва
Slim1997-08-03ВетеринарСломано ребро
Bowser1991-10-12Конура
Fang1991-10-12Конура
Fang1998-08-28День рожденияПодарок: новая жевательная игрушка
Claws1998-03-17День рожденияПодарок: ошейник от блох
Whistler1998-12-09День рожденияПервый день рождения

Загрузите записи так:

mysql> LOAD DATA LOCAL INFILE "event.txt" INTO TABLE event;

Учитывая то, чему Вы научились (я очень надеюсь, что и правда чему-то научились) на запросах к таблице pet, Вы должны быть способны выполнить поиски на записях в таблице event, принципы те же самые. Но что делать, когда таблица event отдельно недостаточна, чтобы ответить на вопросы, которые Вы задаете?

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

mysql> SELECT pet.name, (TO_DAYS(date)-TO_DAYS(birth))/365 AS age,
    -> remark FROM pet, event WHERE pet.name=event.name
    -> AND type="litter";
+--------+------+-----------------------------+
| name   | age  | remark                      |
+--------+------+-----------------------------+
| Fluffy | 2.27 | 4 kittens, 3 female, 1 male |
| Buffy  | 4.12 | 5 puppies, 2 female, 3 male |
| Buffy  | 5.10 | 3 puppies, 3 female         |
+--------+------+-----------------------------+

Итак, что тут происходит?

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

mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
    -> FROM pet AS p1, pet AS p2
    -> WHERE p1.species=p2.species AND p1.sex="f" AND p2.sex="m";
+--------+------+--------+------+---------+
| name   | sex  | name   | sex  | species |
+--------+------+--------+------+---------+
| Fluffy | f    | Claws  | m    | cat     |
| Buffy  | f    | Fang   | m    | dog     |
| Buffy  | f    | Bowser | m    | dog     |
+--------+------+--------+------+---------+

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

2.4 Получение информации о базах данных и таблицах

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

Вы уже видели вызов SHOW DATABASES, который вносит в список базы данных, управляемые сервером. Чтобы выяснять, которая база данных в настоящее время выбрана, используйте функцию DATABASE():

mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| menagerie  |
+------------+

Если Вы не выбрали базу данных, результат пуст.

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

mysql> SHOW TABLES;
+---------------------+
| Tables in menagerie |
+---------------------+
| event               |
| pet                 |
+---------------------+

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

mysql> DESCRIBE pet;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name    | varchar(20) | YES  |     | NULL    |       |
| owner   | varchar(20) | YES  |     | NULL    |       |
| species | varchar(20) | YES  |     | NULL    |       |
| sex     | char(1)     | YES  |     | NULL    |       |
| birth   | date        | YES  |     | NULL    |       |
| death   | date        | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

Field указывает имя столбца, Type тип данных для столбца, Null указывает, может или нет столбец содержать значения NULL, Key указывает, индексирован или нет столбец, а Default определяет значение столбца по умолчанию.

Если Вы имеете индексы на таблице, SHOW INDEX FROM tbl_name производит информацию относительно их.

2.5 Примеры общих запросов

Имеются примеры того, как решить некоторые общие проблемы с MySQL.

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

Запустите инструмент командной строки mysql и выберите базу данных:

mysql your-database-name

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

Вы можете создать таблицу для примера так:

CREATE TABLE shop (article INT(4) UNSIGNED ZEROFILL DEFAULT '0000'
             NOT NULL, dealer CHAR(20) DEFAULT '' NOT NULL,
             price DOUBLE(16,2) DEFAULT '0.00' NOT NULL,
             PRIMARY KEY(article, dealer));
INSERT INTO shop VALUES
   (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),
   (3,'B',1.45),(3,'C',1.69),(3,'D',1.25),(4,'D',19.95);

Посмотрим данные примера:

mysql> SELECT * FROM shop;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0001 | A      |  3.45 |
|    0001 | B      |  3.99 |
|    0002 | A      | 10.99 |
|    0003 | B      |  1.45 |
|    0003 | C      |  1.69 |
|    0003 | D      |  1.25 |
|    0004 | D      | 19.95 |
+---------+--------+-------+

2.5.1 Максимальное значение для столбца

Что является самым большим значением для элемента?

SELECT MAX(article) AS article FROM shop
+---------+
| article |
+---------+
|       4 |
+---------+

2.5.2 В какой строке хранится максимум некоего столбца?

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

В ANSI SQL это легко может быть выполнен подзапросом:

SELECT article, dealer, price FROM shop
       WHERE price=(SELECT MAX(price) FROM shop)

В MySQL (который еще не имеет поддержки вложенных запросов) это делается за два шага:

  1. Получите максимальное ценовое значение из таблицы с помощью SELECT.
  2. Используя это значение, надо создать фактический запрос:
    SELECT article, dealer, price FROM shop WHERE price=19.95
    

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

SELECT article, dealer, price FROM shop ORDER BY price DESC LIMIT 1

ОБРАТИТЕ ВНИМАНИЕ: Если имеется несколько изделий с одинаковой ценой (например, каждое по 19.95), то LIMIT показывает только одно из них.

2.5.3 Максимум столбца в группе

Что является самой высокой ценой на изделие?

SELECT article, MAX(price) AS price FROM shop GROUP BY article
+---------+-------+
| article | price |
+---------+-------+
|    0001 |  3.99 |
|    0002 | 10.99 |
|    0003 |  1.69 |
|    0004 | 19.95 |
+---------+-------+

2.5.4 В какой строке максимум по группе

Для каждого изделия, найдите торгового агента с наиболее высокой ценой.

В ANSI SQL я сделал бы это подзапросом:

SELECT article, dealer, price FROM shop s1
       WHERE price=(SELECT MAX(s2.price) FROM shop s2
             WHERE s1.article = s2.article);

В MySQL проще всего добиться такого эффекта так:

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

Это может быть легко выполнено через временную таблицу:

CREATE TEMPORARY TABLE tmp (article INT(4) UNSIGNED ZEROFILL
       DEFAULT '0000' NOT NULL, price DOUBLE(16,2) DEFAULT '0.00'
       NOT NULL);
LOCK TABLES shop read;
INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article;
SELECT shop.article, dealer, shop.price FROM shop, tmp
       WHERE shop.article=tmp.article AND shop.price=tmp.price;
UNLOCK TABLES;
DROP TABLE tmp;

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

Можно это сделать одиночным запросом?

Да, но только используя совершенно неэффективный прием MAX-CONCAT trick:

SELECT article, SUBSTRING(MAX(CONCAT(LPAD(price,6,'0'),dealer)), 7)
       AS dealer, 0.00+LEFT(MAX(CONCAT(LPAD(price,6,'0'),dealer)), 6)
       AS price FROM shop GROUP BY article;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0001 | B      |  3.99 |
|    0002 | A      | 10.99 |
|    0003 | C      |  1.69 |
|    0004 | D      | 19.95 |
+---------+--------+-------+

2.5.5 Применение переменных пользователя

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

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

select @min_price:=min(price),@max_price:=max(price) from shop;
select * from shop where price=@min_price or price=@max_price;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0003 | D      |  1.25 |
|    0004 | D      | 19.95 |
+---------+--------+-------+

2.5.6 Использование внешних ключей

Вы не нуждаетесь во внешних ключах, чтобы соединить 2 таблицы.

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

CREATE TABLE persons (id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
             name CHAR(60) NOT NULL, PRIMARY KEY (id));
CREATE TABLE shirts (id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
             style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
             color ENUM('red', 'blue', 'orange', 'white', 'black')
             NOT NULL, owner SMALLINT UNSIGNED NOT NULL REFERENCES persons,
             PRIMARY KEY (id));
INSERT INTO persons VALUES (NULL, 'Antonio Paz');
INSERT INTO shirts VALUES (NULL, 'polo', 'blue', LAST_INSERT_ID()),
   (NULL, 'dress', 'white', LAST_INSERT_ID()),
   (NULL, 't-shirt', 'blue', LAST_INSERT_ID());
INSERT INTO persons VALUES (NULL, 'Lilliana Angelovska');
INSERT INTO shirts VALUES (NULL, 'dress', 'orange', LAST_INSERT_ID()),
   (NULL, 'polo', 'red', LAST_INSERT_ID()),
   (NULL, 'dress', 'blue', LAST_INSERT_ID()),
   (NULL, 't-shirt', 'white', LAST_INSERT_ID());
SELECT * FROM persons;
+----+---------------------+
| id | name                |
+----+---------------------+
|  1 | Antonio Paz         |
|  2 | Lilliana Angelovska |
+----+---------------------+
SELECT * FROM shirts;
+----+---------+--------+-------+
| id | style   | color  | owner |
+----+---------+--------+-------+
|  1 | polo    | blue   |     1 |
|  2 | dress   | white  |     1 |
|  3 | t-shirt | blue   |     1 |
|  4 | dress   | orange |     2 |
|  5 | polo    | red    |     2 |
|  6 | dress   | blue   |     2 |
|  7 | t-shirt | white  |     2 |
+----+---------+--------+-------+
SELECT s.* FROM persons p, shirts s WHERE p.name LIKE 'Lilliana%'
       AND s.owner = p.id AND s.color <> 'white';
+----+-------+--------+-------+
| id | style | color  | owner |
+----+-------+--------+-------+
|  4 | dress | orange |     2 |
|  5 | polo  | red    |     2 |
|  6 | dress | blue   |     2 |
+----+-------+--------+-------+

2.5.7 Поиск на двух ключах

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

SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1'
       OR field2_index = '1'

Причина в том, что авторы не имели времени, чтобы придумать эффективный способ обработать это в общем случае. Обработка AND теперь полностью общая и работает очень хорошо.

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

CREATE TEMPORARY TABLE tmp
SELECT field1_index, field2_index FROM test_table
       WHERE field1_index = '1';
INSERT INTO tmp
SELECT field1_index, field2_index FROM test_table
       WHERE field2_index = '1';
SELECT * from tmp;
DROP TABLE tmp;

Вышеупомянутый способ выполнить этот запрос в действительности вызывает UNION для двух запросов.

2.5.8 Вычисление посещений за день

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

CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL,
       day INT(2) UNSIGNED ZEROFILL);
INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),
       (2000,2,2),(2000,2,23),(2000,2,23);
SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days
       FROM t1 GROUP BY year,month;
+------+-------+------+
| year | month | days |
+------+-------+------+
| 2000 |    01 |    3 |
| 2000 |    02 |    2 |
+------+-------+------+

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

2.6 Использование mysql в пакетном режиме

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

shell> mysql < batch-file

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

shell> mysql -h host -u user -p < batch-file
Enter password: ********

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

Почему использование скриптов удобно? Имеется несколько причин:

Заданный по умолчанию выходной формат несколько иной (более краткий), когда Вы выполняете mysql в пакетном режиме. Например, вывод SELECT DISTINCT species FROM pet напоминает этот образец, когда выполнен в интерактивном режиме:

+---------+
| species |
+---------+
| bird    |
| cat     |
| dog     |
| hamster |
| snake   |
+---------+

Но когда выполнен в пакетном режиме, он подобен этому:

species
bird
cat
dog
hamster
snake

Если Вы хотите получать интерактивный выходной формат в пакетном режиме, используйте mysql -t. Для добавления к выводу команд, которые были выполнены, используется mysql -vvv.

2.7 Запросы из двух проектов

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

http://www.imm.ki.se/TWIN/TWINUKW.HTM

Последняя часть проекта управляется Web-интерфесом, написанным на Perl с базой данных под MySQL.

Каждую ночь (исследования ведутся днем) все данные из интервью перемещаются в базу данных MySQL.

2.7.1 Поиск всех важных близнецов

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

select concat(p1.id, p1.tvab) + 0 as tvid,
       concat(p1.christian_name, " ", p1.surname) as Name,
       p1.postal_code as Code, p1.city as City, pg.abrev as Area,
       if(td.participation = "Aborted", "A", " ") as A,
       p1.dead as dead1, l.event as event1, td.suspect as tsuspect1,
       id.suspect as isuspect1, td.severe as tsevere1,
       id.severe as isevere1, p2.dead as dead2, l2.event as event2,
       h2.nurse as nurse2, h2.doctor as doctor2, td2.suspect as tsuspect2,
       id2.suspect as isuspect2, td2.severe as tsevere2,
       id2.severe as isevere2, l.finish_date from twin_project as tp
       left join twin_data as td on tp.id = td.id and tp.tvab = td.tvab
       left join informant_data as id on tp.id = id.id and tp.tvab=id.tvab
       left join harmony as h on tp.id = h.id and tp.tvab = h.tvab
       left join lentus as l on tp.id = l.id and tp.tvab = l.tvab
       left join twin_data as td2 on p2.id = td2.id and p2.tvab = td2.tvab
       left join informant_data as id2 on p2.id = id2.id and
       p2.tvab=id2.tvab left join harmony as h2 on p2.id = h2.id and
       p2.tvab = h2.tvab left join lentus as l2 on p2.id = l2.id and
       p2.tvab = l2.tvab, person_data as p1, person_data as p2,
       postal_groups as pg where p1.id = tp.id and p1.tvab = tp.tvab and
       p2.id = p1.id and p2.ptvab = p1.tvab and tp.survey_no = 5 and
       (p2.dead = 0 or p2.dead=9 or (p2.dead=1 and (p2.death_date=0 or
       (((to_days(p2.death_date)-to_days(p2.birthday))/365) >= 65))))
       and ((td.future_contact = 'Yes' and td.suspect = 2) or
       (td.future_contact = 'Yes' and td.suspect = 1 and id.suspect=1) or
       (ISNULL(td.suspect) and id.suspect=1 and id.future_contact='Yes') or
       (td.participation = 'Aborted' and id.suspect = 1 and
       id.future_contact = 'Yes') or (td.participation = 'Aborted' and
       ISNULL(id.suspect) and p2.dead = 0)) and l.event = 'Finished'
       and substring(p1.postal_code, 1, 2) = pg.code
       and (h.nurse is NULL or h.nurse=00 or h.doctor=00)
       and not (h.status = 'Refused' or h.status = 'Aborted'
       or h.status = 'Died' or h.status = 'Other') order by tvid;

Как Вам такой запрос? Даю некоторые объяснения:

concat(p1.id, p1.tvab) + 0 as tvid
Мы хотим сортировать на составном идентификаторе id и tvab в числовом порядке. Добавление 0 к результату заставляет MySQL обрабатывать его именно как число.
column id
Это идентифицирует пару близнецов. Это ключ во всех таблицах.
column tvab
Это идентифицирует близнецов в паре. Это имеет значение 1 или 2.
column ptvab
Это инверсия tvab. Когда tvab равно 1, ptvab принимает значение 2, и наоборот. Это существует, чтобы проще оптимизировать запрос.

Этот запрос показывает среди других вещей, как делать поиск на таблице из той же самой таблицы с объединением (p1 и p2). В примере это используется, чтобы проверить, умер ли партнер близнецов до 65 лет. Если так, строка не будет возвращена.

Все вышеприведенное существует во всех таблицах с информацией по близнецам. Мы имеем ключ на паре id,tvab (все таблицы) и другой паре id,ptvab (только в person_data), чтобы сделать запросы быстрее.

На нашей машине (200MHz UltraSPARC) этот запрос возвращает приблизительно 150-200 строк и требует времени меньше, чем одна секунда.

Текущее число записей в таблицах, используемых выше:
ТаблицаСтрок
person_data71074
lentus5291
twin_project5286
twin_data2012
informant_data663
harmony 381
postal_groups100

2.7.2 Состояние пары

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

select t1.event, t2.event, count(*) from lentus as t1, lentus as t2,
       twin_project as tp where t1.id = tp.id and t1.tvab=tp.tvab
       and t1.id = t2.id and tp.survey_no = 5 and t1.tvab='1' and
       t2.tvab='2' group by t1.event, t2.event;

3 Структура языка

3.1 Литералы: как писать строки и числа

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

3.1.1 Строки

Строка представляет собой последовательность символов, окруженных одиночными кавычками (') или двойными кавычками ("). Допустима только одиночная кавычка, если Вы работаете в ANSI-режиме. Примеры:

'a string'
"another string"

Внутри строки некоторые последовательности имеют специальное значение. Каждая из этих последовательностей начинается с наклонной черты влево (\), известной как escape character. MySQL распознает следующие управляющие последовательности:

\0
Символ с кодом ASCII 0 (NUL).
\'
Символ одиночной кавычки (').
\"
Символ двойной кавычки (").
\b
Символ backspace.
\n
Символ newline.
\r
Символ возврата каретки.
\t
Символ табуляции.
\z
ASCII(26)=(Control-Z). Этот символ может быть закодирован, чтобы позволить Вам обойти проблему восприятия ASCII(26) как END-OF-FILE под Windows. ASCII(26) вызовет проблемы, если Вы попробуете использовать mysql database < filename.
\\
Символ backslash (\).
\%
Символ %. Это используется, чтобы искать литеральные образцы % в контекстах, где % иначе интерпретировался бы как групповой символ. Подробности в разделе "6.3.2.1 Функции сравнения строк".
\_
Символ _. Это используется, чтобы искать литеральные образцы _ в контекстах, где _ иначе интерпретировался бы как групповой символ. Подробности в разделе "6.3.2.1 Функции сравнения строк".

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

Имеется несколько способов включить кавычки в строку:

Инструкции SELECT, приведенные ниже, показывают как работают цитирование и экранировка:

mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
  +-------+---------+-----------+--------+--------+
  | hello | "hello" | ""hello"" | hel'lo | 'hello |
  +-------+---------+-----------+--------+--------+
mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";
  +-------+---------+-----------+--------+--------+
  | hello | 'hello' | ''hello'' | hel"lo | "hello |
  +-------+---------+-----------+--------+--------+
mysql> SELECT "This\nIs\nFour\nlines";
  +--------------------+
  | This
  Is
  Four
  lines |
  +--------------------+

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

NUL
ASCII 0. Вы должны представить это как \0.
\
ASCII 92, backslash. Представьте это как \\.
'
ASCII 39, одиночная кавычка. Представьте это как \'.
"
ASCII 34, двойная кавычка. Представьте это как \".

Если Вы пишете код на C, Вы можете использовать функцию C API mysql_escape_string() для инструкции INSERT. В языке Perl Вы можете использовать метод quote пакета DBI, чтобы преобразовать специальные символы в соответствующие управляющие последовательности.

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

3.1.2 Числа

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

Примеры имеющих силу целых чисел:

1221
0
-32

Примеры чисел с плавающей запятой:

294.42
-32032.6809e+10
148.00

Целое число может использоваться в контексте с плавающей запятой: это интерпретируется как эквивалентное число с плавающей запятой.

3.1.3 Шестнадцатеричные значения

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

mysql> SELECT x'FF'
       -> 255
mysql> SELECT 0xa+0;
       -> 10
mysql> select 0x5061756c;
       -> Paul

Синтаксис x'hexstring' (нововведение в версии 4.0) основан на ANSI SQL и синтаксисе 0x из ODBC. Шестнадцатеричные строки часто используются ODBC, чтобы задать значения для столбцов типа BLOB.

3.1.4 Значения NULL

Значение NULL не означает "никакие данные" и отличается от значений типа 0 для числовых типов или пустой строки для типов строковых. Подробности в разделе " 11.5.3 Проблемы со значениями NULL".

NULL может представляться как \N при использовании импортирования текстового файла или экспортных форматов (LOAD DATA INFILE, SELECT ... INTO OUTFILE). Подробности в разделе "8.4.9 Синтаксис LOAD DATA INFILE".

3.2 Имена баз данных, таблиц, индексов, столбцов и псевдонимов

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

Обратите внимание, что правила изменились, начиная с MySQL Version 3.23.6, когда авторы представили цитирование идентификаторов (имена баз данных, таблиц и столбцов) с помощью апострофа (`). Двойная кавычка (") также будет работать, чтобы цитировать идентификаторы, если Вы выполняетесь в ANSI-режиме. Подробности в разделе "1.4.3 Запуск MySQL в ANSI-режиме".

ИдентификаторМаксимальная длина Допустимые символы
База данных64Любые символы, допустимые в имени каталога, кроме / или ..
Таблица64Любые символы, допустимые в имени файла, кроме / или ..
Столбец64Все символы.
Псевдоним255Все символы.

Обратите внимание, что в дополнение к вышеупомянутому, Вы не можете иметь в идентификаторе символы цитирования, а также ASCII(0) или ASCII(255).

Обратите внимание, что, если идентификатор представляет собой ограниченное слово или содержит специальные символы, Вы должны всегда цитировать его с `:

SELECT * from `select` where `select`.id > 100;

В предыдущих версиях MySQL правила для имен были следующими:

Рекомендуется, чтобы Вы не использовали имена, подобные 1e потому, что выражение вроде 1e+1 неоднозначно. Это может интерпретироваться как выражение 1e+1 или как число 1e+1.

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

Ссылка на столбецЗначение
col_nameСтолбец col_name из любой таблицы, используемой в запросе, содержащем это имя.
tbl_name.col_nameСтолбец col_name из таблицы tbl_name текущей базы данных.
db_name.tbl_name.col_nameСтолбец col_name из таблицы tbl_name базы данных db_name. Эта форма доступна в MySQL Version 3.22 или позже.
`column_name`Столбец, который является ключевым словом или содержит специальные символы.

Вы не должны определять префикс tbl_name или db_name.tbl_name для столбца в инструкции, если ссылка однозначна. Например, есть таблицы t1 и t2, каждая содержит столбец c, и Вы получаете c командой SELECT, которая использует t1 и t2. В этом случае c неоднозначен потому, что он не уникален среди таблиц, используемых в инструкции, так что Вы должны указать, что Вы имеете в виду: t1.c или t2.c. Точно так же, если Вы получаете данные из таблицы t в базе данных db1 и из таблицы t в базе данных db2, Вы должны обратиться к столбцам в тех таблицах как db1.t.col_name и db2.t.col_name.

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

3.3 Чувствительность к регистру в именах

В MySQL базы данных и таблицы соответствуют каталогам и файлам внутри тех каталогов. Следовательно, чувствительность операционной системы определяет чувствительность к регистру имен таблицы и базы данных. Это означает, что имена баз данных и таблиц чувствительны к регистру в Unix и нечувствительны в Windows. Подробности в разделе "1.4.1 MySQL-расширения для ANSI SQL92".

ОБРАТИТЕ ВНИМАНИЕ: Несмотря на отсутствие чувствительности к регистру имен баз данных и таблиц в Windows, СУБД все же такое различие делает. Так что в рамках одного запроса надо использовать одно и то же имя. Например, этот запрос не сработает из-за одновременного применения my_table и MY_TABLE:

mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;

Имена столбца нечувствительны к регистру символов во всех случаях.

Псевдонимы для таблиц чувствительны к регистру. Например, этот запрос не сработает из-за одновременного применения a и A:

mysql> SELECT col_name FROM tbl_name AS a
           WHERE a.col_name = 1 OR A.col_name = 2;

Псевдонимы для столбцов нечувствительны к регистру.

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

Один способ избежать этой проблемы состоит в том, чтобы запустить mysqld с опцией -O lower_case_table_names=1. По умолчанию эта опция установлена в 1 под Windows и в 0 под Unix.

Если lower_case_table_names равен 1, MySQL преобразует все имена таблицы в строчные буквы. Обратите внимание, что, если Вы изменяете эту опцию, Вы должны сначала преобразовать Ваши старые имена таблиц в строчные буквы перед запуском сервера mysqld.

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

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

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

Вы можете устанавливать переменную через вызов SET:

SET @variable = {integer expression|real expression|string expression}
                [,@variable= ...].

Вы можете также устанавливать переменную в выражении @variable:=expr:

select @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
  +----------------------+------+------+------+
  | @t1:=(@t2:=1)+@t3:=4 | @t1  | @t2  | @t3  |
  +----------------------+------+------+------+
  |                    5 |    5 |    1 |    4 |
  +----------------------+------+------+------+

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

Переменные пользователя могут применяться там, где позволяются выражения. Обратите внимание, что это в настоящее время не включает использование в контекстах, где явно требуется число, например, в предложении LIMIT вызова SELECT, или в предложении IGNORE number LINES в инструкции LOAD DATA.

ОБРАТИТЕ ВНИМАНИЕ: В инструкции SELECT каждое выражение вычислено только тогда, когда оно послано пользователю. Это означает, что в HAVING, GROUP BY или ORDER BY Вы не можете обратиться к выражению, которое включает переменные, которые установлены в SELECT. Например, следующая инструкция НЕ будет работать как ожидается:

SELECT (@aa:=id) AS a, (@aa+3) AS b FROM table_name HAVING b=5;

Причина: @aa будет содержать не значение текущей строки, а значение id предыдущей принятой строки.

3.5 Комментарии

Сервер MySQL поддерживает стили комментариев # до конца строки, -- до конца строки и /* в строке или в нескольких строках */:

mysql> select 1+1;     # Этот комментарий продолжается до конца строки.
mysql> select 1+1;     -- Этот тоже.
mysql> select 1 /* это комментарий, встроенный в строку */ + 1;
mysql> select 1+
/*
Это комментарий,
занимающий несколько строк.
*/
1;

Обратите внимание, что стиль комментария -- требует, чтобы Вы имели по крайней мере один пробел после --!

Хотя сервер понимает синтаксис комментария, имеются некоторые ограничения на путь, которым клиент mysql анализирует комментарии /* ... */:

Эти ограничения применяются, когда Вы выполняете mysql в интерактивном режиме и тогда, когда Вы помещаете команды в файл и сообщаете, чтобы mysql читал ввод из этого файла командой mysql < some-file.

MySQL не поддерживает ANSI SQL стиль комментария `--'. Подробности в разделе "1.4.4.8 `--' как начало комментария".

3.6 Как MySQL работает с зарезервированными словами

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

Следующие слова явно зарезервированы в MySQL. Большинство их запрещается ANSI SQL92 для имен таблицы или столбца (например, group). Несколько слов зарезервированы потому, что MySQL нуждается в них и (в настоящее время) использует синтаксический анализатор yacc:
actionadd aggregateall
alterafter andas
ascavg avg_row_lengthauto_increment
betweenbigint bitbinary
blobboolboth by
cascadecase charcharacter
changecheck checksumcolumn
columnscomment constraintcreate
crosscurrent_date current_timecurrent_timestamp
datadatabase databasesdate
datetimeday day_hourday_minute
day_seconddayofmonth dayofweekdayofyear
decdecimal defaultdelayed
delay_key_writedelete descdescribe
distinctdistinctrow doubledrop
endelseescape escaped
enclosedenum explainexists
fieldsfile firstfloat
float4float8 flushforeign
fromforfull function
globalgrant grantsgroup
havingheap high_priorityhour
hour_minute hour_second hostsidentified
ignoreinindex infile
innerinsert insert_idint
integerinterval int1int2
int3int4int8 into
ifisisam join
keykeyskill last_insert_id
leadingleftlength like
lineslimitload local
locklogslong longblob
longtextlow_priority maxmax_rows
matchmediumblob mediumtextmediumint
middleintmin_rows minuteminute_second
modifymonth monthnamemyisam
naturalnumericno not
nullonoptimize option
optionallyororder outer
outfilepack_keys partialpassword
precisionprimary procedureprocess
processlistprivileges readreal
referencesreload regexprename
replacerestrict returnsrevoke
rlikerowrows second
selectsetshow shutdown
smallintsoname sql_big_tablessql_big_selects
sql_low_priority_updatessql_log_off sql_log_updatesql_select_limit
sql_small_resultsql_big_result sql_warningsstraight_join
startingstatus stringtable
tablestemporary terminatedtext
thentimetimestamp tinyblob
tinytexttinyint trailingto
typeuseusing unique
unlockunsigned updateusage
valuesvarchar variablesvarying
varbinarywithwrite when
whereyearyear_month zerofill

Следующие символы (из таблицы выше) отвергнуты ANSI SQL, но позволены MySQL как имена столбца/таблицы. Это потому, что некоторые из них представляют собой очень естественные и удобные имена, и много людей уже использовали их в работе:


4 Введение в администрирование

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

4.1 Резервирование баз данных

Поскольку таблицы MySQL сохранены как файлы, просто делайте копию. Чтобы получать непротиворечивую копию, скомандуйте LOCK TABLES на релевантных таблицах и дополните это командой FLUSH TABLES для них, дабы все данные были гарантированно сброшены на диск. Подробности по этим командам есть в разделах "9.7.2 Синтаксис LOCK TABLES/UNLOCK TABLES" и "4.8 Синтаксис FLUSH". Вам нужна только блокировка записи. Это позволяет другим потокам продолжать делать запросы к таблицам в то время, как Вы делаете копию файлов в каталоге баз данных. Команда FLUSH TABLE необходима, чтобы гарантировать, что все активные индексные страницы записаны на диск прежде, чем Вы запускаете процесс копирования.

Если Вы хотите делать копию уровня SQL из таблицы, Вы можете использовать SELECT INTO OUTFILE или BACKUP TABLE. Подробности в разделах "8.1 Синтаксис SELECT " и "4.2 Синтаксис BACKUP TABLE".

Другой способ поддержать базу данных состоит в том, чтобы использовать программу mysqldump или скрипт mysqlhotcopy. Подробности в разделах "12.5 mysqldump, Дамп структур таблиц и данных" и "12.6 mysqlhotcopy, Копирование баз данных и таблиц MySQL".

  1. Для полного резервирования баз данных надо скомандовать:
    shell> mysqldump --tab=/path/to/some/dir --opt --full
    
    или
    shell> mysqlhotcopy database /path/to/some/dir
    
    Вы можете также просто копировать все файлы таблицы (*.frm, *.MYD и *.MYI), пока сервер что-нибудь не модифицирует. Скрипт mysqlhotcopy использует этот метод.
  2. Если mysqld запущен, остановите его, а затем запустите с опцией --log-update[=file_name]. Подробнее об этой опции можно узнать в разделе "4.9.3 Файл регистрации модификаций". Файлы протоколов предоставляют Вам информацию относительно того, что изменилось со времени последнего вызова mysqldump.

Если Вы должны восстановить что-либо, попробуйте восстанавливать Ваши таблицы, используя REPAIR TABLE или myisamchk -r. Это эффективно в 99.9% случаев. Если myisamchk ничего хорошего не сделал, попробуйте следующую процедуру (это будет работать только, если Вы запустили MySQL с опцией --log-update):

  1. Восстановите оригинальную копию mysqldump.
  2. Выполните следующую команду, чтобы заново выполнить модификации в двоичном файле регистрации:
    shell> mysqlbinlog hostname-bin.[0-9]* | mysql
    
    Если Вы используете файл регистрации модификации, Вы можете использовать:
    shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql
    

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

Вы можете также делать выборочные копии: SELECT * INTO OUTFILE file_name FROM tbl_name и восстанавливать их: LOAD DATA INFILE file_name REPLACE .... Чтобы избежать двойных записей, Вам нужен PRIMARY KEY или UNIQUE в таблице. Ключевое слово REPLACE заменяет старые записи на новые, когда новая запись дублирует старую запись на уникальном значении ключа.

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

Если Вы используете файловую систему Veritas, Вы можете делать следующее:

  1. Выполните в клиенте (perl?) FLUSH TABLES WITH READ LOCK
  2. Выполните в другом клиенте или в копии оболочки команду mount vxfs snapshot.
  3. Выполните в первом клиенте UNLOCK TABLES
  4. Копируйте файлы из snapshot
  5. Размонтируйте snapshot

4.2 Синтаксис BACKUP TABLE

BACKUP TABLE tbl_name[,tbl_name...] TO '/path/to/backup/directory'

Эта команда делает копию всех файлов таблицы в резервный каталог, что является минимумом, необходимым, чтобы восстановить ее. Сейчас это работает только для таблиц MyISAM. Для них копируются файлы .frm (определение) и .MYD (данные). Индексный файл может быть восстановлен из этих двух.

Перед использованием этой команды, пожалуйста, ознакомьтесь с разделом "4.1 Резервирование баз данных".

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

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

СтолбецЗначение
TableИмя таблицы
OpОбязательно ``backup''
Msg_typeОдно из status, error, info или warning.
Msg_textСобственно сообщение.

Обратите внимание, что команда BACKUP TABLE доступна только в MySQL версии 3.23.25 и старше.

4.3 Синтаксис RESTORE TABLE

RESTORE TABLE tbl_name[,tbl_name...] FROM '/path/to/backup/directory'

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

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

СтолбецЗначение
TableИмя таблицы
OpОбязательно ``restore''
Msg_typeОдно из status, error, info или warning.
Msg_textСобственно сообщение.

4.4 Синтаксис CHECK TABLE

CHECK TABLE tbl_name[,tbl_name...] [option [option...]]
option = QUICK | FAST | MEDIUM | EXTENDED | CHANGED

CHECK TABLE работает только с таблицами типа MyISAM. На них данная команда эквивалентна myisamchk -m table_name.

Если Вы не определяете опций, используется MEDIUM.

Данная команда проверяет таблицу на ошибки. Для таблиц типа MyISAM модифицируется статистика ключа. Команда возвращает таблицу со следующими столбцами:

СтолбецЗначение
TableИмя таблицы.
OpОбязательно ``check''.
Msg_typeОдно из status, error, info или warning.
Msg_textСобственно сообщение.

Обратите внимание, что Вы можете получать много строк информации для каждой проверенной таблицы. Последняя строка будет иметь тип Msg_type status и значение OK, если все хорошо. Если ответов OK или Not checked нет, Вы должны выполнить ремонт таблицы. Сообщение Not checked говорит о том, что для данной таблицы TYPE сообщил MySQL, что там не было никакой потребности проверять таблицу.

Различные типы проверки:

ТипЗначение
QUICKНе просматривать строки, чтобы проверить неправильные связи.
FASTПроверить только те таблицы, которые не были закрыты правильно.
CHANGEDПроверить только те таблицы, которые не были закрыты правильно, и те, которые изменились со времен последней проверки.
MEDIUMСканировать строки для проверки правильности удаленных связей. Это также вычисляет контрольную сумму ключа для строк и проверяет ее правильность.
EXTENDEDВыполнить полную проверку всех ключей для всех строк в таблице. Это гарантирует, что таблица на 100% непротиворечива, но требует много времени!

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

Вы можете объединять параметры проверки:

CHECK TABLE test_table FAST QUICK;

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

ОБРАТИТЕ ВНИМАНИЕ: в ряде случаев CHECK TABLE изменяет таблицу! Это случается, если таблица отмечена как 'corrupted' (повреждена) или 'not closed properly' (не закрыта правильно), но команда CHECK TABLE не нашла проблем в таблице. В этой ситуации CHECK TABLE отметит таблицу как ok.

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

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

FAST и CHANGED обычно предназначены, чтобы использоваться из скрипта (например, из cron), если Вы хотите проверять таблицу время от времени. В большинстве случаев FAST имеет приоритет перед CHANGED.

EXTENDED должен использоваться после того, как Вы выполнили нормальную проверку, но все еще получаете странные ошибки из таблицы, когда MySQL пробует модифицировать строку или найти строку по ключу (это ОЧЕНЬ маловероятно, если нормальная проверка прошла спокойно!).

Некоторые вещи, сообщаемые проверкой таблиц, не могут быть исправлены в автоматическом режиме:

4.5 Синтаксис REPAIR TABLE

REPAIR TABLE tbl_name[,tbl_name...] [QUICK] [EXTENDED]

REPAIR TABLE тоже работает только на таблицах типа MyISAM и аналогичен вызову myisamchk -r table_name.

Обычно Вам никогда не придется выполнять эту команду, но в случае ошибок Вы, очень вероятно, вернете все Ваши данные из таблицы MyISAM с помощью команды REPAIR TABLE. Если Ваши таблицы разрушаются, Вы должны попробовать нахйти причину этого! Подробности по этому вопросу есть в разделе "11.4.1 Что делать, если MySQL рухнул".

REPAIR TABLE восстанавливает разрушенную таблицу. Команда возвращает таблицу со следующими столбцами:

СтолбецЗначение
TableИмя таблицы
OpОбязательно ``repair''
Msg_typeОдно из status, error, info или warning.
Msg_textСобственно сообщение.

Обратите внимание, что Вы можете получать много строк информации для каждой восстановленной таблицы. Последняя будет иметь тип Msg_type status и значение OK, если все в порядке. Если значение OK так и не появилось, Вы должны попробовать восстанавливать таблицу с помощью myisamchk -o, поскольку REPAIR TABLE еще не выполняет все параметры myisamchk. В ближайшем будущем планируется сделать ее более гибкой.

Если задан QUICK, MySQL пробует делать REPAIR только для индексного дерева.

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

4.6 Синтаксис OPTIMIZE TABLE

OPTIMIZE TABLE tbl_name[,tbl_name]...

OPTIMIZE TABLE должен использоваться, если Вы удалили большую часть таблицы, или если Вы сделали много изменений для таблицы со строками переменных длин (таблицы, которые имеют VARCHAR, BLOB или TEXT). Удаленные записи поддерживаются в связанном списке, и при последующем использовании операций INSERT повторно применяются старые позиции записей. Вы можете использовать OPTIMIZE TABLE, чтобы освободить неиспользуемое место и дефрагментировать файл данных.

Сейчас OPTIMIZE TABLE применим только к таблицам типов MyISAM и BDB. Для таблиц типа BDB OPTIMIZE TABLE в настоящее время отображается на вызов ANALYZE TABLE. Подробности об этом вызове в разделе "4.7 Синтаксис ANALYZE TABLE ".

Вы можете оптимизировать и другие типы таблиц запуском mysqld с опциями --skip-new или --safe-mode, но в этом случае OPTIMIZE TABLE превратится в вызов ALTER TABLE.

OPTIMIZE TABLE работает следующим образом:

OPTIMIZE TABLE для таблиц типа MyISAM эквивалентен вызову myisamchk --quick --check-changed-tables --sort-index --analyze.

Обратите внимание, что таблица будет блокирована в течение всего времени работы команды OPTIMIZE TABLE!

4.7 Синтаксис ANALYZE TABLE

ANALYZE TABLE tbl_name[,tbl_name...]

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

Это эквивалентно вызову myisamchk -a.

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

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

СтолбецЗначение
TableИмя таблицы
OpОбязательно ``analyze''
Msg_typeОдно из status, error, info или warning.
Msg_textСобственно сообщение.

Вы можете проверять сохраненное распределение ключей командой SHOW INDEX. Подробности в разделе "4.10.1 Получение информации о базах данных, таблицах, столбцах и индексах".

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

4.8 Синтаксис FLUSH

FLUSH flush_option [,flush_option]

Вы должны использовать команду FLUSH, если Вы хотите очищать внутренние кэши MySQL. Для выполнения FLUSH Вы должны иметь право RELOAD.

flush_option может быть любой из следующего списка:

HOSTSОсвобождает ведущие таблицы кэша. Вы должны это сделать, если некоторые из Ваших хостов изменяют IP, или если Вы получили сообщение об ошибке "Host ... is blocked". Когда в строке для данного компьютера происходит больше, чем max_connect_errors ошибок за время связи с сервером, MySQL приходит к выводу, что что-то пошло неправильно, и блокирует компьютер. Подробности в разделе "11.2.4 Ошибка Host '...' is blocked. Вы можете запустить mysqld с опцией -O max_connection_errors=999999999, чтобы избежать этого сообщения об ошибке.
LOGSЗакрывает и вновь открывает все журналы. Если Вы определили журнал модификаций или двоичный журнал без расширения, номер расширения журнала будет увеличен на один относительно предыдущего файла. Если Вы использовали расширение в имени файла, MySQL закроет и вновь откроет журнал модификаций. Это эквивалентно посылке на сервер mysqld сигнала SIGHUP.
PRIVILEGESПерезагружает привилегии из таблиц в базе данных mysql.
TABLESЗакрывает все открытые таблицы.
[TABLE|TABLES] table_name [,table_name...] Применяет предыдущую команду только к заданным таблицам.
TABLES WITH READ LOCKЗакрывает все открытые таблицы и блокирует все таблицы для всех баз данных с доступом только на чтение, пока не будет выполнена команда UNLOCK TABLES. Это очень удобный способ получить резервную копию, если Вы имеете файловую систему, подобную Veritas.
STATUSСбрасывает большинство переменных состояния к нулю. Используется при отладке запроса.

Вы можете также обращаться к каждой из команд, показанных выше с помощью утилиты mysqladmin, используя команды flush-hosts, flush-logs, reload или flush-tables.

4.9 Синтаксис KILL

KILL thread_id

Каждое подключение к mysqld выполняется в отдельном процессе. Вы можете видеть запущенные процессы командой SHOW PROCESSLIST и уничтожать процесс командой KILL thread_id.

Если Вы имеете привилегию process, Вы можете видеть и уничтожать все процессы. Иначе Вы можете видеть и уничтожать только Ваши собственные процессы.

Вы можете также использовать команды mysqladmin processlist и mysqladmin kill, чтобы исследовать и уничтожать процессы.

При вызове KILL для процесса устанавливается флаг kill flag.

В большинстве случаев может требоваться некоторое время для того, чтобы процесс уничтожился, поскольку флаг kill flag может быть проверен только в специфических интервалах:

4.10 Синтаксис SHOW

   SHOW DATABASES [LIKE wild]
   SHOW [OPEN] TABLES [FROM db_name] [LIKE wild]
   SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE wild]
   SHOW INDEX FROM tbl_name [FROM db_name]
   SHOW TABLE STATUS [FROM db_name] [LIKE wild]
   SHOW STATUS [LIKE wild]
   SHOW VARIABLES [LIKE wild]
   SHOW LOGS
   SHOW [FULL] PROCESSLIST
   SHOW GRANTS FOR user
   SHOW CREATE TABLE table_name
   SHOW MASTER STATUS
   SHOW MASTER LOGS
   SHOW SLAVE STATUS

SHOW обеспечивает информацию относительно баз данных, таблиц, столбцов или информацию состояния сервера. Если используется часть LIKE wild, строка wild может быть строкой, которая использует групповые символы SQL % и _.

4.10.1 Получение информации о базе данных, таблицах, столбцах и индексах

Вы можете использовать db_name.tbl_name как вариант для tbl_name FROM db_name. Эти две инструкции эквивалентны:

mysql> SHOW INDEX FROM mytable FROM mydb;
mysql> SHOW INDEX FROM mydb.mytable;

SHOW DATABASES вносит в список базы данных на сервере MySQL. Вы можете также получать этот список, используя команду mysqlshow.

SHOW TABLES вносит в список таблицы в заданной базе данных. Вы можете также получать этот список, используя команду mysqlshow db_name.

ОБРАТИТЕ ВНИМАНИЕ: Если пользователь не имеет привилегий для таблицы, соответствующая таблица не будет обнаруживаться в выводе SHOW TABLES или mysqlshow db_name.

SHOW OPEN TABLES вносит в список таблицы, которые являются в настоящее время открытыми в кэше таблиц. Поле Comment сообщает сколько раз таблица кэшируется (cached) и используется (in_use).

SHOW COLUMNS вносит в список столбцы в данной таблице. Если Вы определяете опцию FULL, Вы также получите привилегии, которые Вы имеете для каждого столбца. Если типы столбцов отличны от ожидаемых, они будут основаны на инструкции CREATE TABLE, заметьте, что MySQL иногда сам изменяет типы столбца. Подробности в разделе "7.3.1 Тихие изменения спецификации столбца".

Инструкция DESCRIBE обеспечивает информацию, подобную SHOW COLUMNS. Подробности в разделе "9.1.2 Синтаксис DESCRIBE (получение информации о столбцах)".

SHOW FIELDS является синонимом для SHOW COLUMNS, а SHOW KEYS синонимом для SHOW INDEX. Вы можете также вносить в список столбцы таблицы или индексы с помощью команд mysqlshow db_name tbl_name или mysqlshow -k db_name tbl_name.

SHOW INDEX возвращает индексную информацию в формате, который очень походит на вызов SQLStatistics в ODBC. Следующие столбцы всегда будут возвращены:

СтолбецНазначение
TableИмя таблицы.
Non_unique0, если индекс не может содержать дубликаты.
Key_nameИмя индекса.
Seq_in_indexНомер последовательности столбца в индексе, начиная с 1 (не с 0!).
Column_nameИмя столбца.
CollationКак столбец сортируется в индексе. В MySQL это может иметь варианты `A' (по возрастанию) или NULL (не сортируемый).
CardinalityЧисло уникальных значений в индексе. Это модифицируется запуском isamchk -a.
Sub_partЧисло индексированных символов, если столбец только частично индексирован. NULL если весь ключ индексирован в полном объеме.
CommentРазличные замечания. Пока это сообщает, является ли индекс полнотекстовым (FULLTEXT) или нет.

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

4.10.2 Синтаксис SHOW TABLE STATUS

SHOW TABLE STATUS [FROM db_name] [LIKE wild]

SHOW TABLE STATUS (новинка в Version 3.23) работает подобно SHOW STATUS, но обеспечивает много информации относительно каждой таблицы. Вы можете также получать этот список, используя команду mysqlshow --status db_name. Следующие столбцы возвращены:

СтолбецЗачем он нужен
NameИмя таблицы.
TypeТип таблицы.
Row_formatФормат хранения строки (фиксированный, динамический или сжатый).
RowsЧисло строк.
Avg_row_lengthСредняя длина строки.
Data_lengthДлина файла данных.
Max_data_lengthМаксимальная длина файла данных.
Index_lengthДлина индексного файла.
Data_freeЧисло распределенных, но не используемых байт.
Auto_incrementСледующее значение auto_increment.
Create_timeКогда таблица была создана.
Update_timeКогда файл данных был в последний раз модифицирован.
Check_timeКогда таблица была в последний раз проверена на ошибки.
Create_optionsДополнительные параметры, используемые с CREATE TABLE.
CommentКомментарий, используемый при создании таблицы (или информация о том, почему MySQL не может обращаться к информации по данной таблицы).

Таблицы InnoDB сообщат свободное пространство в ней через поле комментария таблицы.

4.10.3 Синтаксис SHOW STATUS

SHOW STATUS обеспечивает информацию состояния сервера (подобно mysqladmin extended-status). Вывод походит на показанное ниже, хотя формат и числа будут другими:

+--------------------------+------------+
| Variable_name            | Value      |
+--------------------------+------------+
| Aborted_clients          | 0          |
| Aborted_connects         | 0          |
| Bytes_received           | 155372598  |
| Bytes_sent               | 1176560426 |
| Connections              | 30023      |
| Created_tmp_disk_tables  | 0          |
| Created_tmp_tables       | 8340       |
| Created_tmp_files        | 60         |
| Delayed_insert_threads   | 0          |
| Delayed_writes           | 0          |
| Delayed_errors           | 0          |
| Flush_commands           | 1          |
| Handler_delete           | 462604     |
| Handler_read_first       | 105881     |
| Handler_read_key         | 27820558   |
| Handler_read_next        | 390681754  |
| Handler_read_prev        | 6022500    |
| Handler_read_rnd         | 30546748   |
| Handler_read_rnd_next    | 246216530  |
| Handler_update           | 16945404   |
| Handler_write            | 60356676   |
| Key_blocks_used          | 14955      |
| Key_read_requests        | 96854827   |
| Key_reads                | 162040     |
| Key_write_requests       | 7589728    |
| Key_writes               | 3813196    |
| Max_used_connections     | 0          |
| Not_flushed_key_blocks   | 0          |
| Not_flushed_delayed_rows | 0          |
| Open_tables              | 1          |
| Open_files               | 2          |
| Open_streams             | 0          |
| Opened_tables            | 44600      |
| Questions                | 2026873    |
| Select_full_join         | 0          |
| Select_full_range_join   | 0          |
| Select_range             | 99646      |
| Select_range_check       | 0          |
| Select_scan              | 30802      |
| Slave_running            | OFF        |
| Slave_open_temp_tables   | 0          |
| Slow_launch_threads      | 0          |
| Slow_queries             | 0          |
| Sort_merge_passes        | 30         |
| Sort_range               | 500        |
| Sort_rows                | 30296250   |
| Sort_scan                | 4650       |
| Table_locks_immediate    | 1920382    |
| Table_locks_waited       | 0          |
| Threads_cached           | 0          |
| Threads_created          | 30022      |
| Threads_connected        | 1          |
| Threads_running          | 1          |
| Uptime                   | 80380      |
+--------------------------+------------+

Переменные состояния, перечисленные выше, имеют следующие значения:

ПеременнаяЗначение
Aborted_clientsЧисло подключений, прерванных потому, что клиент не закрыл подключение правильно. Подробности в разделе "11.2.9 Ошибки связи/прерванные соединения".
Aborted_connectsЧисло попыток соединиться с сервером MySQL, которые потерпели неудачу. Подробности в разделе "11.2.9 Ошибки связи/прерванные соединения".
Bytes_receivedЧисло байт, полученных с клиентов.
Bytes_sentЧисло байт, посланных клиентам.
ConnectionsЧисло попыток подключения к серверу MySQL.
Created_tmp_disk_tablesЧисло неявных временных таблиц на диске, созданных при выполнении инструкций.
Created_tmp_tablesЧисло неявных временных таблиц в памяти, созданных при выполнении инструкций.
Created_tmp_filesСколько временных файлов создал mysqld.
Delayed_insert_threadsЧисло отсроченных потоков драйвера вставки в использовании.
Delayed_writesЧисло строк, записанных со INSERT DELAYED.
Delayed_errorsЧисло строк, записанных со INSERT DELAYED, для которых произошла ошибка (вероятно, двойной ключ (duplicate key) был использован).
Flush_commandsЧисло выполненных команд FLUSH.
Handler_deleteСколько раз строка была удалена из таблицы.
Handler_read_firstСколько раз первая запись читалась из индекса. Если это значение высоко, предполагается, что сервер делал много полных просмотров индекса, например, SELECT col1 FROM foo, считая, что col1 индексирован.
Handler_read_keyЧисло запросов на чтение строки, основанных на ключе. Если это значение высоко, это значит, что Ваши запросы и таблицы были правильно индексированы.
Handler_read_nextЧисло запросов на чтение следующей строки в порядке ключа. Это значение будет увеличено, если Вы запрашиваете индексный столбец с ограничением диапазона. Это также будет увеличено, если Вы делаете индексный просмотр.
Handler_read_rndЧисло запросов на чтение строк, основанных на фиксированной позиции. Это значение будет высоким, если Вы делаете много запросов, которые требуют сортировки результата.
Handler_read_rnd_nextЧисло запросов на чтение следующей строки в файле данных. Это значение будет высоким, если Вы делаете много просмотров таблицы. Вообще это предполагает, что Ваши таблицы не были правильно индексированы, или что Ваши запросы не используют индексы.
Handler_updateЧисло запросов на модификацию строк в таблице.
Handler_writeЧисло запросов на вставку строки в таблицу.
Key_blocks_usedЧисло используемых блоков в кэше ключа.
Key_read_requestsЧисло запросов на чтение блока ключа из кэша.
Key_readsЧисло физических чтений блока ключа с диска, а не из кэша.
Key_write_requestsЧисло запросов на запись блока ключа в кэш.
Key_writesЧисло физических записей блока ключа на диск, а не в кэш.
Max_used_connectionsМаксимальное число подключений в использовании одновременно.
Not_flushed_key_blocksЧисло блоков ключей в кэше ключа, которые изменились, но не сброшены на диск.
Not_flushed_delayed_rowsЧисло строк, ждущих записи в очередях запросов INSERT DELAY.
Open_tablesЧисло таблиц, которые являются открытыми.
Open_filesЧисло файлов, которые являются открытыми.
Open_streamsЧисло потоков, которые являются открытыми (используемыми, главным образом, для протоколирования).
Opened_tablesЧисло таблиц, которые были открыты.
Select_full_joinЧисло объединений без ключей (должно быть 0).
Select_full_range_joinЧисло объединений, где использовали поиск диапазона по таблице ссылок.
Select_rangeЧисло объединений, где использовали диапазоны в первой таблице. Это обычно не критическое, даже если это большое.
Select_scanЧисло объединений, где просмотрели первую таблицу.
Select_range_checkЧисло объединений без ключей, где проверяем использование ключа после каждой строки (должно быть 0).
QuestionsЧисло запросов, посланных серверу.
Slave_open_temp_tablesЧисло временных таблиц, в настоящее время открытых подчиненным процессом.
Slow_launch_threadsЧисло потоков, которым понадобилось для установления соединения больше, чем slow_launch_time.
Slow_queriesЧисло запросов, которые заняли больше, чем long_query_time.
Sort_merge_passesЧисло объединений, потребовавших сортировки. Если это значение большое, Вы должны рассмотреть увеличение sort_buffer.
Sort_rangeЧисло сортировок с диапазонами.
Sort_rowsЧисло сортируемых строк.
Sort_scanЧисло сортировок выполненных, просматривая таблицу.
Table_locks_immediateСколько раз блокировка таблицы применялась сразу. Доступно после версии 3.23.33.
Table_locks_waitedСколько раз блокировка таблицы не могла быть применена сразу и пришлось ждать. Если это значение высоко, и Вы имеете проблемы с эффективностью, Вы должны сначала оптимизировать Ваши запросы, а затем или разделить таблицу, или использовать репликацию. Доступно после 3.23.33.
Threads_cachedЧисло потоков в кэше.
Threads_connectedСколько в настоящее время открыто подключений.
Threads_createdЧисло потоков созданных, чтобы обработать подключения.
Threads_runningЧисло потоков, которые сейчас не бездействуют.
UptimeСколько секунд сервер уже работает.

Некоторые комментарии относительно вышеупомянутого:

4.10.4 Синтаксис SHOW VARIABLES

SHOW VARIABLES [LIKE wild]

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

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

+-------------------------+---------------------------+
| Variable_name           | Value                     |
+-------------------------+---------------------------+
| ansi_mode               | OFF                       |
| back_log                | 50                        |
| basedir                 | /my/monty/                |
| bdb_cache_size          | 16777216                  |
| bdb_log_buffer_size     | 32768                     |
| bdb_home                | /my/monty/data/           |
| bdb_max_lock            | 10000                     |
| bdb_logdir              |                           |
| bdb_shared_data         | OFF                       |
| bdb_tmpdir              | /tmp/                     |
| binlog_cache_size       | 32768                     |
| concurrent_insert       | ON                        |
| connect_timeout         | 5                         |
| datadir                 | /my/monty/data/           |
| delay_key_write         | ON                        |
| delayed_insert_limit    | 100                       |
| delayed_insert_timeout  | 300                       |
| delayed_queue_size      | 1000                      |
| flush                   | OFF                       |
| flush_time              | 0                         |
| have_bdb                | YES                       |
| have_innodb             | YES                       |
| have_raid               | YES                       |
| have_ssl                | NO                        |
| init_file               |                           |
| interactive_timeout     | 28800                     |
| join_buffer_size        | 131072                    |
| key_buffer_size         | 16776192                  |
| language                | /my/monty/share/english/  |
| large_files_support     | ON                        |
| log                     | OFF                       |
| log_update              | OFF                       |
| log_bin                 | OFF                       |
| log_slave_updates       | OFF                       |
| long_query_time         | 10                        |
| low_priority_updates    | OFF                       |
| lower_case_table_names  | 0                         |
| max_allowed_packet      | 1048576                   |
| max_binlog_cache_size   | 4294967295                |
| max_connections         | 100                       |
| max_connect_errors      | 10                        |
| max_delayed_threads     | 20                        |
| max_heap_table_size     | 16777216                  |
| max_join_size           | 4294967295                |
| max_sort_length         | 1024                      |
| max_tmp_tables          | 32                        |
| max_write_lock_count    | 4294967295                |
| myisam_recover_options  | DEFAULT                   |
| myisam_sort_buffer_size | 8388608                   |
| net_buffer_length       | 16384                     |
| net_read_timeout        | 30                        |
| net_retry_count         | 10                        |
| net_write_timeout       | 60                        |
| open_files_limit        | 0                         |
| pid_file                | /my/monty/data/donna.pid  |
| port                    | 3306                      |
| protocol_version        | 10                        |
| record_buffer           | 131072                    |
| query_buffer_size       | 0                         |
| safe_show_database      | OFF                       |
| server_id               | 0                         |
| skip_locking            | ON                        |
| skip_networking         | OFF                       |
| skip_show_database      | OFF                       |
| slow_launch_time        | 2                         |
| socket                  | /tmp/mysql.sock           |
| sort_buffer             | 2097116                   |
| table_cache             | 64                        |
| table_type              | MYISAM                    |
| thread_cache_size       | 4                         |
| thread_stack            | 65536                     |
| tmp_table_size          | 1048576                   |
| tmpdir                  | /tmp/                     |
| version                 | 3.23.29a-gamma-debug      |
| wait_timeout            | 28800                     |
+-------------------------+---------------------------+

Каждая опция описана ниже. Значения для буферных размеров, длин и размеров стека даны в байтах. Вы можете определять значения с суффиксами `K' или `M', чтобы указать килобайты или мегабайты. Например, 16M указывает 16 мегабайтов. Регистр символов суффикса не имеет значения: 16M и 16m эквивалентны.

ansi_mode.
ON, если mysqld запущен с опцией --ansi. Подробности в разделе "1.4.3 Запуск MySQL в режиме ANSI".
back_log
Сколько ожидающих обработки подключений может иметь MySQL. Это важно, когда главный процесс MySQL получает ОЧЕНЬ много запросов подключения за очень короткое время. Затем требуется некоторое время (хотя очень немного) для основного процесса, чтобы проверить подключение и запустить новый поток. Значение back_log указывает, сколько запросов могут быть сложены в стек в течение этого короткого времени прежде, чем MySQL на мгновение остановит ответы на новые запросы. Вы должны увеличить это только, если Вы ожидаете большое количество подключений за короткий периоде времени (сервер работает интенсивно).

Другими словами, это значение задает размер слушающей очереди для входящих подключений TCP/IP. Ваша операционная система имеет собственное ограничение размера этой очереди. В Unix man-страница listen(2) должна иметь большее количество деталей. Проверьте документацию на Вашу ОС для выяснения максимального значения для этой переменной. Попытка устанавливать back_log выше, чем это ограничение операционной системы, будет неэффективна, хотя и безопасна.

basedir
Значение опции --basedir.
bdb_cache_size
Буфер, который распределен, чтобы кэшировать индекс и строки для BDB-таблиц. Если Вы не используете таблицы BDB, Вы должны запустить mysqld с опцией --skip-bdb, чтобы не тратить впустую память для этого кэша.
bdb_log_buffer_size
Буфер, который распределен, чтобы кэшировать протоколы для BDB-таблиц. Если Вы не используете таблицы BDB, Вы должны запустить mysqld с опцией --skip-bdb, чтобы не тратить впустую память для этого кэша.
bdb_home
Значение опции --bdb-home.
bdb_max_lock
Максимальное число блокировок (по умолчанию 1000), которые Вы можете иметь активным на BDB-таблице. Вы должны увеличить это значение, если Вы получаете ошибки типа bdb: Lock table is out of available locks или Got error 12 from ..., когда Вы делаете длинные транзакции, или когда mysqld должен исследовать много строк, чтобы вычислить и обработать запрос.
bdb_logdir
Значение опции --bdb-logdir.
bdb_shared_data
ON, если Вы используете --bdb-shared-data.
bdb_tmpdir
Значение опции --bdb-tmpdir.
binlog_cache_size.
Размер кэша, чтобы хранить инструкции SQL для двоичного файла регистрации в течение транзакции. Если Вы часто используете большие, многооператорные транзакции, Вы можете увеличить это значение, чтобы получить большую эффективность. Подробности в разделе "9.2.1 Синтаксис BEGIN/COMMIT/ROLLBACK".
character_set
Набор символов по умолчанию.
character_sets
Поддерживаемые наборы символов.
concurrent_inserts
Если ON (значение по умолчанию), MySQL позволит Вам использовать INSERT на таблицах системы MyISAM в то же самое время, когда Вы выполняете на них запросы SELECT. Вы можете выключить эту опцию запуском mysqld с параметрами --safe или --skip-new.
connect_timeout
Число секунд, которое сервер mysqld ждет подключения перед ответом Bad handshake.
datadir
Значение опции --datadir.
delay_key_write
Если включено (по умолчанию), MySQL учитывает опцию delay_key_write в CREATE TABLE. Это означает, что буфер ключей для таблиц с этой опцией не будет сбрасываться на каждой индексной модификации, а только когда таблица будет закрыта. Это ускорит работу по записи, но Вы должны добавить автоматическую проверку всех таблиц командой myisamchk --fast --force. Обратите внимание, что, если Вы запускаете mysqld с опцией --delay-key-write-for-all-tables, это означает, что все таблицы будут обрабатываться так, как будто они были созданы с опцией delay_key_write. Вы можете очищать этот флажок, запуская mysqld с параметрами --skip-new или --safe-mode.
delayed_insert_limit
После вставки delayed_insert_limit строк, драйвер INSERT DELAYED проверит, имеется ли любая задержка инструкций SELECT. Если так, это позволяет им выполниться перед продолжением работ с таблицей.
delayed_insert_timeout
Сколько времени поток INSERT DELAYED должен ждать инструкции INSERT перед своим завершением.
delayed_queue_size
Каких размеров (в строках) очередь должна быть распределена для обработки INSERT DELAYED. Если очередь заполняется, любой пользователь, который вызвал INSERT DELAYED, будет ждать до появления свободного места в очереди.
flush
ON, если MySQL был запущен с опцией --flush.
flush_time
Если это установлено в значение, отличное от нуля, то каждые flush_time секунд все таблицы будут закрыты (чтобы освободить ресурсы и сбросить данные на диск). Я рекомендую эту опцию только на Win95, Win98 или на системах, где Вы имеете очень небольшое количество ресурсов.
have_bdb
YES, если mysqld поддерживает таблицы Berkeley DB. DISABLED, если использован параметр --skip-bdb.
have_innodb
YES, если mysqld поддерживает таблицы InnoDB. DISABLED, если использован параметр --skip-innodb.
have_raid
YES, если mysqld поддерживает опцию RAID.
have_ssl
YES, если mysqld поддерживает SSL (шифрование) по протоколу клиент/сервер.
init_file
Имя файла, определенного в параметре --init-file при запуске сервера. Это файл инструкций SQL, которые Вы хотите всегда выполнять при каждом запуске сервера.
interactive_timeout
Число секунд, которое сервер ждет действий на активном подключении перед его закрытием. Интерактивный пользователь определен как пользователь, который применяет опцию CLIENT_INTERACTIVE для mysql_real_connect(). См. также wait_timeout.
join_buffer_size
Размер буфера, который используется для полных объединений (объединения, которые не используют индексы). Буфер будет распределен один раз для каждого полного объединения между двумя таблицами. Увеличьте это значение, чтобы ускорить полное объединение, если добавление индексов невозможно. Обычно самый лучший способ получать быстрые объединения состоит в том, чтобы добавить индексы таблицы.
key_buffer_size
Индексные блоки буферизированы и разделяются всеми потоками. key_buffer_size как раз и задает размер буфера, используемого для индексных блоков. Увеличьте это значение, чтобы улучшить индексную обработку. Но если Вы сделаете его слишком большим (больше, чем 50% общей памяти?), Ваша система может начать использовать своп и стать ДЕЙСТВИТЕЛЬНО медленной. Не забудьте, что поскольку MySQL не кэширует чтение данных, Вы должны оставить некоторый участок памяти для кэша файловой системы ОС.

Вы можете проверять эффективность буфера ключей выполнением show status и изучением переменных Key_read_requests, Key_reads, Key_write_requests и Key_writes. Коэффициент Key_reads/Key_read_request обычно должен быть < 0.01. Key_write/Key_write_requests обычно близко к 1, если Вы используете обычное обновление/удаление, но может быть намного меньше, если Вы имеете тенденцию делать модификации, которые воздействуют на много данных сразу, или если Вы используете delay_key_write. Подробности в разделе "4.10 Синтаксис SHOW".

Чтобы получить заметное ускорение при записи многих строк сразу, используйте LOCK TABLES. Подробности в разделе "9.2.2 Синтаксис LOCK TABLES/UNLOCK TABLES".

language
Язык, используемый для сообщений об ошибках.
large_file_support
Если mysqld компилировался с параметрами для поддержки больших файлов.
locked_in_memory
Если mysqld был блокирован в памяти опцией --memlock
log
Если включено протоколирование всех запросов.
log_update
Регистрации всех запросов допускается.
log_bin
Файл регистрации модификации включен.
log_slave_updates
Модификации с подчиненного регистрируются.
long_query_time
Если запрос занимает больше, чем заданное здесь время (в секундах), счетчик Slow_queries будет увеличен. Если Вы используете --log-slow-queries, запрос будут регистрироваться в файле регистрации медленных запросов.
lower_case_table_names
Если установлено в 1, имена таблиц будут сохранены на диске в нижнем регистре, и они не будут чувствительны к регистру. Подробности в разделе "3.3 Чувствительность к регистру символов в именах".
max_allowed_packet
Максимальный размер одного пакета. Буфер сообщений инициализирован для размера в net_buffer_length байт, но может вырасти до max_allowed_packet байт, когда необходимо. Это значение по умолчанию маленькое, но позволяет захватывать большие (возможно, неправильные) пакеты. Вы должны увеличить это значение, если используете большие столбцы BLOB. Он должно быть столь же большим как самый крупный BLOB, который Вы хотите использовать. Текущий протокол ограничивает max_allowed_packet размером 16M.
max_binlog_cache_size
Если многооператорная транзакция требует больше, чем этот объем памяти, выйдет ошибочка "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage".
max_binlog_size
Доступно после версии 3.23.33. Если запись в двоичный файл регистрации (для репликации) превышает данное значение, выполняется ротация файлов. Вы не можете устанавливать это значение меньше, чем в 1024 байта, или больше, чем 1 GB. Значение по умолчанию 1 GB.
max_connections
Число одновременно допущенных клиентов. Увеличение этого значения увеличивает число описателей файла, которых требует mysqld. Подробности в разделе "11.2.5 Ошибка Too many connections".
max_connect_errors
Если имеется больше, чем это число, прерванных подключений с хоста, хост будет блокирован, и никакие подключения с него станут невозможными вообще. Вы можете снова открыть хост командой FLUSH HOSTS.
max_delayed_threads
Не запускать больше, чем это число потоков, чтобы обработать инструкции INSERT DELAYED. Если Вы попробуете вставлять данные в новую таблицу после того, как все потоки INSERT DELAYED будут заняты, строка будет вставлена, как будто атрибут DELAYED не был определен вовсе, то есть немедленно.
max_heap_table_size
Не позволять создание heap-таблиц больше этого числа.
max_join_size
Объединения, которые, вероятно, собираются читать больше, чем сказано в max_join_size, возвращают ошибку. Установите это значение, если Ваши пользователи имеют тенденцию выполнять объединения, которые испытывают недостаток предложения WHERE, занимают много времени или возвращают миллионы строк.
max_sort_length
Число байтов, чтобы использовать при сортировке значений BLOB или TEXT (только первые max_sort_length байтов из каждого значения реально используются, остальное игнорируется вообще).
max_user_connections
Максимальное число активных подключений для одного пользователя (0 = нет никаких ограничений).
max_tmp_tables
Максимальное число временных таблиц, которые пользователь может хранить открытыми в один момент времени.
max_write_lock_count
После этого количества блоикоровок записи допускается выполнение между делом блокировок чтения.
myisam_recover_options
Значение параметра --myisam-recover.
myisam_sort_buffer_size
Буфер, который распределен для сортировки индекса при выполнении REPAIR или при создании индексов с помощью CREATE INDEX или ALTER TABLE.
myisam_max_extra_sort_file_size.
Если создание временного файла для быстрой генерации индекса много больше, чем использование кэша ключей. то предпочтительнее метод кэша. Это значение используется, главным образом, чтобы вынудить длинные символьные ключи в больших таблицах использовать более медленный метод создания индекса. ОБРАТИТЕ ВНИМАНИЕ, что этот параметр задан в мегабайтах!
myisam_max_sort_file_size
Максимальный размер временного файла, который MySQL позволяет использовать при освежении индекса (в течение REPAIR, ALTER TABLE или LOAD DATA INFILE. Если размер файла больше, чем это значение, индекс будет создан через кэш ключа, который является более медленным. ОБРАТИТЕ ВНИМАНИЕ, что этот параметр задан в мегабайтах!
net_buffer_length
Буфер связи будет приведен к этому размеру между запросами. Это обычно не должно изменяться, но если Вы имеете очень мало памяти, Вы можете устанавливать это значение в ожидаемый размер запроса. То есть в ожидаемую длину инструкций SQL, посланных клиентами. Если запрос превышает эту длину, буфер будет автоматически расширен до max_allowed_packet байт.
net_read_timeout
Сколько секунд ждать данные из подключения перед прерыванием чтения. Обратите внимание, что, когда мы не ожидаем данные из подключения, время ожидания определено через write_timeout. См. также slave_read_timeout.
net_retry_count
Если чтение на коммуникационном порте прервано, оно повторится несколько раз перед отменой попыток связи. Это значение должно быть очень велико на FreeBSD, поскольку там внутренние прерывания посланы всем серверным процессам чтения.
net_write_timeout
Число секунд ожидания блока, который будет записан в подключение.
open_files_limit
Если это не 0, mysqld использует это значение, чтобы резервировать описатели файла для применения с setrlimit(). Если это значение = 0, mysqld резервирует max_connections*5 или max_connections+table_cache*2 (используется большее из этих значений) число файлов. Вы должны попробовать увеличивать это значение, если mysqld выдает Вам ошибку 'Too many open files'.
pid_file
Значение параметра --pid-file.
port
Значение параметра --port.
protocol_version
Версия протокола, используемого сервером MySQL.
record_buffer
Каждый поток, который делает последовательный просмотр, распределяет буфер этого размера для каждой таблицы, которую просматривает. Если Вы делаете много последовательных просмотров, стоит увеличить это значение.
record_rnd_buffer
При чтении строк в сортируемом порядке после сортировки, строки читаются через этот буфер, чтобы избежать дисковых поисков. Если не задан, берется значение из переменной record_buffer.
query_buffer_size
Начальное распределение буфера запросов. Если большинство Ваших запросов имеет большую длину, Вы должны увеличить это!
safe_show_databases
Не показывать базы данных, для которых пользователь не имеет привилегий базы данных или таблицы. Это может улучшать защиту. См. также skip_show_databases.
server_id
Значение опции --server-id.
skip_locking
Если OFF, mysqld использует внешнюю блокировку.
skip_networking
Если ON, допустимы только локальные (сокетные) подключения.
skip_show_databases
Это предотвращает выполнение SHOW DATABASES, если пользователь не имеет привилегии PROCESS_PRIV. Это может улучшить защиту. См. также safe_show_databases.
slave_read_timeout
Число секунд, которое надлежит ждать данные из главного/подчиненного подключения перед прерыванием чтения.
slow_launch_time
Если создание потока занимает больше времени, чем это значение (в секундах), счетчик Slow_launch_threads будет увеличен.
socket
Unix-сокет, используемый сервером.
sort_buffer
Каждый поток, который должен делать сортировку, распределяет буфер этого размера. Увеличьте это значение для ускорения операций ORDER BY или GROUP BY. Подробности в разделе "11.4.4 Где MySQL хранит временные файлы".
table_cache
Число открытых таблиц для всех потоков. Увеличение этого значения увеличивает число описателей файла, которых требует mysqld. MySQL нуждается в двух описателях файла для каждой уникальной открытой таблицы. Вы можете проверять, должны ли Вы увеличить кэш таблицы, анализируя переменную Opened_tables. Подробности в разделе "4.10 Синтаксис SHOW". Удостоверьтесь, что Ваша операционная система может обрабатывать число описателей файла, подразумеваемых установкой table_cache. Если table_cache слишком велико, MySQL может исчерпать описатели файла и начать сбоить.
table_type
Тип таблицы по умолчанию.
thread_cache_size
Сколько потоков мы должны хранить в кэше для повторного использования. Когда пользователь отсоединяется, потоки пользователя будут помещены в кэш, если нет больше, чем thread_cache_size потоков. Все новые потоки сначала принимаются из кэша и только, когда кэш пуст, создаются новые. Эта переменная может увеличиваться, чтобы улучшить эффективность, если Вы имеете много новых подключений.
thread_concurrency
На Solaris mysqld вызовет thr_setconcurrency() с этим значением. thr_setconcurrency() разрешает прикладной программе давать системе управления данные относительно желательного числа потоков, которые должны быть выполнены в одно и то же время.
thread_stack
Размер стека для каждого потока. Многие из ограничений, обнаруженных тестом crash-me, зависят от этого значения. Значение по умолчанию достаточно большое для нормальной работы.
timezone
Таймзона (часовой пояс) для сервера.
tmp_table_size
Если временная таблица в памяти превышает этот размер, MySQL автоматически преобразует ее в таблицу MyISAM на диске. Увеличьте значение tmp_table_size, если Вы делаете много продвинутых запросов GROUP BY, и Вы имеете много памяти.
tmpdir
Каталог, используемый для временных файлов и таблиц.
version
Код версии сервера.
wait_timeout
Число секунд, которое сервер ждет действий на подключении перед его закрытием. См. также interactive_timeout.

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

4.10.5 Синтаксис SHOW LOGS

SHOW LOGS показывает Вам информацию относительно состояния существующих журналов. В настоящее время этот вызов отображает только информацию относительно журналов Berkeley DB.

4.10.6 Синтаксис SHOW PROCESSLIST

SHOW PROCESSLIST показывает Вам, которые процессы работают. Вы можете также получать эту информацию, используя команду mysqladmin processlist. Если Вы имеете привилегию process, Вы можете видеть все процессы. Иначе Вы можете видеть только Ваши собственные процессы. Если Вы не используете опцию FULL, то только первые 100 символов каждого запроса будут показаны. Подробности в разделе "4.9 Синтаксис KILL".

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

4.10.7 Синтаксис SHOW GRANTS

SHOW GRANTS FOR user вносит в список команды, который должны быть выданы, чтобы дублировать права пользователя. Например:

mysql> SHOW GRANTS FOR root@localhost;
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+

4.10.8 Синтаксис SHOW CREATE TABLE

Показывает инструкцию CREATE TABLE, которая создаст данную таблицу. Например:

mysql> show create table t\G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE t (
  id int(11) default NULL auto_increment,
  s char(60) default NULL,
  PRIMARY KEY (id)
) TYPE=MyISAM

4.11 Файл опций my.cnf

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

MySQL читает заданные по умолчанию параметры из следующих файлов (в Unix):

Имя файлаЗачем он нужен
/etc/my.cnfГлобальные опции для всех
DATADIR/my.cnfОпции для сервера
defaults-extra-fileФайл, определенный через --defaults-extra-file=#
~/.my.cnfСпецифические для пользователей опции

DATADIR представляет собой каталог данных MySQL (обычно /usr/local/mysql/data для бинарного дистрибутива или /usr/local/var для установки из исходников). Обратите внимание, что это тот каталог, который был определен в конфигурации, а не указан в опции --datadir при запуске mysqld! Параметр --datadir не имеет никакого эффекта в то время, когда сервер ищет файлы опций потому, что он их ищет прежде, чем обрабатывает любые параметры командной строки.

MySQL читает заданные по умолчанию параметры из следующих файлов (только в ОС Windows):

Имя файлаЗачем он нужен
windows-system-directory\my.iniГлобальные опции
C:\my.cnfГлобальные опции
C:\mysql\data\my.cnfОпции для сервера

Обратите внимание, что в Windows Вы должны определить все пути с / вместо \. Если Вы используете \, Вы должны определить это дважды, поскольку \ символ ESC в MySQL.

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

Следующие программы поддерживают файлы опций: mysql, mysqladmin, mysqld, mysqldump, mysqlimport, mysql.server, myisamchk и myisampack.

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

Файл опций может содержать строки следующих форм:

#comment
Строки комментария начинаются с `#' или с `;'. Пустые строки игнорируются.
[group]
group представляет собой имя программы или группы, для которой Вы хотите устанавливать параметры. После строки группы любая строка option или set-variable обращается к именованной группе, пока не будет достигнут конец файла опций или другая строка группы.
option
Эквивалентно --option в командной строке.
option=value
Эквивалентно --option=value в командной строке.
set-variable = variable=value
Эквивалентно --set-variable variable=value в командной строке. Этот синтаксис должен использоваться, чтобы установить переменную mysqld.

Группа client позволяет Вам определять параметры, которые обращаются ко всей клиентуре MySQL (но не к mysqld). Это самая подходящая группа, чтобы определить в ней пароль, который Вы используете, чтобы соединиться с сервером. Но удостоверьтесь, что файл опций читаем и перезаписываем только Вами.

Обратите внимание, что для параметров и значений все конечные и начальные пробелы автоматически удалены. Вы можете использовать управляющие последовательности \b, \t, \n, \r, \\ и \s в Вашей строке (\s==пробел).

Имеется типичный глобальный файл опций:

[client]
port=3306
socket=/tmp/mysql.sock

[mysqld]
port=3306
socket=/tmp/mysql.sock
set-variable = key_buffer_size=16M
set-variable = max_allowed_packet=1M

[mysqldump]
quick

Имеется типичный файл опций пользователя:

[client]
# The following password will be sent to all standard MySQL clients
password=my_password

[mysql]
no-auto-rehash
set-variable=connect_timeout=2

[mysqlhotcopy]
interactive-timeout

Если Вы имеете дистрибутив с исходниками, Вы найдете, что типовые файлы конфигурации называются my-xxxx.cnf в каталоге support-files. А вот в двоичном дистрибутиве смотрите в каталоге DIR/support-files, где DIR задает имя пути к каталогу установки MySQL (обычно /usr/local/mysql). В настоящее время имеются типовые файлы конфигурации для маленькой, средней, большой и очень большой системы. Вы можете копировать my-xxxx.cnf в Ваш основной каталог (переименуйте копию в .my.cnf), чтобы экспериментировать.

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

--no-defaultsНе читать любые файлы опций.
--print-defaultsПечатать имя программы и все параметры, которые ей передаются.
--defaults-file=full-path-to-default-fileИспользовать только данный файл конфигурации.
--defaults-extra-file=full-path-to-default-fileЧитать этот файл конфигурации после глобального файла опций, но перед чтением файла настроек пользователя.

Обратите внимание, что вышеупомянутые параметры должны быть первыми в командной строке, чтобы они работали! Однако, --print-defaults может использоваться непосредственно после команды --defaults-xxx-file.

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

shell> my_print_defaults client mysql
--port=3306
--socket=/tmp/mysql.sock
--no-auto-rehash

Вышеупомянутый вывод содержит все параметры для групп client и mysql.


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

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

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

M
Указывает максимальный размер отображения. Максимальный допустимый размер отображения равен 255.
D
Применяется к типам с плавающей запятой и указывает число цифр после десятичной отметки. Максимальное возможное значение равно 30, но должно быть не больше, чем M-2.

Квадратные скобки ([ и ]) указывают части спецификаторов типа, которые являются факультативными.

Обратите внимание, что, если Вы определяете для столбца ZEROFILL, MySQL автоматически добавит к столбцу атрибут UNSIGNED.

TINYINT[(M)] [UNSIGNED] [ZEROFILL]
Очень маленькое целое число. Диапазон значений со знаком от -128 до 127. Диапазон значений без знака от 0 до 255.
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
Маленькое целое число. Диапазон со знаком от -32768 до 32767. Диапазон без знака от 0 до 65535.
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
Целое число средних размеров. Диапазон со знаком от -8388608 до 8388607. Диапазон значений без знака от 0 до 16777215.
INT[(M)] [UNSIGNED] [ZEROFILL]
Целое число нормального размера. Диапазон значений со знаком от -2147483648 до 2147483647. Диапазон значений без знака от 0 до 4294967295.
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
Синоним для INT.
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
Большое целое число. Диапазон значений со знаком от -9223372036854775808 до 9223372036854775807. Диапазон значений без знака от 0 до 18446744073709551615.

Некоторые вещи, которые Вы должны знать относительно столбцов типа BIGINT:

FLOAT(precision) [ZEROFILL]
Число с плавающей запятой. Не может быть без знака. Точность (precision) может быть в пределах <=24, для числа с одиночной точностью, или между 25 и 53, для числа двойной точности. Эти типы подобны FLOAT и DOUBLE, описанным ниже. FLOAT(X) имеет тот же самый диапазон, что и соответствующие типы FLOAT и DOUBLE, но размер отображения и число десятичных чисел неопределенны. В MySQL Version 3.23 это и есть истинное значение с плавающей запятой. В старых версиях MySQL FLOAT(precision) всегда имеет 2 десятичных числа. Обратите внимание, что использование типа FLOAT может создавать Вам некоторые непредвиденные проблемы, поскольку все вычисления в MySQL всегда выполнены с двойной точностью. Этот синтаксис предусмотрен для ODBC-совместимости.
FLOAT[(M,D)] [ZEROFILL]
Маленькое (с одиночной точностью) число с плавающей запятой. Не может быть без знака. Допустимые значения от -3.402823466E+38 до -1.175494351E-38, 0 и от 1.175494351E-38 до 3.402823466E+38. M задает размер отображения, а D число десятичных чисел. Соответствует FLOAT(X), где X <= 24.
DOUBLE[(M,D)] [ZEROFILL]
Число нормального размера (двойная точность) с плавающей запятой. Не может быть без знака. Допустимые значения от -1.7976931348623157E+308 до -2.2250738585072014E-308, 0 и от 2.2250738585072014E-308 до 1.7976931348623157E+308. M задает размер отображения, а D число десятичных чисел. Соответствует DOUBLE без параметра или FLOAT(X), где 25 <= X <= 53.
DOUBLE PRECISION[(M,D)] [ZEROFILL]
REAL[(M,D)] [ZEROFILL]
Синонимы для DOUBLE.
DECIMAL[(M[,D])] [ZEROFILL]
Распакованное число с плавающей запятой. Не может быть без знака. Ведет себя подобно столбцу CHAR: "распакованный" означает, что число сохранено как строка, используя один символ для каждой цифры значения. Десятичная отметка и, для отрицательных чисел, знак - не рассчитана в M (но пробел для них зарезервирован). Если D=0, значения не будут иметь никакой десятичной отметки или дробной части. Максимальный диапазон значений DECIMAL аналогичен DOUBLE, но фактический диапазон для данного столбца DECIMAL может быть задан через M и D. Если D не задано, оно будет установлено в 0. Если же не задано M, оно считается равным 10. Обратите внимание, что в MySQL Version 3.22 аргумент M должен включать пробел, необходимый для знака и десятичной отметки.
NUMERIC(M,D) [ZEROFILL]
Синоним для DECIMAL.
DATE
Дата. Поддерживаемый диапазон: от 1000-01-01 до 9999-12-31. MySQL отображает значения DATE в формате YYYY-MM-DD, но позволяет Вам назначать значения столбцам DATE используя строки или числа.
DATETIME
Комбинация даты и времени. Поддерживаемый диапазон: от 1000-01-01 00:00:00 до 9999-12-31 23:59:59. MySQL отображает значения типа DATETIME в формате YYYY-MM-DD HH:MM:SS, но позволяет Вам назначать значения столбцам DATETIME, используя строки или числа.
TIMESTAMP[(M)]
Метка времени. Поддерживаемый диапазон: от 1970-01-01 00:00:00 примерно до 2037. MySQL отображает значения типа TIMESTAMP в форматах YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD или YYMMDD, в зависмости от значения M: 14 (или пропущено), 12, 8 или 6, но позволяет Вам задавать значения столбцам TIMESTAMP, используя строки или числа. Столбец TIMESTAMP полезен для записи даты и времени операции INSERT или UPDATE потому, что он будет автоматически установлен к дате и времени самой последней операции, если Вы не задаете значение самостоятельно. Вы можете также устанавливать его к текущей дате и времени, назначая значение NULL. TIMESTAMP всегда сохраняется в 4 байтах. Параметр M воздействует только на то, как отображается столбец TIMESTAMP. Обратите внимание, что столбцы TIMESTAMP(X) при X, равном 8 или 14, являются числами, в то время как другие столбцы TIMESTAMP(X) представляют собой строки! Это только должно гарантировать, что можно надежно сбросить таблицу в дамп, а потом восстанавливать ее с этими типами!
TIME
Время. Поддерживаемый диапазон: от -838:59:59 до 838:59:59. MySQL отображает значения типа TIME в формате HH:MM:SS, но позволяет Вам задавать значения столбцам TIME, используя строки или числа.
YEAR[(2|4)]
Год с двумя или четыремя цифрами (по умолчанию задано 4). Допустимые значения: от 1901 до 2155, 0000 в формате года с 4 цифрами, и 1970-2069, если Вы используете формат с 2 цифрами (70-69). MySQL отображают значения YEAR в формате YYYY, но позволяет Вам указывать значения столбцам типа YEAR, используя строки или числа. Впервые тип YEAR появился в MySQL Version 3.22.
[NATIONAL] CHAR(M) [BINARY]
Строка фиксированной длины, которая всегда дополняется справа пробелами до определенной длины. Диапазон M от 1 до 255 символов. Конечные пробелы будут удалены, когда значение извлекается из таблицы. Переменные CHAR сортируются и сравниваются без учета регистра согласно заданному по умолчанию набору символов, если не задано ключевое слово BINARY. NATIONAL CHAR (короткая форма NCHAR) представляет собой взятый из ANSI SQL способ определить, что столбец CHAR должен использовать заданный набор символов CHARACTER. Это значение по умолчанию в MySQL. CHAR является сокращением для CHARACTER. MySQL позволяет Вам создавать столбец типа CHAR(0). Это главным образом полезно, когда Вы должны обеспечить совместимость с некоторыми старыми прикладными программами, которые зависят от существования столбца, но фактически не использует значение. Это также очень удобно, когда Вы нуждаетесь в столбце, который может брать только 2 значения: CHAR(0), который не определен как NOT NULL, займет всего лишь один бит и может принимать только 2 значения: NULL или "".
[NATIONAL] VARCHAR(M) [BINARY]
Строка переменной длины. A variable-length string. ОБРАТИТЕ ВНИМАНИЕ: Конечные пробелы будут автоматически удалены, когда значение сохранено (это отличается от спецификаций ANSI SQL). Диапазон M от 1 до 255 символов. Значения типа VARCHAR сортируются и сравниваются без учета регистра согласно заданному по умолчанию набору символов, если не задано ключевое слово BINARY. VARCHAR является сокращением для CHARACTER VARYING.
TINYBLOB
TINYTEXT
Столбцы BLOB или TEXT имеют максимальную длину в 255 (2^8-1) символов.
BLOB
TEXT
Столбцы BLOB или TEXT имеют максимальную длину в 65535 (2^16-1) символов.
MEDIUMBLOB
MEDIUMTEXT
Столбцы MEDIUMBLOB или MEDIUMTEXT имеют максимальную длину в 16777215 (2^24-1) символов.
LONGBLOB
LONGTEXT
Столбцы LONGBLOB или LONGTEXT имеют максимальную длину в 4294967295 (2^32-1) символов. Обратите внимание, что поскольку протокол клиент-сервер и таблицы MyISAM имеет в настоящее время ограничение в 16M на пакет связи/строку таблицы, Вы не можете использовать весь диапазон этого типа.
ENUM('value1','value2',...)
Перечисление. Строковый объект, который может иметь только одно значение, выбранное из списка значений value1, value2, ..., NULL или специальное значение ошибки "". ENUM может иметь максимум 65535 разных значений.
SET('value1','value2',...)
Множество. Строковый объект, который может иметь ноль или больше значений, каждое из которых должно быть выбрано из списка значений value1, value2, .... SET может иметь максимум 64 члена.

5.1 Числовые типы

MySQL поддерживает все числовые типы ANSI/ISO SQL92. Эти типы включают точные числовые типы данных (NUMERIC, DECIMAL, INTEGER и SMALLINT), а также приблизительные числовые типы данных (FLOAT, REAL и DOUBLE PRECISION). Ключевое слово INT представляет собой синоним для INTEGER, а ключевое слово DEC является синонимом для DECIMAL.

Типы NUMERIC и DECIMAL выполнены как тот же самый тип MySQL, как разрешено стандартом SQL92. Они используются для значений, для которых важно сохранить идеальную точность, например, с валютными данными. При объявлении столбца одного из этих типов точность и масштаб могут быть (и обычно бывают) определены, например:

   salary DECIMAL(9,2)

В этом примере 9 (точность, precision) представляет число значащих десятичных цифр, которые будут сохранены для значений, а 2 (масштаб, scale) представляет число цифр, которые будут сохранены после десятичной отметки. В этом случае, следовательно, диапазон значений, которые могут быть сохранены в столбце salary от -9999999.99 до 9999999.99. (MySQL может фактически сохранять числа до 9999999.99 в этом столбце потому, что не требуется сохранять знак для положительных чисел).

В ANSI/ISO SQL92 синтаксис DECIMAL(p) эквивалентен DECIMAL(p,0). Точно так же синтаксис DECIMAL является эквивалентным DECIMAL(p,0), где реализации позволяют менять значение p. MySQL в настоящее время не поддерживает никакую из этих различных форм типов данных DECIMAL/NUMERIC. Это не серьезная проблема, поскольку принципиальные выгоды этих типов происходят от способности управлять точностью и масштабом явно.

Значения типов DECIMAL и NUMERIC сохранены как строки, в не как двоичные числа с плавающей запятой, чтобы сохранить десятичную точность значений. Один символ используется для каждой цифры значения, десятичной отметки (если scale > 0) и знака - (для отрицательных чисел). Если scale равен 0, значения DECIMAL и NUMERIC не содержат никакой десятичной отметки или дробной части.

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

MySQL поддерживает как расширение стандарта ANSI/ISO SQL92 встроенные типы TINYINT, MEDIUMINT и BIGINT как перечислено в таблицах выше. Другое расширение поддержано MySQL для факультативного определения ширины отображения значения в круглых скобках после основного ключевого слова для типа (например, INT(4)). Эта факультативная спецификация ширины используется для вывода значений, чья ширина меньше, чем ширина, определенная для столбца, но не сдерживает диапазон значений, которые могут быть сохранены в столбце, или число цифр, которые будут отображаться для значений, чья ширина превышает заданную. Когда используется вместе с факультативным атрибутом расширения ZEROFILL, дополнение значения по умолчанию пробелами заменено на нули. Например, для столбца, объявленного как INT(5) ZEROFILL, значение 4 превратится в 00004. Обратите внимание, что, если Вы сохраняете значения большие, чем ширина отображения в целочисленном столбце, Вы можете испытывать проблемы, когда MySQL генерирует временные таблицы для некоторых сложных объединений, поскольку в этих случаях MySQL полагает, что данные вписывались в первоначальную ширину столбца.

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

Тип FLOAT используется, чтобы представить приблизительные числовые типы данных. Стандарт ANSI/ISO SQL92 позволяет факультативную спецификацию точности (но не диапазон образца) в битах после ключевого слова FLOAT в круглых скобках. MySQL-реализация также поддерживает эту факультативную спецификацию точности. Когда ключевое слово FLOAT используется для типа столбца без спецификации точности, MySQL применяет четыре байта, чтобы сохранить значения. Различный синтаксис также поддержан, с двумя числами, заданными в круглых скобках после ключевого слова FLOAT. С этой опцией первое число продолжает представлять требования к памяти для значения в байтах, а второе определяет число цифр, которые будут сохранены и отображаться после десятичной отметки (как с DECIMAL и NUMERIC). Когда MySQL нужно сохранить число для такого столбца с большим количеством цифр после десятичной отметки, чем определено для столбца, значение будет автоматически округлено, чтобы устранить лишние цифры.

Типы REAL и DOUBLE PRECISION не принимают спецификации точности. В качестве дополнения к стандарту ANSI/ISO SQL92 MySQL распознает DOUBLE как синоним для DOUBLE PRECISION. В отличие от требования стандарта, чтобы точность для REAL была меньшие, чем используемая для DOUBLE PRECISION, MySQL реализует то и другое как 8-байтные double-precision floating-point значения (при работе не в ANSI mode). Для максимальной мобильности код, требующий хранение приблизительных числовых значений данных должен использовать FLOAT или DOUBLE PRECISION без спецификации точности или количества чисел после десятичной точки.

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

Например, диапазон столбца INT от -2147483648 до 2147483647. Если Вы пробуете вставлять -9999999999 в столбец типа INT, значение будет усечено к нижей границе диапазона и сохранено -2147483648. Точно так же, если Вы пробуете вставлять 9999999999, вместо этого будет сохранено 2147483647.

Если столбец INT определен как UNSIGNED, размер диапазона столбца тот же самый, но произойдет сдвиг значений на 0 и 4294967295. Если Вы пробуете сохранять -9999999999 и 9999999999, значения, сохраненные в столбце, станут соответственно 0 и 4294967296.

Преобразования, которые происходят из-за усечения, сообщаются как ``warnings'' для инструкций ALTER TABLE, LOAD DATA INFILE, UPDATE и многострочного варианта INSERT.

5.2 Типы Date и Time

Типы даты и времени: DATETIME, DATE, TIMESTAMP, TIME и YEAR. Каждый из них имеет диапазон допустимых значений, также как и некий ноль, который используется, когда Вы определяете, действительно, запрещенное значение. Обратите внимание, что MySQL позволяет Вам сохранять некоторые недопустимые значения даты, например, 1999-11-31. Причина этого в том, что обрабатывать проверку даты ответственность прикладной программы, а не сервера SQL. Чтобы сделать проверку даты быстрой, MySQL проверяет только то, что месяц находится в диапазоне 0-12, и день находится в диапазоне 0-31. Вышеупомянутые диапазоны определены так потому, что MySQL позволяет Вам сохранять в столбцах DATE или DATETIME даты, где день или месяц нулевой. Это чрезвычайно полезно для прикладных программ, которые должны сохранить дату рождения, для которой Вы не знаете точную дату. В этом случае Вы просто сохраняете дату подобно 1999-00-00 или 1999-01-00. Вы, конечно, не можете получать правильное значение из функций, подобных DATE_SUB() или DATE_ADD, для таких неправильных дат.

Имеются некоторые общие вещи, которые стоит иметь в виду при работе с типами даты и времени:

5.2.1 Проблема Y2K и типы Date

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

Для типов DATETIME, DATE, TIMESTAMP и YEAR MySQL интерпретирует даты с неоднозначным годом так:

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

ORDER BY сортирует значения типов YEAR/DATE/DATETIME с 2 цифрами правильно.

Обратите внимание также, что некоторые функции, подобно MIN() и MAX(), преобразуют TIMESTAMP/DATE в число. Это означает, что timestamp с годом с 2 цифрами не будет работать правильно с этими функциями. Исправление в этом случае должно преобразовать TIMESTAMP/DATE к формату года с 4 цифрами или использовать нечто вроде MIN(DATE_ADD(timestamp,INTERVAL 0 DAYS)).

5.2.2 Типы DATETIME, DATE и TIMESTAMP

Типы DATETIME, DATE и TIMESTAMP связаны. Этот раздел описывает их характеристики и чем они отличаются.

Тип DATETIME используется, когда Вы нуждаетесь в значениях, которые содержат информацию о дате и времени. MySQL получает и отображает значения DATETIME в формате YYYY-MM-DD HH:MM:SS. Поддерживаемый диапазон от 1000-01-01 00:00:00 до 9999-12-31 23:59:59.

Тип DATE используется, когда Вы нуждаетесь только в значении даты, без части времени. MySQL получает и отображает значения DATE в формате YYYY-MM-DD. Поддерживаемый диапазон от 1000-01-01 до 9999-12-31.

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

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

Второй и последующие столбцы типа TIMESTAMP также могут быть установлены к текущей дате и времени. Только установите столбец в NULL или в NOW().

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

Значения TIMESTAMP имеют точность в одну секунду. Значения отображаются как числа.

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

Тип столбцаФормат отображения
TIMESTAMP(14)YYYYMMDDHHMMSS
TIMESTAMP(12)YYMMDDHHMMSS
TIMESTAMP(10)YYMMDDHHMM
TIMESTAMP(8)YYYYMMDD
TIMESTAMP(6)YYMMDD
TIMESTAMP(4)YYMM
TIMESTAMP(2)YY

Все столбцы типа TIMESTAMP имеют тот же самый размер памяти, независимо от размера отображения. Наиболее распространенные размеры: 6, 8, 12 и 14. Вы можете определять произвольный размер при создании таблицы, но значения 0 или больше, чем 14, будут установлены в 14. Нечетные размеры в диапазоне от 1 до 13 будут приведены к следующему четному числу.

Вы можете определять значения DATETIME, DATE и TIMESTAMP, использующие любой из общего набора форматов:

Запрещенные значения DATETIME, DATE или TIMESTAMP преобразованы в нулевое значение соответствующего типа (0000-00-00 00:00:00, 0000-00-00 или 00000000000000).

Для значений, определенных как строки, которые включают разделители частей даты, не требуется определять две цифры для значений месяца или дня, которые являются меньше, чем 10. 1979-6-9 эквивалентно 1979-06-09. Точно так же для значений, определенных как строки, которые включают разделители части времени, необязательно определять две цифры для значений часа, минут или секунды, которые меньше, чем 10. 1979-10-30 1:2:3 то же самое, что и 1979-10-30 01:02:03.

Значения, определенные как числа, должны быть длиной в 6, 8, 12 или 14 цифр. Если число длиной в 8 или 14 цифр, считается, что оно в формате YYYYMMDD или YYYYMMDDHHMMSS, и что год задан первыми 4 цифрами. Если число длиной в 6 или 12 цифр, считается, что оно в формате YYMMDD или YYMMDDHHMMSS, и что год задан первыми 2 цифрами. Числа, которые не соответствуют этим длинам, дополняются нулями до самой близкой длины.

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

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

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

Знайте некоторые ловушки при определении значений даты:

5.2.3 Тип TIME

MySQL получает и отображает значения TIME в формате HH:MM:SS (или HHH:MM:SS для больших значений часов). Значения TIME могут располагаться в диапазоне от -838:59:59 до 838:59:59. Причина того, что часть часов может быть настолько большой в том, что тип TIME может использоваться не только, чтобы представить время дня (которое должно быть меньше, чем 24 часа), но также и прошедшее время или интервал времени между двумя событиями (который может быть намного больше, чем 24 часа).

Вы можете определять значения TIME разными способами:

Для значений TIME, определенных как строки, которые включают разделитель частей времени, необязательно задавать две цифры для часов, минут или секунд, которые меньше 10. Указание 8:3:2 аналогично 08:03:02.

Будьте внимательны относительно назначения коротких значений TIME. Без точки с запятой MySQL интерпретирует значения, используя предположение, что крайние справа цифры представляют секунды. MySQL интерпретирует значения TIME как прошедшее время, а не время дня. Например, Вы могли задавать 1112 и 1112 как 11:12:00, но MySQL поймет это как 00:11:12. Точно так же 12 и 12 интерпретируются как 00:00:12. Значения TIME с точкой с запятой вместо этого, всегда обрабатываются как время дня. Так 11:12 будет означать 11:12:00, но не 00:11:12.

Значения, которые находятся вне диапазона TIME, но допустимы во всем остальном, будут усечены до соответствующей границы диапазона. Например, -850:00:00 и 850:00:00 превратятся в -838:59:59 и 838:59:59.

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

5.2.4 Тип YEAR

Тип YEAR представляет собой тип с 1 байтом, используемый для представления лет.

MySQL получает и отображает значения типа YEAR в формате YYYY. Диапазон: от 1901 до 2155.

Вы можете определять значения YEAR в форматах:

Запрещенные значения YEAR будут преобразованы в 0000.

5.3 Строковые типы

Строковыми считаются типы: CHAR, VARCHAR, BLOB, TEXT, ENUM и SET. Этот раздел описывает как работу типов, их требования к памяти и как использовать их в Ваших запросах. Сразу следует отметить, что к строковым причислены типы, которые в разных языках программирования таковыми не являются, например, ENUM и SET.

5.3.1 Типы CHAR и VARCHAR

Типы CHAR и VARCHAR подобны, но отличаются способом их хранения и получения.

Длина столбца CHAR фиксирована и задается, когда Вы создаете таблицу. Длина может быть любым значением между 1 и 255. В MySQL Version 3.23 длина CHAR может быть от 0 до 255. Когда значения CHAR сохраняются в таблице, они дополняются справа пробелами до нужной длины. Когда значения CHAR получены, конечные пробелы будут автоматически удалены.

Значения в столбцах VARCHAR представляют собой строки переменной длины. Вы можете объявлять, что столбец VARCHAR будет любой длины между 1 и 255, точно как для столбцов типа CHAR. Однако, в отличие от CHAR, значения VARCHAR сохранены, используя ровно столько символов, сколько надо, плюс один байт, чтобы записать длину (аналог типа String в языке Pascal). Значения не дополняются, вместо этого конечные пробелы будут удалены, когда значения сохранены в таблице. Это удаление пробелов отличается от спецификации ANSI SQL, там они остаются.

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

Таблица ниже иллюстрирует различия между двумя типами столбцов, показывая результат сохранения различных значений в CHAR(4) и VARCHAR(4):

ЗначениеCHAR(4) Для хранения надоVARCHAR(4) Для хранения надо
''' '4 байта ''1 байт
'ab''ab '4 байта 'ab'3 байта
'abcd''abcd'4 байта 'abcd'5 байт
'abcdefgh''abcd'4 байта 'abcd'5 байт

Значения, полученные из столбцов CHAR(4) и VARCHAR(4), будут те же самые в каждом случае потому, что конечные пробелы удалены из столбцов CHAR после поиска.

Значения в столбцах CHAR и VARCHAR сортируются и сравниваются без учета регистра, если атрибут BINARY не был определен, когда таблица была создана. Атрибут BINARY означает, что значения столбца сортируются и сравниваются с учетом регистра согласно порядку символов серверной (не клиентской!) машины MySQL. BINARY не воздействует на то, как столбец будет сохранен или получен.

Атрибут BINARY липкий. Это означает, что, если столбец, отмеченный как BINARY, используется в выражении, все выражение сравнивается как значение BINARY.

MySQL может тихо изменять тип столбца CHAR или VARCHAR при создании таблицы. Подробности в разделе "7.3.1 Тихие изменения спецификации столбца".

5.3.2 Типы BLOB и TEXT

BLOB представляет собой двоичный большой объект, который может хранить переменное количество данных. Есть четыре типа BLOB'ов: TINYBLOB, BLOB, MEDIUMBLOB и LONGBLOB, отличающиеся только по максимальной длине значений, которые они могут хранить.

Четыре типа TEXT: TINYTEXT, TEXT, MEDIUMTEXT и LONGTEXT соответствуют четырем типам BLOB и имеют те же самые максимальные длины и требования к памяти. Единственное различие между типами BLOB и TEXT в том, что сортировка выполняется с учетом регистра для значений типа BLOB и без учета регистра для TEXT.

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

В большинстве случаев Вы можете расценивать столбец TEXT как VARCHAR, который может быть столь большим, как Вы хотите. Точно так же Вы можете расценивать столбец BLOB как VARCHAR BINARY. Различия в том, что:

MyODBC определяет значения BLOB как LONGVARBINARY, а значения типа TEXT как LONGVARCHAR.

Поскольку значения BLOB и TEXT могут быть чрезвычайно длинными, Вы можете столкнуться с ограничениями при использовании:

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

5.3.3 Тип ENUM

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

Значение может также быть пустой строкой ("") или NULL при некоторых обстоятельствах:

Каждое значение перечисления имеет индекс:

Например, столбец, определенный как ENUM("one","two","three"), может иметь любое из значений, показанных ниже. Индекс каждого значения также показывается:

ЗначениеИндекс
NULLNULL
"" 0
"one"1
"two"2
"three"3

Перечисление может иметь максимум 65535 элементов.

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

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

mysql> SELECT enum_col+0 FROM tbl_name;

Если Вы сохраняете число в ENUM, он обрабатывается как индекс, и сохраненное значение представляет собой член перечисления с этим индексом. Однако, это не будет работать с вызовом LOAD DATA, который обрабатывает весь свой ввод как строки.

Значения ENUM сортируются согласно порядку, в котором члены перечисления были указаны в спецификации столбца. Другими словами, значения ENUM сортируются согласно их индексным числам. Например, "a" окажется перед "b" для ENUM("a","b"), но "b" опередит "a" для ENUM("b", "a"). Пустые строки окажутся перед непустыми строками, а значения NULL перед всеми другими значениями перечисления.

Если Вы хотите получать все возможные значения для столбца ENUM, Вы должны использовать SHOW COLUMNS FROM table_name LIKE enum_column_name и анализировать определение ENUM во втором столбце вывода.

5.3.4 Тип SET

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

Например, столбец, определенный как SET("one","two") NOT NULL, может иметь любое из этих значений:

""
"one"
"two"
"one,two"

SET может иметь максимум 64 различных членов.

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

mysql> SELECT set_col+0 FROM tbl_name;

Если число сохранено в столбце SET, биты, которые установлены в двоичном представлении числа, определяют члены набора в значении столбца. Предположим, что столбец определен как SET("a","b","c","d"). Члены имеют следующие разрядные значения:

SET член множества Десятичное значениеДвоичное значение
a10001
b20010
c40100
d81000

Если Вы назначаете число 9 этому столбцу (в двоичной системе это будет 1001), то первый и четвертый члены значения SET (то есть, "a" и "d") будут выбраны, и возникающим в результате значением будет "a,d".

Для значения, содержащего больше, чем один элемент SET, не имеет значения порядок элементов, в котором они перечислены, когда Вы вставляете значение. Также не важно, сколько раз данный элемент перечислен в значении. Когда значение потом будет получено из таблицы, каждый элемент в нем появится лишь однажды, причем элементы будут перечислены согласно порядку, в котором они были определены при создании таблицы. Например, если столбец определен как SET("a","b","c","d"), то "a,d", "d,a" и "d,a,a,d,d" будут появляться как "a,d" при получении данных из таблицы.

Значения SET сортируются в цифровой форме. NULL расположится перед другими значениями.

Обычно, Вы выполняете SELECT на столбце SET, применяя оператор LIKE или функцию FIND_IN_SET():

mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;

Но следующее будет также работать:

mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';
mysql> SELECT * FROM tbl_name WHERE set_col & 1;

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

Если Вы хотите получать все возможные значения для столбца SET, Вы должны использовать: SHOW COLUMNS FROM table_name LIKE set_column_name и анализировать второй столбец определения.

5.4 Выбор правильного типа для столбца

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

Точное представление денежных величин обычно является проблемой. В MySQL Вы должны использовать тип DECIMAL. Это сохранено как строка, так что никакая потеря точности не должна произойти. Если точность не слишком важна, тип DOUBLE также может быть достаточен.

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

5.5 Использование типов столбцов из других СУБД

Чтобы использовать код, написанный для реализаций SQL от других авторов, MySQL отображает типы столбцов как показано в таблице ниже. Эти отображения делают проще перенос определения таблиц:

Чужой типТип в MySQL
BINARY(NUM)CHAR(NUM) BINARY
CHAR VARYING(NUM)VARCHAR(NUM)
FLOAT4FLOAT
FLOAT8DOUBLE
INT1TINYINT
INT2SMALLINT
INT3MEDIUMINT
INT4INT
INT8BIGINT
LONG VARBINARYMEDIUMBLOB
LONG VARCHARMEDIUMTEXT
MIDDLEINTMEDIUMINT
VARBINARY(NUM)VARCHAR(NUM) BINARY

Отображение типа столбца происходит при создании таблицы. Если Вы создаете таблицу с типами, используемыми другими авторами, а затем выдаете команду DESCRIBE tbl_name, MySQL сообщает структуру таблицы, использующую эквивалентные типы MySQL.

5.6 Требования столбцов к памяти

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

5.2.6.1 Требования к памяти для чисел

Тип столбцаДля хранения надо
TINYINT1 байт
SMALLINT2 байта
MEDIUMINT3 байта
INT4 байта
INTEGER4 байта
BIGINT8 байта
FLOAT(X)4, если X <= 24, или 8, если 25 <= X <= 53
FLOAT4 байта
DOUBLE8 байта
DOUBLE PRECISION8 байта
REAL8 байта
DECIMAL(M,D)M+2 байт, если D > 0, M+1 байт, если D=0 (D+2, если M < D )
NUMERIC(M,D)M+2 байт, если D > 0, M+1 байт, если D=0 (D+2, если M < D )

5.2.6.2 Требования к памяти для даты и времени

Тип столбцаДля хранения надо
DATE3 байта
DATETIME8 байта
TIMESTAMP4 байта
TIME3 байта
YEAR1 байт

5.2.6.3 Требования к памяти для строк

Тип столбцаДля хранения надо
CHAR(M)M байт, 1 <= M <= 255
VARCHAR(M)L+1 байт, где L <= M и 1 <= M <= 255
TINYBLOB, TINYTEXTL+1 байт, где L < 2^8
BLOB, TEXTL+2 байта, где L < 2^16
MEDIUMBLOB, MEDIUMTEXT L+3 байта, где L < 2^24
LONGBLOB, LONGTEXTL+4 байта, где L < 2^32
ENUM('value1','value2',...)1 или 2 байта, в зависимости от количества значений перечисления (максимум 65535 значений)
SET('value1','value2',...)1, 2, 3, 4 или 8 байт, в зависимости от числа членов набора (максимум 64 члена)

Типы VARCHAR, BLOB и TEXT представляют собой типы переменной длины, для которых требования к памяти зависят от фактической длины значения столбца (представлена как L в предшествующей таблице). Например, столбец VARCHAR(10) может хранить строку с максимальной длиной в 10 символов. Фактическая требуемая память равна длине строки (L) плюс 1 байт, чтобы записать длину строки. Для строки abcd, L равно 4, а требования к памяти равны 5 байтам.

Типы BLOB и TEXT требуют 1, 2, 3 или 4 байта, чтобы записать длину значения столбца, в зависимости от максимальной возможной длины типа.

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

Размер объекта ENUM определен числом различных значений перечисления. Один байт используется для перечислений до 255 возможных значений. Два байта используются для перечислений до 65535 значений. Подробности в разделе "5.3.3 Тип ENUM ".

Размер объекта SET определен числом различных членов набора. Если размер набора равен N, то объект занимает (N+7)/8 байт, округленных до 1, 2, 3, 4 или 8 байт. SET может иметь максимум до 64 членов. Подробности приведены в разделе "5.3.4 Тип SET".


7 Определение данных: CREATE, DROP, ALTER

7.1 Синтаксис CREATE DATABASE

CREATE DATABASE [IF NOT EXISTS] db_name

CREATE DATABASE создает базу данных с указанным именем. Правила для допустимых имен баз данных приведены в разделе "3.2 Имена баз данных, таблиц, индексов, столбцов и псевдонимов". Ошибка происходит, если база данных уже существует, и Вы не определяли IF NOT EXISTS.

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

Вы можете также создавать базы данных с помощью программы mysqladmin. Подробности в разделе "12 Клиентские скрипты и утилиты MySQL".

7.2 Синтаксис DROP DATABASE

DROP DATABASE [IF EXISTS] db_name

DROP DATABASE удаляет все таблицы в базе данных и удаляет саму базу данных. Если выполнили DROP DATABASE на символически связанной базе данных, связь и первоначальная база данных будут удалены. Будьте ОЧЕНЬ осторожны с этой командой!

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

Команда DROP DATABASE удаляет из заданного каталога базы данных все найденные файлы со следующими расширениями:

.BAK.DAT.HSH.ISD
.ISM.ISM.MRG.MYD
.MYI.db.frm

Все подкаталоги, имена которых состоят из 2 цифр (каталоги RAID), также будут удалены.

В MySQL Version 3.22 или позже Вы можете использовать ключевые слова IF EXISTS, чтобы предотвратить ошибку, если база данных не существует.

Вы можете также удалять базы данных с помощью команды mysqladmin. Подробности в разделе "12 Клиентские скрипты и утилиты MySQL".

7.3 Синтаксис CREATE TABLE

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]
[table_options] [select_statement]

create_definition:
  col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
            [PRIMARY KEY] [reference_definition]
  or    PRIMARY KEY (index_col_name,...)
  or    KEY [index_name] (index_col_name,...)
  or    INDEX [index_name] (index_col_name,...)
  or    UNIQUE [INDEX] [index_name] (index_col_name,...)
  or    FULLTEXT [INDEX] [index_name] (index_col_name,...)
  or    [CONSTRAINT symbol] FOREIGN KEY index_name (index_col_name,...)
            [reference_definition]
  or    CHECK (expr)

type:
        TINYINT[(length)] [UNSIGNED] [ZEROFILL]
  or    SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
  or    MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
  or    INT[(length)] [UNSIGNED] [ZEROFILL]
  or    INTEGER[(length)] [UNSIGNED] [ZEROFILL]
  or    BIGINT[(length)] [UNSIGNED] [ZEROFILL]
  or    REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
  or    DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
  or    FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
  or    DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL]
  or    NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]
  or    CHAR(length) [BINARY]
  or    VARCHAR(length) [BINARY]
  or    DATE
  or    TIME
  or    TIMESTAMP
  or    DATETIME
  or    TINYBLOB
  or    BLOB
  or    MEDIUMBLOB
  or    LONGBLOB
  or    TINYTEXT
  or    TEXT
  or    MEDIUMTEXT
  or    LONGTEXT
  or    ENUM(value1,value2,value3,...)
  or    SET(value1,value2,value3,...)

index_col_name:
        col_name [(length)]

reference_definition:
        REFERENCES tbl_name [(index_col_name,...)]
                   [MATCH FULL | MATCH PARTIAL]
                   [ON DELETE reference_option]
                   [ON UPDATE reference_option]

reference_option:
        RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

table_options:
        TYPE = {BDB | HEAP | ISAM | InnoDB | MERGE | MYISAM }
or      AUTO_INCREMENT = #
or      AVG_ROW_LENGTH = #
or      CHECKSUM = {0 | 1}
or      COMMENT = "string"
or      MAX_ROWS = #
or      MIN_ROWS = #
or      PACK_KEYS = {0 | 1}
or      PASSWORD = "string"
or      DELAY_KEY_WRITE = {0 | 1}
or      ROW_FORMAT= { default | dynamic | fixed | compressed }
or      RAID_TYPE= {1 | STRIPED | RAID0 } RAID_CHUNKS=#  RAID_CHUNKSIZE=#
or      UNION = (table_name,[table_name...])
or      DATA DIRECTORY="directory"
or      INDEX DIRECTORY="directory"

select_statement:
        [IGNORE | REPLACE] SELECT ...  (Some legal select statement)

CREATE TABLE создает таблицу с заданным именем в текущей базе данных. Правила для допустимых имен таблицы даны в разделе "3.2 Имена баз данных, таблиц, индексов, столбцов и псевдонимов". Ошибка происходит, если не имеется никакой текущей базы данных, или если таблица уже существует.

В MySQL Version 3.22 или позже имя таблицы может быть определено как db_name.tbl_name. Это работает независимо от того, имеется или нет текущая база данных.

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

В MySQL Version 3.23 или позже Вы можете использовать ключевые слова IF NOT EXISTS, чтобы ошибка не произошла, если таблица уже существует. Обратите внимание, что не имеется никакой проверки, что структуры таблиц идентичны.

Каждая таблица tbl_name представляется некоторыми файлами в каталоге баз данных. В случае таблиц MyISAM-типа Вы получите:

ФайлНазначение
tbl_name.frmОпределение таблицы (форма)
tbl_name.MYDДанные таблицы
tbl_name.MYIИндекс таблицы

Для получения большего количества информации относительно свойств различных типов столбцов обратитесь к разделу "5 Типы столбцов":

7.3.1 Тихие изменения спецификации столбца

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

Если Вы хотите видеть, использовал или нет MySQL столбец не того типа, какой Вы определили, выдайте инструкцию DESCRIBE tbl_name после создания или изменения Вашей таблицы.

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

7.4 Синтаксис ALTER TABLE

ALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec ...]

alter_specification:
        ADD [COLUMN] create_definition [FIRST | AFTER column_name ]
        ADD [COLUMN] (create_definition, create_definition,...)
        ADD INDEX [index_name] (index_col_name,...)
        ADD PRIMARY KEY (index_col_name,...)
        ADD UNIQUE [index_name] (index_col_name,...)
        ADD FULLTEXT [index_name] (index_col_name,...)
        ADD [CONSTRAINT symbol] FOREIGN KEY index_name
            (index_col_name,...)
            [reference_definition]
        ALTER [COLUMN] col_name {SET DEFAULT literal|DROP DEFAULT}
        CHANGE [COLUMN] old_col_name create_definition
        MODIFY [COLUMN] create_definition
        DROP [COLUMN] col_name
        DROP PRIMARY KEY
        DROP INDEX index_name
        DISABLE KEYS
        ENABLE KEYS
        RENAME [TO] new_tbl_name
        ORDER BY col
        table_options

ALTER TABLE позволяет Вам изменять структуру существующей таблицы. Например, Вы можете добавлять или удалять столбцы, создавать или уничтожать индексы, изменять тип существующих столбцов, переименовывать столбцы или непосредственно таблицу. Вы можете также изменять комментарий для таблицы и тип таблицы. Подробности в разделе "7.3 Синтаксис CREATE TABLE ".

Если Вы используете ALTER TABLE, чтобы изменить спецификацию столбца, но DESCRIBE tbl_name указывает, что Ваш столбец не был изменен, возможно, что MySQL игнорировал Вашу модификацию по одной из причин, описанных в разделе "7.3.1 Тихие изменения спецификации столбца". Например, если Вы пробуете изменять столбец VARCHAR на CHAR, MySQL будет все же использовать именно VARCHAR, если таблица содержит другие столбцы переменной длины.

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

Обратите внимание, что, если Вы используете любую другую опцию ALTER TABLE, чем RENAME, MySQL будет всегда создавать временную таблицу, даже если данные не должны быть строго скопированы (подобно тому, когда Вы изменяете имя столбца). Авторы планируют исправить это в будущем, но поскольку ALTER TABLE вызывается относительно редко, это не имеет высокого приоритета в TODO.

Имеется пример, который показывает, некоторые из способов применения ALTER TABLE. Мы начинаем с таблицы t1, которая создана как показано ниже:

mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));

Чтобы переименовывать таблицу из t1 в t2, надо:

mysql> ALTER TABLE t1 RENAME t2;

Чтобы изменить столбец a с типа INTEGER на тип TINYINT NOT NULL (имя оставим прежнее), и столбец b переделать с типа CHAR(10) на CHAR(20) с одновременным переименованием b в c, надо сделать:

mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);

Чтобы добавить новый столбец типа TIMESTAMP с именем d, надо сделать:

mysql> ALTER TABLE t2 ADD d TIMESTAMP;

Чтобы добавить индекс на столбце d, и сделать столбец a первичным ключом, надо:

mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);

Чтобы удалить столбец c:

mysql> ALTER TABLE t2 DROP COLUMN c;

Чтобы добавить новый целочисленный столбец c с поддержкой AUTO_INCREMENT, надо:

mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
           ADD INDEX (c);

Обратите внимание, что мы индексировали c потому, что столбец AUTO_INCREMENT должен быть индексирован, а также мы объявляем c как NOT NULL потому, что индексированные столбцы не могут быть NULL.

Когда Вы добавляете столбец AUTO_INCREMENT, значения столбца будут заполнены числами последовательности для Вас автоматически. Вы можете устанавливать первый номер последовательности, выполняя SET INSERT_ID=# перед ALTER TABLE или используя опцию AUTO_INCREMENT=#.

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

Подробности в разделе "11.6.1 Проблемы с ALTER TABLE".

7.5 Синтаксис RENAME TABLE

RENAME TABLE tbl_name TO new_table_name[, tbl_name2 TO new_table_name2,...]

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

CREATE TABLE new_table (...);
RENAME TABLE old_table TO backup_table, new_table TO old_table;

Переименование выполняется слева направо, это означает, что, если Вы хотите менять два имени таблицы, Вы должны сделать так:

RENAME TABLE old_table    TO backup_table,
             new_table    TO old_table,
             backup_table TO new_table;

Таблицы можно не только переименовывать, но еще и перемещать между разными базами данных. Например:

RENAME TABLE current_database.table_name TO other_database.table_name;

Когда Вы выполняете RENAME, Вы не можете иметь блокированные таблицы или активные транзакции. Вы должны также иметь привилегии ALTER и DROP на первоначальной таблице и привилегии CREATE и INSERT на новой таблице.

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

7.6 Синтаксис DROP TABLE

DROP TABLE [IF EXISTS] tbl_name [, tbl_name,...] [RESTRICT | CASCADE]

DROP TABLE удаляет одну или большее количество таблиц. Все данные таблицы и определение таблицы будут удалены, так что будьте внимательны с этой командой!

В MySQL Version 3.22 или позже Вы можете использовать ключевые слова IF EXISTS, чтобы предотвратить ошибку для таблиц, которых нет.

RESTRICT и CASCADE ничего не делают и нужны лишь для совместимости с другими СУБД.

ОБРАТИТЕ ВНИМАНИЕ: DROP TABLE не транзакционно-безопасна и автоматически завершает любые активные транзакции.

7.7 Синтаксис CREATE INDEX

CREATE [UNIQUE|FULLTEXT] INDEX index_name ON tbl_name (col_name[(length)],... )

Инструкция CREATE INDEX ничего не делает до Version 3.22. В Version 3.22 или позже CREATE INDEX она отображена к инструкции ALTER TABLE, чтобы создать индексы. Подробности в разделе "7.4 Синтаксис ALTER TABLE ".

Обычно Вы создаете все индексы на таблице во время непосредственного создания таблицы с помощью вызова CREATE TABLE. Подробности в разделе "7.3 Синтаксис CREATE TABLE ". CREATE INDEX позволяет Вам добавлять индексы к существующим в базе таблицам.

Список столбцов в форме (col1,col2,...) создает индекс по многим столбцам. Индексные значения будут сформированы, связывая значения из заданных для индексации столбцов.

Для столбцов CHAR и VARCHAR индексы могут быть созданы с использованием только части столбца, применяя синтаксис col_name(length). На столбцах BLOB и TEXT длина требуется обязательно. Инструкция, показанная ниже, создает индекс с использованием первых 10 символов из столбца name:

mysql> CREATE INDEX part_of_name ON customer (name(10));

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

Обратите внимание, что Вы можете добавлять индекс на столбце, который может иметь значения NULL, и на столбцах типов BLOB и TEXT только, если Вы используете MySQL Version 3.23.2 или более новую и применяете тип таблицы MyISAM.

Индексы FULLTEXT могут индексировать только столбцы типов VARCHAR и TEXT в таблицах типа MyISAM. Индексы FULLTEXT доступны в MySQL Version 3.23.23 и более новых. Подробности в разделе "9.4 Полнотекстовый поиск в MySQL".

7.8 Синтаксис DROP INDEX

DROP INDEX index_name ON tbl_name

DROP INDEX удаляет индекс с именем index_name из таблицы tbl_name. DROP INDEX ничего не делает до версии Version 3.22, а начиная с нее, этот вызов перенацелен на соответствующий вызов ALTER TABLE для удаления индекса. Подробности в разделе "7.4 Синтаксис ALTER TABLE".


8 Манипуляции с данными: SELECT, INSERT, UPDATE, DELETE

8.1 Синтаксис SELECT

SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT]
       [SQL_BUFFER_RESULT] [HIGH_PRIORITY] [DISTINCT|DISTINCTROW|ALL]
       select_expression,...
       [INTO {OUTFILE|DUMPFILE} 'file_name' export_options]
       [FROM table_references [WHERE where_definition]
       [GROUP BY {unsigned_integer|col_name|formula} [ASC|DESC], ...]
       [HAVING where_definition]
       [ORDER BY {unsigned_integer|col_name|formula} [ASC|DESC] ,...]
       [LIMIT [offset,] rows] [PROCEDURE procedure_name]
       [FOR UPDATE|LOCK IN SHARE MODE]]

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

mysql> SELECT 1 + 1;
    -> 2

Все используемые ключевые слова должны быть даны точно в порядке, показанном выше. Например, предложение HAVING должно прийти после любого предложения GROUP BY и перед любым предложением ORDER BY.

8.1.1 Синтаксис JOIN

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

table_reference, table_reference
table_reference [CROSS] JOIN table_reference
table_reference INNER JOIN table_reference join_condition
table_reference STRAIGHT_JOIN table_reference
table_reference LEFT [OUTER] JOIN table_reference join_condition
table_reference LEFT [OUTER] JOIN table_reference
table_reference NATURAL [LEFT [OUTER]] JOIN table_reference
{ oj table_reference LEFT OUTER JOIN table_reference ON conditional_expr }
table_reference RIGHT [OUTER] JOIN table_reference join_condition
table_reference RIGHT [OUTER] JOIN table_reference
table_reference NATURAL [RIGHT [OUTER]] JOIN table_reference

Здесь table_reference определен как:

table_name [[AS] alias] [USE INDEX (key_list)] [IGNORE INDEX (key_list)]

а join_condition как:

ON conditional_expr |
USING (column_list)

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

Обратите внимание, что в версиях до Version 3.23.17 INNER JOIN не обрабатывал join_condition!

Последний синтаксис LEFT OUTER JOIN, показанный выше, существует только для совместимости с ODBC:

Вот некоторые примеры:

mysql> select * from table1,table2 where table1.id=table2.id;
mysql> select * from table1 LEFT JOIN table2 ON table1.id=table2.id;
mysql> select * from table1 LEFT JOIN table2 USING (id);
mysql> select * from table1 LEFT JOIN table2 ON table1.id=table2.id
           LEFT JOIN table3 ON table2.id=table3.id;
mysql> select * from table1 USE INDEX (key1,key2) WHERE key1=1 and
                    key2=2 AND key3=3;
mysql> select * from table1 IGNORE INDEX (key3) WHERE key1=1 and
                    key2=2 AND key3=3;

8.2 Синтаксис UNION

SELECT ....
UNION [ALL]
SELECT ....
  [UNION
   SELECT ...]

UNION реализован только в версии MySQL 4.0.0 и выше.

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

Команды SELECT представляют собой нормальные команды выбора, но со следующими ограничениями:

Если Вы не используете ключевое слово ALL для UNION, все возвращенные строки будут уникальны, подобно тому, как если бы Вы сделали DISTINCT для общего набора результатов. Если Вы определяете ALL, то Вы получите все строки соответствий из всех используемых инструкций SELECT.

8.3 Синтаксис INSERT

INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
       [INTO] tbl_name [(col_name,...)]
       VALUES (expression,...),(...),...
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
       [INTO] tbl_name [(col_name,...)] SELECT ...
INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name
       SET col_name=expression, col_name=expression, ...

INSERT вставляет новые строки в существующую таблицу. Форма INSERT ... VALUES вставляет строки, основываясь на явно определенных значениях. INSERT ... SELECT вставляет строки, выбранные из другой таблицы или таблиц. Форма INSERT ... VALUES с несколькими списками значений поддержана в MySQL Version 3.22.5 или позже. Синтаксис col_name=expression введен, начиная с MySQL Version 3.22.10 или выше.

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

Если Вы используете INSERT ... SELECT или INSERT ... VALUES со многими списками значений, Вы можете использовать функцию C API mysql_info(), чтобы получить информацию относительно запроса. Формат информационной строки показан ниже:

Records: 100 Duplicates: 0 Warnings: 0

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

8.3.1 Синтаксис INSERT ... SELECT

INSERT [LOW_PRIORITY] [IGNORE] [INTO] tbl_name [(column list)] SELECT ...

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

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

Следующие условия работают для команды INSERT ... SELECT:

Вы можете, конечно, также использовать REPLACE вместо INSERT, чтобы перезаписать старые строки.

8.4 Синтаксис INSERT DELAYED

INSERT DELAYED ...

Опция DELAYED для инструкции INSERT специфична для MySQL и является очень полезной, если Вы имеете клиентуру, которая не может ждать завершения INSERT. Это общая проблема, когда Вы используете MySQL для регистрации и также периодически выполняете инструкции SELECT и UPDATE, которые занимают много времени. DELAYED введен в MySQL Version 3.22.15. Это MySQL-расширение для стандарта ANSI SQL92.

INSERT DELAYED работает только с таблицами ISAM и MyISAM. Обратите внимание, что таблицы MyISAM поддерживают параллельные SELECT и INSERT, если не имеется никаких свободных блоков в середине файла данных, Вы очень редко должны использовать INSERT DELAYED с таблицами типа MyISAM.

Когда Вы используете INSERT DELAYED, клиент получит сообщение OK сразу, а вот строка будет вставлена, когда таблица не будет использоваться любым другим потоком.

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

Обратите внимание, что в настоящее время поставленные в очередь строки сохранены только в памяти, пока они не вставлены в таблицу. Это означает, что, если Вы уничтожаете mysqld крутыми мерами (kill -9), или если mysqld рухнет неожиданно, любые поставленные в очередь строки, которые не были записаны на диск, потеряются!

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

Обратите внимание, что INSERT DELAYED медленнее, чем нормальная INSERT, если таблица сейчас не используется. Имеется также дополнительная нагрузка для сервера, чтобы обработать отдельный поток для каждой таблицы, на которой Вы используете INSERT DELAYED. Это означает, что Вы должны использовать INSERT DELAYED только тогда, когда Вы, действительно, уверены, что нуждаетесь в этом!

8.5 Синтаксис UPDATE

UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
       SET col_name1=expr1, [col_name2=expr2, ...]
       [WHERE where_definition] [LIMIT #]

UPDATE модифицирует столбцы в существующих строках таблиц с новыми значениями. Предложение SET указывает, какие столбцы изменять, и значения, которые им должны быть заданы. Предложение WHERE, если задано, определяет, какие строки должны модифицироваться. Иначе модифицируются все строки. Если определено предложение ORDER BY, строки будут модифицироваться в том порядке, который определен.

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

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

Если Вы обращаетесь к столбцу из tbl_name в выражении, UPDATE использует текущее значение столбца. Например, следующая инструкция устанавливает столбец age к следующему за его текущим значением:

mysql> UPDATE persondata SET age=age+1;

Назначения UPDATE оценены слева направо. Например, следующая инструкция удваивает столбец age, затем увеличивает его на 1:

mysql> UPDATE persondata SET age=age*2, age=age+1;

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

UPDATE возвращает число строк, которые были фактически изменены. В MySQL Version 3.22 или позже функция C API mysql_info() возвращает число строк, которые были согласованы и модифицировались, и число предупреждений, которые произошли в течение UPDATE.

В MySQL Version 3.23 Вы можете использовать LIMIT #, чтобы гарантировать, что только заданное число строк будет изменено.

8.6 Синтаксис DELETE

DELETE [LOW_PRIORITY | QUICK] FROM table_name
       [WHERE where_definition]
       [ORDER BY ...] [LIMIT rows]
DELETE [LOW_PRIORITY | QUICK] table_name[.*] [table_name[.*] ...] FROM
       table-references [WHERE where_definition]

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

Если Вы выдаете DELETE без предложения WHERE, все строки будут удалены. Если Вы делаете это в режиме AUTOCOMMIT, это сработает аналогично TRUNCATE. Подробности в разделе "8.7 Синтаксис TRUNCATE". В MySQL 3.23 DELETE без предложения WHERE возвратит ноль как число обработанных записей.

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

mysql> DELETE FROM table_name WHERE 1>0;

Обратите внимание, что это НАМНОГО медленнее, чем DELETE FROM table_name без предложения WHERE потому, что эта команда удаляет строки по одной.

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

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

В MyISAM-таблицах удаленные записи поддерживаются в связанном списке, и старые позиции записей повторно используются вызовом INSERT. Чтобы освободить неиспользуемое место и уменьшить размеры файла, используйте команду OPTIMIZE TABLE или утилиту myisamchk, чтобы реорганизовать таблицы. OPTIMIZE TABLE проще, но myisamchk быстрее. Подробности в разделе "4.6 Синтаксис OPTIMIZE TABLE".

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

Символ .* после имени таблицы появился для совместимости с Access:

DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id

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

ORDER BY и использование нескольких таблиц в DELETE реализовано, начиная с MySQL 4.0.

Если предложение ORDER BY используется, строки будут удалены в заданном порядке. Это удобно в сочетании с LIMIT. Например:

DELETE FROM somelog WHERE user='jcole' ORDER BY timestamp LIMIT 1

Это удалит самую старую запись (по timestamp), где строка соответствует предложению WHERE.

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

8.7 Синтаксис TRUNCATE

TRUNCATE TABLE table_name

В версии 3.23 TRUNCATE TABLE отображен на вызов COMMIT; DELETE FROM table_name. Подробности в разделе "8.6 Синтаксис DELETE".

Разница между TRUNCATE TABLE и DELETE FROM ..:

TRUNCATE представляет собой Oracle-расширение языка SQL.

8.8 Синтаксис REPLACE

REPLACE [LOW_PRIORITY | DELAYED]
        [INTO] tbl_name [(col_name,...)]
        VALUES (expression,...),(...),...
REPLACE [LOW_PRIORITY | DELAYED]
        [INTO] tbl_name [(col_name,...)] SELECT ...
REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name
        SET col_name=expression, col_name=expression,...

REPLACE работает в точности подобно INSERT, за исключением того, что, если старая запись в таблице имеет то же самое значение, что и новая запись на уникальном индексе, старая запись будет удалена прежде, чем новая запись вставлена в таблицу. Подробности в разделе "8.3 Синтаксис INSERT".

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

При использовании вызова REPLACE mysql_affected_rows() возвратит 2, если новая строка заменила старую. Это потому, что в этом случае одна строка была вставлена, а затем дубликат был удален.

8.9 Синтаксис LOAD DATA INFILE

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
          [REPLACE | IGNORE] INTO TABLE tbl_name
          [FIELDS
            [TERMINATED BY '\t']
            [[OPTIONALLY] ENCLOSED BY '']
            [ESCAPED BY '\\' ]
          ]
          [LINES TERMINATED BY '\n'] [IGNORE number LINES]
          [(col_name,...)]

Команда LOAD DATA INFILE читает строки из текстового файла в таблицу. Если ключевое слово LOCAL определено, файл читается с компьютера пользователя. Если LOCAL не определено, файл должен быть размещен на сервере. LOCAL доступен в MySQL Version 3.22.6 или более поздней.

По соображениям безопасности, при чтении текстовых файлов, размещенных на сервере, файлы должны находиться в каталоге баз данных или быть читаемыми всеми. Также, чтобы использовать LOAD DATA INFILE на файлах сервера, Вы должны иметь привилегию file. Подробности в разделе "10.6 Привилегии, предоставляемые MySQL".

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

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

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

Если Вы используете MySQL ниже 3.23.24, Вы не можете читать из FIFO с помощью LOAD DATA INFILE. Если Вы должны читать из FIFO (например, вывод из gunzip), используйте вместо этого команду LOAD DATA LOCAL INFILE.

Вы можете также загружать файлы данных, используя полезность mysqlimport. Она функционирует, посылая команду LOAD DATA INFILE на сервер. Опция --local заставляет mysqlimport читать файлы данных с компьютера пользователя. Вы можете определять опцию --compress, чтобы получить лучшую эффективность при работе с медленными сетями, если пользователь и сервер поддерживают сжатый протокол.

При размещении файлов на компьютере сервера, он использует правила:

Обратите внимание, что эти правила означают, что файл, заданный как ./myfile.txt, читается из каталога данных сервера в то время, как файл myfile.txt читается из каталога текущей базы данных. Например, следующая инструкция LOAD DATA читает файл data.txt из каталога базы данных для db1 потому, что db1 текущая база данных, даже при том, что инструкция явно загружает файл в таблицу в базе данных db2:

mysql> USE db1;
mysql> LOAD DATA INFILE "data.txt" INTO TABLE db2.my_table;

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

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

Если Вы используете LOAD DATA INFILE на пустой таблице MyISAM, все неуникальные индексы будут созданы в отдельном пакете (подобно REPAIR). Это обычно делает LOAD DATA INFILE намного быстрее, когда Вы имеете много индексов.

LOAD DATA INFILE представляет собой дополнение к SELECT ... INTO OUTFILE. Подробности в разделе "8.1 Синтаксис SELECT". Чтобы писать данные из базы данных в файл, используйте SELECT ... INTO OUTFILE. Чтобы читать файл обратно в базу данных, используйте LOAD DATA INFILE. Синтаксис предложений FIELDS и LINES тот же самый для обеих команд. Оба предложения факультативные, но FIELDS должно предшествовать LINES, если оба определены.

Если Вы определяете предложение FIELDS, каждое из подпредложений (TERMINATED BY, [OPTIONALLY] ENCLOSED BY и ESCAPED BY) также факультативны за исключением того, что Вы должны определить по крайней мере одно из них.

Если Вы не определяете предложение FIELDS, значения по умолчанию были бы такие же, как если бы Вы написали это:

FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'

Если Вы не определяете предложение LINES, значения по умолчанию были бы такие же, как если бы Вы написали это:

LINES TERMINATED BY '\n'

Другими словами, значения по умолчанию заставляют LOAD DATA INFILE действовать следующим образом при чтении ввода:

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

Обратите внимание, что, чтобы писать FIELDS ESCAPED BY '\\', Вы должны определить две наклонных черты влево для любого значения, которое нужно читать как одиночную наклонную черту влево.

Опция IGNORE number LINES может использоваться, чтобы игнорировать заголовок столбца в начале файла:

mysql> LOAD DATA INFILE "/tmp/file_name" into table
                            test IGNORE 1 LINES;

Когда Вы используете SELECT ... INTO OUTFILE в тандеме с LOAD DATA INFILE, чтобы записать данные из базы данных в файл, а затем читаете файл обратно в базу данных позже, параметры обработки поля и строк для обеих команд должны соответствовать. Иначе LOAD DATA INFILE не будут интерпретировать содержание файла правильно. Предположите, что Вы используете SELECT ... INTO OUTFILE, чтобы записать файл с полями, разграниченными запятыми:

mysql> SELECT * INTO OUTFILE 'data.txt'
           FIELDS TERMINATED BY ','
           FROM ...;

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

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2
           FIELDS TERMINATED BY ',';

Если взамен Вы пробовали читать файл инструкцией, показанной ниже, это не будет работать потому, что это инструктирует LOAD DATA INFILE искать позиции табуляции между полями:

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2
           FIELDS TERMINATED BY '\t';

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

LOAD DATA INFILE может использоваться, чтобы читать файлы, полученные из внешних источников. Например, файл в формате dBASE будет иметь поля, разделяемые запятыми и заключенные в двойные кавычки. Если строки в файле завершены newlines, команда, показанная ниже, иллюстрирует параметры обработки, которые Вы использовали бы, чтобы загрузить файл:

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
           FIELDS TERMINATED BY ',' ENCLOSED BY '"'
           LINES TERMINATED BY '\n';

Любое из поля или параметров обработки может определять пустую строку (''). Если она не пустая, значения FIELDS [OPTIONALLY] ENCLOSED BY и FIELDS ESCAPED BY должны быть одиночным символом. Значения FIELDS TERMINATED BY и LINES TERMINATED BY могут быть больше, чем одним символом. Например, чтобы писать строки, которые завершены парами carriage return-linefeed, или читать файл, содержащий такие строки, определите LINES TERMINATED BY '\r\n'.

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

create table jokes (a int not null auto_increment primary key,
                   joke text not null);
load data infile "/tmp/jokes.txt" into table jokes
          fields terminated by "" lines terminated by "\n%%\n" (joke);

FIELDS [OPTIONALLY] ENCLOSED BY управляет цитированием полей. Для вывода (SELECT ... INTO OUTFILE), если Вы опускаете слово OPTIONALLY, все поля включены символом ENCLOSED BY. Пример такого вывода (использование запятой как разделителя поля) ниже:

"1","a string","100.20"
"2","a string containing a , comma","102.20"
"3","a string containing a \" quote","102.20"
"4","a string containing a \", quote and comma","102.20"

Если Вы определяете OPTIONALLY, символ ENCLOSED BY используется только для того, чтобы включить поля типов CHAR и VARCHAR:

1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a \" quote",102.20
4,"a string containing a \", quote and comma",102.20

Обратите внимание, что местонахождение символа ENCLOSED BY внутри значения поля экранируется приписыванием символа ESCAPED BY. Также обратите внимание, что, если Вы определяете пустое значение ESCAPED BY, возможно генерировать вывод, который не может читаться правильно средствами LOAD DATA INFILE. Например, вывод, показанный выше, появился бы как показано ниже, если бы символ ESC был пустым. Заметьте, что второе поле в четвертой строке содержит запятую после кавычки, которая ошибочно появляется и завершает поле:

1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a " quote",102.20
4,"a string containing a ", quote and comma",102.20

Для ввода символ ENCLOSED BY, если он вообще задан, будет удален с концов значений поля. Это истинно, определен или нет OPTIONALLY. OPTIONALLY не имеет никакого эффекта на входной интерпретации. Местонахождения символа ENCLOSED BY, которому предшествует символ ESCAPED BY, интерпретируются как часть текущего значения поля. Кроме того, дублированные символы ENCLOSED BY, встречающиеся внутри полей, интерпретируются как одиночные символы ENCLOSED BY, если поле непосредственно начинается этим символом. Например, если определено ENCLOSED BY '"', кавычки будут обработаны как показано ниже:

"The ""BIG"" boss"  -> The "BIG" boss
The "BIG" boss      -> The "BIG" boss
The ""BIG"" boss    -> The ""BIG"" boss

FIELDS ESCAPED BY контролирует, как писать или читать специальные символы. Если символ FIELDS ESCAPED BY не пуст, он использует для префикса следующие символы на выводе:

Если символ FIELDS ESCAPED BY пуст, никакие символы не экранируются вовсе. Не стоит определять пустой символ ESC, особенно, если значения полей в Ваших данных содержат любой из символов в списке выше.

Для ввода, если символ FIELDS ESCAPED BY не пуст, местонахождения этого символа будут удалены, и следующий символ принимается буквально как часть значения поля. Исключительные ситуации: 0 или N (например, \0 или \N, если символ ESC задан как \). Эти последовательности интерпретируются как 0 и NULL соответственно. Ниже изложены правила для обработки NULL.

За подробностями относительно синтаксиса экранировки с символом \ отсылаю Вас к разделу "3.1 Литералы: как писать строки и числа".

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

Обработка значений NULL изменяется, в зависимости от параметров FIELDS и LINES, которые Вы используете:

Некоторые случаи не поддержаны LOAD DATA INFILE:

Следующий пример загружает все столбцы таблицы persondata:

mysql> LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;

Никакой список полей не определен, так что LOAD DATA INFILE ожидает строки, содержащие поле для каждого столбца таблицы. Используются заданные по умолчанию значения FIELDS и LINES.

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

mysql> LOAD DATA INFILE 'persondata.txt'
           INTO TABLE persondata (col1,col2,...);

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

Если строка имеет слишком мало полей, столбцы, для которых никакого входного поля не присутствует, будут установлены в значения по умолчанию. Задание этих значений по умолчанию подробно описано в разделе "7.3 Синтаксис CREATE TABLE ".

Пустое значение поля интерпретируется не так, как если бы оно отсутствовало вовсе, а именно:

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

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

LOAD DATA INFILE расценивает весь ввод как строки, так что Вы не можете использовать числовые значения для столбцов типов ENUM или SET, как Вы можете это делать инструкциями INSERT. Все значения ENUM и SET должны быть определены как строки!

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

Records: 1  Deleted: 0  Skipped: 0  Warnings: 0

Предупреждения происходят при тех же самых обстоятельствах, что и с командой INSERT (подробности в разделе "8.3 Синтаксис INSERT"), за исключением того, что LOAD DATA INFILE также генерирует предупреждения, когда имеется слишком мало или слишком много полей во входной строке. Предупреждения не сохранены где-нибудь. Число предупреждений может использоваться только как индикация, если все пошло нормально. Если Вы получаете предупреждения и хотите знать точно, почему Вы их получили, один способ сделать это состоит в том, чтобы использовать SELECT ... INTO OUTFILE в другой файл и сравнить его с первоначальным входным файлом.

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

mkfifo /mysql/db/x/x
chmod 666 /mysql/db/x/x
cat < /dev/tcp/10.1.1.12/4711 > /nt/mysql/db/x/x
mysql -e "LOAD DATA INFILE 'x' INTO TABLE x" x

Если Вы используете версию MySQL до 3.23.25, Вы можете делать вышеупомянутое только с помощью LOAD DATA LOCAL INFILE.


9 Обзор языка MySQL

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

9.1 Базисные команды клиента MySQL

9.1.1 Синтаксис USE

USE db_name

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

mysql> USE db1;
mysql> SELECT count(*) FROM mytable;      # selects from db1.mytable
mysql> USE db2;
mysql> SELECT count(*) FROM mytable;      # selects from db2.mytable

Создание специфической базы данных посредством инструкции USE не препятствует Вам обращаться к таблицам в других базах данных. Пример ниже обращается к таблице author из базы данных db1 и таблице editor из базы данных db2:

mysql> USE db1;
mysql> SELECT author_name,editor_name FROM author,db2.editor
           WHERE author.editor_id = db2.editor.editor_id;

Инструкция USE предусмотрена для совместимости с Sybase.

9.1.2 Синтаксис DESCRIBE (получение информации о столбцах)

{DESCRIBE | DESC} tbl_name {col_name | wild}

DESCRIBE представляет собой сокращение для вызова SHOW COLUMNS FROM. Подробности в разделе "4.10 Получение информации о базах данных, таблицах, столбцах и индексах".

DESCRIBE обеспечивает информацию относительно столбцов таблицы. col_name может быть именем столбца или строкой, содержащей групповые символы SQL `%' и `_'.

Если типы столбцов не те, которые Вы задавали в инструкции CREATE TABLE, обратите внимание, что MySQL иногда изменяет типы столбцов. Подробности в разделе "7.3.1 Тихие изменения спецификации столбца".

Эта инструкция предусмотрена для совместимости с Oracle.

Инструкция SHOW обеспечивает подобную информацию. Подробности в разделе "4.10 Синтаксис SHOW".

9.2 Команды транзакций и блокировок в MySQL

9.2.1 Синтаксис BEGIN/COMMIT/ROLLBACK

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

Если Вы используете транзакционно-безопасные таблицы (подобно BDB, InnoDB, Вы можете перевести MySQL в режим не-autocommit следующей командой:

SET AUTOCOMMIT=0

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

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

BEGIN;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;

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

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

Если Вы используете BEGIN или SET AUTOCOMMIT=0, Вы должны использовать двоичный файл регистрации MySQL для резервирования вместо старого файла регистрации модификаций. Транзакции сохранены в двоичном протоколе, запись для COMMIT может гарантировать, что транзакции, которые прокручены обратно, не сохранены.

Следующие команды автоматически заканчивают транзакцию (как будто Вы сделали COMMIT перед выполнением команды):

ALTER TABLEBEGIN CREATE INDEX
DROP DATABASEDROP TABLE RENAME TABLE
TRUNCATE

Вы можете изменять уровень изоляции для транзакций командой SET TRANSACTION ISOLATION LEVEL .... Подробности в разделе "9.2.3 Синтаксис SET TRANSACTION".

9.2.2 Синтаксис LOCK TABLES/UNLOCK TABLES

LOCK TABLES tbl_name [AS alias] {READ|[READ LOCAL]|[LOW_PRIORITY] WRITE}
            [, tbl_name {READ | [LOW_PRIORITY] WRITE} ...]
...
UNLOCK TABLES

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

Основные причины использовать LOCK TABLES: эмуляция транзакций или получение большего быстродействия при модифицировании таблиц. Это объясняется более подробно позже.

Если поток получает блокировку READ на таблице, он (и все остальные) могут только читать из таблицы. Если поток получает блокировку WRITE на таблице, то только он может читать или писать таблицу. Другие потоки блокированы.

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

Когда Вы используете LOCK TABLES, Вы должны блокировать все таблицы, которые Вы собираетесь использовать, и использовать тот же самый псевдоним, который собираетесь применить в Ваших запросах! Если Вы используете таблицу в запросе несколько раз (с псевдонимами), Вы должны получить блокировку для каждого псевдонима!

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

LOCK TABLES работает так:

  1. Сортирует все таблицы, которые будут блокированы, во внутреннем определенном порядке (с точки зрения пользователя, порядок неопределен).
  2. Если таблица блокирована с помощью блокировок read и write, write всегда размещается перед read.
  3. Блокируется одна таблица за раз, пока поток не получает все блокировки.

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

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

Вы можете безопасно уничтожать поток, который ждет блокировку таблицы, с помощью команды KILL. Подробности в разделе "4.9 Синтаксис KILL".

Обратите внимание, что Вы НЕ должны блокировать таблицы, которые Вы используете с INSERT DELAYED. Это потому, что в этом случае INSERT выполняется отдельным потоком.

Обычно Вы не должны блокировать таблицы, поскольку все одиночные инструкции UPDATE атомные: никакой поток не может сталкиваться с любым другим, в настоящее время выполняющим инструкции SQL. Имеется несколько случаев, когда стоит блокировать таблицы:

Используя инкрементные модификации (UPDATE customer SET value=value+new_value) или функцию LAST_INSERT_ID(), Вы во многих случаях можете избежать использования LOCK TABLES.

Вы можете также решать некоторые проблемы, используя функции GET_LOCK() и RELEASE_LOCK(). Эти блокировки сохранены в таблице hash на сервере и выполнены через вызовы pthread_mutex_lock() и pthread_mutex_unlock() для ускорения работы. Подробности в разделе "6.5.2 Дополнительные функции ".

Вы можете блокировать все таблицы во всех базах данных с блокировками чтения командой FLUSH TABLES WITH READ LOCK. Подробности в разделе "4.8 Синтаксис FLUSH". Это очень удобный способ получать резервные копии, если Вы имеете файловую систему, подобную Veritas, которая может делать кадры состояния.

ОБРАТИТЕ ВНИМАНИЕ: LOCK TABLES не транзакционно-безопасна и автоматически завершает любые активные транзакции перед попыткой блокировать таблицы.

9.2.3 Синтаксис SET TRANSACTION

SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL
[READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

Устанавливает уровень изоляции транзакции глобально, для целого сеанса или следующей транзакции.

Заданное по умолчанию поведение должно установить уровень изоляции для следующей (не начатой) транзакции.

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

Установка привилегии SESSION будет воздействовать на следующую и на все будущие транзакции.

9.3 Синтаксис HANDLER

HANDLER table OPEN [AS alias]
HANDLER table READ index {=|>=|<=|<} (value1, value2, ...)
                   [WHERE ...] [LIMIT ...]
HANDLER table READ index {FIRST|NEXT|PREV|LAST} [WHERE ...] [LIMIT ...]
HANDLER table READ {FIRST|NEXT} [WHERE ...] [LIMIT ...]
HANDLER table CLOSE

Команда HANDLER обеспечивает прямой доступ к интерфейсу таблиц MySQL, совершая обход SQL-оптимизатора. Таким образом, это работает быстрее, чем SELECT.

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

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

Третья форма выбирает одну (или определенное предложением LIMIT число) строку в индексном порядке, соответствуя условиям определения WHERE запроса.

Четвертая форма (без индексной спецификации) выбирает одну (или определенное предложением LIMIT число) строку из таблицы в естественном порядке строк (как они сохранены в файле данных), соответствуя условиям определения WHERE запроса. Это быстрее, чем HANDLER table READ index, когда нужен полный просмотр таблицы.

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

HANDLER это инструкция низкого уровня, например, она не обеспечивает непротиворечивость. Вызов HANDLER ... OPEN НЕ блокирует таблицу. Так что другие потоки могут работать с таблицей и менять данные.

9.4 Полнотекстовый поиск в MySQL

Начиная с Version 3.23.23, MySQL имеет поддержку для полнотекстовой индексации и поиска. Полнотекстовые индексы в MySQL представляют собой индекс типа FULLTEXT. Индекс FULLTEXT может быть создан из столбцов VARCHAR и TEXT в вызове CREATE TABLE или добавлен позже через инструкции ALTER TABLE или CREATE INDEX. Для больших наборов данных, добавление индекса FULLTEXT через ALTER TABLE (или CREATE INDEX) намного быстрее, чем вставка строк в пустую таблицу с индексом.

Поиск выполняется с помощью функции MATCH.

mysql> CREATE TABLE articles (
    ->   id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    ->   title VARCHAR(200),
    ->   body TEXT,
    ->   FULLTEXT (title,body)
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO articles VALUES
    -> (0,'MySQL Tutorial', 'DBMS stands for DataBase Management ...'),
    -> (0,'How To Use MySQL Efficiently', 'After you went through a ...'),
    -> (0,'Optimizing MySQL','In this tutorial we will show how to ...'),
    -> (0,'1001 MySQL Trick','1. Never run mysqld as root. 2. Normalize ...'),
    -> (0,'MySQL vs. YourSQL', 'In the following database comparison we ...'),
    -> (0,'MySQL Security', 'When configured properly, MySQL could be ...');
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM articles WHERE MATCH (title,body)
                    AGAINST ('database');
+----+-------------------+---------------------------------------------+
| id | title             | body                                        |
+----+-------------------+---------------------------------------------+
|  5 | MySQL vs. YourSQL | In the following database comparison we ... |
|  1 | MySQL Tutorial    | DBMS stands for DataBase Management ...     |
+----+-------------------+---------------------------------------------+
2 rows in set (0.00 sec)

Функция MATCH соответствует запросу естественного языка для текстовой совокупности AGAINST, которая является просто набором столбцов, покрытых индексом FULLTEXT). Для каждой строки в таблице это возвращает релевантность: меру подобия между текстом в этой строке (в столбцах, которые являются частью совокупности) и запросом. Когда это используется в предложении WHERE (см. пример выше) возвращенные строки автоматически сортируются с уменьшением релевантности. Релевантность представлена неотрицательным числом с плавающей запятой. Нулевая релевантность означает, что нет никакого подобия.

Вышеупомянутое представляет собой базисный пример использования функции MATCH. Строки будут возвращены с уменьшением релевантности.

mysql> SELECT id,MATCH (title,body) AGAINST ('Tutorial') FROM articles;
+----+-----------------------------------------+
| id | MATCH (title,body) AGAINST ('Tutorial') |
+----+-----------------------------------------+
|  1 |                        0.64840710366884 |
|  2 |                                       0 |
|  3 |                        0.66266459031789 |
|  4 |                                       0 |
|  5 |                                       0 |
|  6 |                                       0 |
+----+-----------------------------------------+
5 rows in set (0.00 sec)

Этот пример показывает, как найти релевантность. Поскольку предложения WHERE или ORDER BY не присутствуют в запросе, возвращенные строки не упорядочиваются.

mysql> SELECT id, body, MATCH (title,body) AGAINST (
    -> 'Security implications of running MySQL as root') AS score
    -> FROM articles WHERE MATCH (title,body) AGAINST
    -> ('Security implications of running MySQL as root');
+----+-----------------------------------------------+-----------------+
| id | body                                          | score           |
+----+-----------------------------------------------+-----------------+
|  4 | 1. Never run mysqld as root. 2. Normalize ... | 1.5055546709332 |
|  6 | When configured properly, MySQL could be ...  |   1.31140957288 |
+----+-----------------------------------------------+-----------------+
2 rows in set (0.00 sec)

Это более сложный пример: запрос возвращает релевантность и дополнительно сортирует строки с ее уменьшением. Чтобы достичь этого, нужно определить MATCH дважды. Обратите внимание, что это не вызовет никакой перегрузки, так как оптимизатор MySQL обратит внимание, что эти два обращения MATCH идентичны, и вызовут код поиска только однажды.

MySQL использует очень простой синтаксический анализатор, чтобы расчленить текст на слова. Слово является любой последовательностью символов, чисел, знаков ' и _. Любое слово, которое присутствует в списке stopword или слишком короткое (3 символа или меньше), игнорируется.

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

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

mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('MySQL');
Empty set (0.00 sec)

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

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

9.4.1 Полнотекстовые ограничения

9.4.2 Подстройка полнотекстового поиска MySQL

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

9.4.3 Новые свойства в полнотекстовом поиске в MySQL 4.0

Этот раздел включает список свойств, которые уже реализованы в версии 4.0. Здесь также описано, что еще планируется сделать.

9.9.4 Что еще надо сделать в полнотекстовом поиске


10 Общие проблемы защиты и система привилегий доступа MySQL

MySQL имеет продвинутую, но ненормативную систему защиты и привилегий. Этот подробно раздел описывает, как она работает.

10.1 Управление привилегиями

10.1.1 Синтаксис GRANT и REVOKE

GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...]
      ON {tbl_name|*|*.*|db_name.*} TO user_name [IDENTIFIED BY 'password']
      [, user_name [IDENTIFIED BY 'password'] ...] [REQUIRE {SSL|X509}
      [ISSUER issuer] [SUBJECT subject]] [WITH GRANT OPTION]

REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...]
       ON {tbl_name|*| *.*|db_name.*}
       FROM user_name [, user_name ...]

GRANT реализован в MySQL Version 3.22.11 или позже. Для более ранних версий MySQL инструкция GRANT не делает ничего.

Команды GRANT и REVOKE позволяют администраторам системы создавать пользователей, предоставлять и отменять права на MySQL-пользователей в четырех уровнях привилегий:

Глобальный уровень (Global level)
Глобальные привилегии обращаются ко всем базам данных на данном сервере. Эти привилегии сохранены в таблице mysql.user.
Уровень баз данных (Database level)
Привилегии баз данных обращаются ко всем таблицам в данной базе данных. Эти привилегии сохранены в таблицах mysql.db и mysql.host.
Уровень таблиц (Table level)
Привилегии таблиц обращаются ко всем столбцам в данной таблице. Эти привилегии сохранены в таблице mysql.tables_priv.
Уровень столбцов (Column level)
Привилегии столбцов обращаются к одиночным столбцам в данной таблице. Эти привилегии сохранены в таблице mysql.columns_priv.

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

Для инструкций GRANT и REVOKE аргумент priv_type может быть определен как любой из следующего списка:

ALL PRIVILEGES   FILE         RELOAD     ALTER   INDEX     SELECT
CREATE           INSERT       SHUTDOWN   DELETE  PROCESS   UPDATE
DROP             REFERENCES   USAGE

ALL представляет собой синоним для ALL PRIVILEGES. REFERENCES пока не реализовано. USAGE в настоящее время представляет собой синоним для ``no privileges''. Это может быть применено, когда Вы хотите создать пользователя, который не имеет никаких привилегий.

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

REVOKE GRANT OPTION ON ... FROM ...;

Значения priv_type, которые Вы можете определять для таблицы: SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT, INDEX и ALTER.

Значения priv_type, которые Вы можете определять для столбца (то есть, когда Вы используете аргумент column_list): SELECT, INSERT и UPDATE.

Вы можете устанавливать глобальные привилегии, используя синтаксис ON *.*. Вы можете устанавливать привилегии базы данных, используя синтаксис ON db_name.*. Если Вы определяете ON *, и Вы имеете текущую базу данных, Вы установите привилегии именно для этой базы данных. ПРЕДУПРЕЖДЕНИЕ: Если Вы определяете ON *, и Вы не имеете текущей базы данных, Вы будете воздействовать на глобальные привилегии!

Чтобы приспосабливать предоставление прав на пользователей с произвольных компьютеров, MySQL поддерживает определение значения user_name в форме user@host. Если Вы хотите определять строку user или строку host, содержащую специальные или групповые символы (например, `-'), Вы можете цитировать имя пользователя или хоста (например, 'test-user'@'test-hostname').

Вы можете определять групповые символы в hostname. Например, user@"%.joker.botik.ru" применяется к user для любого компьютера в домене joker.botik.ru, а user@"144.155.166.%" будет применено к user с любой машины в сети 144.155.166 класса C.

Простая форма user представляет собой синоним для user@"%". ОБРАТИТЕ ВНИМАНИЕ: Если Вы позволяете анонимным пользователям соединяться с сервером MySQL (что является значением по умолчанию), Вы должны также добавить всех локальных пользователей как user@localhost потому, что иначе анонимная запись в таблице mysql.user будет применяться, когда пользователь попробует зарегистрироваться на сервере MySQL с локальной машины! Анонимные пользователи определены вставкой записей с User='' в таблицу mysql.user. Вы можете проверять, применяется ли это у Вас, выполняя такой запрос:

mysql> SELECT Host,User FROM mysql.user WHERE User='';

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

Привилегии для таблицы или столбца сформированы из логического ИЛИ (OR) привилегий в каждом из четырех уровней привилегии. Например, если таблица mysql.user определяет, что пользователь имеет глобальную привилегию select, это не может быть отменено записью на других уровнях доступа!

Привилегии для столбца могут быть вычислены следующим образом:

global privileges OR
(database privileges AND host privileges) OR
table privileges OR column privileges

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

Если Вы предоставляете привилегии для комбинации user/hostname, которая не существует в таблице mysql.user, запись будет добавлена и останется там пока ее не удалят командой DELETE. Другими словами, GRANT может создавать записи в таблице user, но REVOKE не будет удалять их. Вы должны делать это явно, используя вызов DELETE.

В MySQL Version 3.22.12 или позже, если новый пользователь создан, или если Вы имеете глобальные привилегии, пароль пользователя будет установлен в пароль, определенный предложением IDENTIFIED BY, если оно задано. Если пользователь уже имел пароль, он будет заменен новым.

ПРЕДУПРЕЖДЕНИЕ: Если Вы создаете нового пользователя, но не определяете предложение IDENTIFIED BY, пользователь не имеет никакого пароля. Это опасно.

Пароли также могут быть установлены командой SET PASSWORD. Подробности в разделе "14.5.6 Синтаксис SET".

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

Если пользователь не имеет привилегий на таблице, данная таблица не отображается вообще, когда пользователь запрашивает список таблиц (например, инструкцией SHOW TABLES).

Предложение WITH GRANT OPTION дает пользователю способность передать другим пользователям любые привилегии, которые этот пользователь имеет в определенном уровне доступа. Вы должны быть внимательным к тому, кому Вы даете привилегию grant, поскольку два пользователя с различными привилегиями могут быть способны соединить свои привилегии!

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

Знайте, что, когда Вы предоставляете пользователю привилегию grant в специфическом уровне привилегии, любые привилегии, которые пользователь уже имеет (или получит в будущем!) в этом уровне также могут передаваться этим пользователем кому угодно. Предположите, что Вы предоставляете пользователю привилегию insert на базе данных. Если Вы затем предоставляете привилегию select на базе данных и определяете WITH GRANT OPTION, пользователь сможет передавать не только привилегию select, но и insert! Если Вы затем предоставляете ему еще и привилегию update на базе данных, этот пользователь сможет передавать insert, select и update.

Вы не должны предоставлять привилегию alter нормальному пользователю. Если Вы это сделаете, пользователь может попробовать разрушить систему привилегии, переименовывая таблицы!

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

Когда mysqld запускается, все привилегии читаются в память. Привилегии, связанные с базами данных, таблицами и столбцами начинают действовать сразу же, а связанные с пользователями сработают, когда пользователь соединится с сервером в следующий раз. Модификации к таблицам предоставления, которые Вы выполняете, используя GRANT или REVOKE воспринимаются сервером немедленно. Если Вы изменяете таблицы предоставления вручную (используя INSERT, UPDATE и т.д.), Вы должны выполнить инструкцию FLUSH PRIVILEGES или запустить команду mysqladmin flush-privileges, чтобы сервер перезагрузил все таблицы предоставления привилегий.

Самые большие различия между ANSI SQL и MySQL версиями оператора GRANT:

10.1.2 Имена и пароли пользователей MySQL

Имеются несколько различий между использованием имен и паролей MySQL и Unix или Windows:

Пользователи MySQL и их привилегии обычно создаются командой GRANT. Подробности в разделе "10.1 Синтаксис GRANT и REVOKE".

Когда Вы входите в систему на сервере MySQL с помощью клиента командной строки, Вы должны определить пароль с помощью опции --password=your-password. Подробности изложены в разделе "10.7 Связь с сервером MySQL":

mysql --user=monty --password=guess database_name

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

mysql --user=monty --password database_name

Или в кратком виде:

mysql -u monty -p database_name

Обратите внимание, что в последнем примере пароль НЕ database_name.

Если Вы хотите использовать опцию -p, чтобы задать пароль, сделайте это так:

mysql -u monty -pguess database_name

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

10.2 Общие принципы защиты

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

Очень важно уделить внимание проблемам безопасности всего сервера (а не только MySQL) и защите от всех типов атак.

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

При запуске MySQL следуйте этим руководящим принципам:

10.2 Как защитить MySQL от хакеров

Когда Вы соединяетесь с сервером MySQL, Вы обычно должны использовать пароль. Он не передается открытым текстом, однако, алгоритм шифрования не очень силен, и с некоторым усилием умный нападаюший может расколоть пароль, если может перехватить трафик. Если подключение между пользователем и сервером проходит недоверенную сеть, Вы должны использовать SSH-туннель, чтобы шифровать связь. Увы, хакеры сделали шифрование совершенно мирной связи обычным делом. А думали ли мы все, что через три года будем совершенно спокойно воспринимать шифрование данных не в военных системах, а дома?

Вся другая информация будет перемещена как текст, который может читаться любым, кто способен наблюдать подключение. Если Вы обеспокоены относительно этого, Вы можете использовать сжатый протокол (в MySQL версии 3.22 и выше), чтобы делать такое чтение намного тяжелее. Чтобы сделать связь более безопасной, Вы должны использовать ssh. Вы можете скачать исходные тексты клиентской части ssh с http://www.openssh.org, коммерческая версия клиента ssh доступна на http://www.ssh.com. Теперь Вы можете получить шифрованное TCP/IP подключение к серверу MySQL.

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

10.3 Параметры запуска для mysqld, связанные с защитой

Следующие параметры mysqld воздействуют на защиту:

--safe-show-database
С этой опцией SHOW DATABASES возвращает только те базы данных, для которых пользователь имеет некоторую привилегию.
--safe-user-create
Если включено, пользователь не может создавать новых пользователей командой GRANT, если он не имеет права INSERT на таблице mysql.user. Если Вы хотите давать пользователю доступ к созданию новых пользователей с теми привилегиями, которые он имеет право предоставить, Вы должны дать ему следующую привилегию:
GRANT INSERT(user) on mysql.user to 'user''hostname';
Это гарантирует, что пользователь не может изменять любые столбцы привилегий непосредственно, а должен использовать команду GRANT, чтобы дать привилегии другим пользователям.
--skip-grant-tables
Эта опция заставляет сервер не использовать систему привилегий вообще. Это дает каждому полный доступ ко всем базам данных! Вы можете сообщить, чтобы сервер начал использовать таблицы привилегий снова, выполняя команду mysqladmin flush-privileges или mysqladmin reload.
--skip-name-resolve
Не преобразовывать имена. Все значения столбца Host в таблицах предоставления привилегий должны быть IP-адресами или localhost.
--skip-networking
Не слушать TCP/IP подключения вообще. Все взаимодействие с mysqld должно быть выполнено через сокеты Unix. Эта опция очень рекомендуется на системах, где позволяются только локальные запросы. Эта опция не подходит для систем, которые используют MIT-PTHREADS потому, что пакет MIT-PTHREADS не поддерживает Unix-сокеты.
--skip-show-database
Инструкция SHOW DATABASES не будет возвращать ничего.

10.4 Что делает система привилегий

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

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

10.5 Как работает система привилегий

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

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

Управление доступом MySQL включает две стадии:

Сервер использует таблицы user, db и host в базе данных mysql на обеих стадиях управления доступа. Поля в этих таблицах показаны ниже:

Имя таблицыuser dbhost
Поля контекстаHost HostHost
UserDb Db
PasswordUser
Поля привилегийSelect_priv Select_privSelect_priv
Insert_privInsert_priv Insert_priv
Update_privUpdate_priv Update_priv
Delete_privDelete_priv Delete_priv
Index_privIndex_priv Index_priv
Alter_privAlter_priv Alter_priv
Create_privCreate_priv Create_priv
Drop_privDrop_priv Drop_priv
Grant_privGrant_priv Grant_priv
References_priv
Reload_priv
Shutdown_priv
Process_priv
File_priv

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

Имя таблицыtables_priv columns_priv
Поля контекстаHost Host
DbDb
UserUser
Table_nameTable_name
Column_name
Поля привилегийTable_priv Column_priv
Column_priv
Прочие поляTimestamp Timestamp
Grantor

Каждая таблица содержит поля области (контекста) и поля привилегий.

Поля контекста определяют область (контекст) каждой записи в таблицах, то есть тот контекст, в котором применяется данная запись. Например, запись в таблице user со значениями Host и User 'thomas.joker.botik.ru' и 'bob' соответственно использовалась бы для подтверждения подключений, сделанных на сервер пользователем bob с компьютера thomas.joker.botik.ru. Точно так же запись таблицы db с полями Host, User и Db, выставленными соответственно в thomas.joker.botik.ru, bob и reports, использовалась бы, когда bob соединяется с компьютера thomas.joker.botik.ru, чтобы обратиться к базе данных отчетов (reports). Таблицы tables_priv и columns_priv хранят поля области (контекста), указывающие таблицы или комбинации таблицы/столбца, к которым применяется каждая запись.

Для целей проверки доступа значения Host нечувствительны к регистру. Зато User, Password, Db и значения Table_name еще как чувствительны! Column_name нечувствительны в MySQL версии 3.22.12 или позже.

Поля привилегий указывают привилегии, предоставленные записью таблицы, то есть какие операции могут выполняться. Сервер объединяет информацию из различных таблиц предоставления привилегий, чтобы сформировать полное описание прав данного пользователя. Правила, используемые, чтобы это сделать, подробно описаны в разделе "10.9 Контроль доступа, стадия 2: Проверка запросов".

Поля контекста представляют собой строки, объявленные как показано ниже. Значение по умолчанию для каждой: пустая строка:

Имя поляТип
HostCHAR(60)
UserCHAR(16)
Password CHAR(16)
DbCHAR(64) (CHAR(60) для таблиц tables_priv и columns_priv)
Table_nameCHAR(60)
Column_nameCHAR(60)

В таблицах user, db и host все поля привилегий объявлены как ENUM('N','Y'): каждое может иметь значение 'N' или 'Y', значение по умолчанию 'N'.

В таблицах tables_priv и columns_priv поля привилегий объявлены как поля SET:

Имя таблицыИмя поля Возможные элементы набора
tables_privTable_priv 'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter'
tables_privColumn_priv 'Select', 'Insert', 'Update', 'References'
columns_priv Column_priv 'Select', 'Insert', 'Update', 'References'

Сервер использует таблицы предоставления подобно этому алгоритму:

Обратите внимание, что административные привилегии (reload, shutdown и т.д.) определены только в таблице user. Это потому, что административные операции выполняются непосредственно на сервере и не специфические для базы данных, так что нет никакой причины внести в список такие привилегии в других таблицах. Фактически, только таблица user должна использоваться, чтобы определить, можете ли Вы выполнять административную операцию или нет.

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

Сервер mysqld читает содержание таблиц только один раз, при своем запуске. Изменения для таблиц предоставления привилегий вступают в силу как сказано в разделе "10.11 Когда изменения привилегий вступают в силу".

Когда Вы изменяете содержание таблиц предоставления, стоит удостовериться, что Ваши изменения установили привилегии так, как Вы хотите. Для справки в диагностировании проблем обратитесь в раздел "10.10 Причины ошибки Access denied. Проблемы с защитой подробно рассмотрены в разделе "10.2 Как защитить MySQL от хакеров".

Полезный диагностический инструмент: скрипт mysqlaccess, который Yves Carlier предоставил для дистрибутива MySQL. Вызовите mysqlaccess с опцией --help, чтобы выяснить, как это работает. Обратите внимание, что mysqlaccess проверяет доступ, используя только таблицы user, db и host. Это не проверяет привилегии уровня столбца или таблицы.

10.6 Привилегии, предоставляемые MySQL

Информация относительно привилегий пользователя сохранена в таблицах user, db, host, tables_priv и columns_priv в базе данных mysql. Сервер MySQL читает содержание этих таблиц при запуске и при обстоятельствах, перечисленных в разделе "10.11 Когда изменения привилегий вступают в силу".

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

ПривилегияСтолбец Контекст (поле) действия
selectSelect_priv таблицы
insertInsert_priv таблицы
updateUpdate_priv таблицы
deleteDelete_priv таблицы
indexIndex_priv таблицы
alterAlter_priv таблицы
createCreate_privбазы данных, таблицы или индексы
dropDrop_privбазы данных или таблицы
grantGrant_privбазы данных или таблицы
referencesReferences_priv базы данных или таблицы
reloadReload_priv серверное администрирование
shutdownShutdown_priv серверное администрирование
processProcess_priv серверное администрирование
fileFile_privдоступ к файлам на сервере

Привилегии select, insert, update и delete позволяют Вам выполнять операции на строках в существующих таблицах в базе данных.

Инструкции SELECT требуют привилегии select только, если они фактически восстанавливают строки из таблицы. Вы можете выполнять некоторые инструкции SELECT даже без разрешения обратиться к любой из баз данных на сервере. Например, Вы могли бы использовать клиента mysql как простой калькулятор:

mysql> SELECT 1+1;
mysql> SELECT PI()*2;

Привилегия index позволяет создавать или удалять индексы.

Привилегия alter позволяет использовать ALTER TABLE.

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

Обратите внимание, что, если Вы предоставляете привилегию drop для базы данных mysql пользователю, он сможет удалить всю базу данных, в которой сохранены привилегии доступа MySQL!

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

Привилегия file дает Вам разрешение читать и писать файлы на сервере, используя инструкции LOAD DATA INFILE и SELECT ... INTO OUTFILE. Любой пользователь, кому эта привилегия предоставляется, может читать или писать любой файл, который доступен на чтение или запись серверу MySQL.

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

ПривилегияКоманды, разрешенные держателям данной привилегии
reloadreload, refresh, flush-privileges, flush-hosts, flush-logs и flush-tables
shutdownshutdown
processprocesslist, kill

Команда reload сообщает, что сервер должен заново прочитать таблицы предоставления привилегий. Команда refresh сбрасывает на диск все таблицы, закрывает и заново открывает журналы. Привилегия flush-privileges является синонимом для reload. Другие команды flush-* выполняют функции, подобные refresh, но в более ограниченном контексте, и могут быть предпочтительны в некоторых ситуациях. Например, если Вы хотите только сбросить на диск журналы, команда flush-logs представляет собой лучший выбор, чем refresh.

Команда shutdown выключает сервер.

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

Некоторые предосторожности при предоставлении привилегий:

Имеются некоторые вещи, которые Вы не можете делать с системой привилегий MySQL:

10.7 Связь с сервером MySQL

Клиент MySQL требует, чтобы Вы определили параметры подключения, когда Вы хотите обратиться к серверу MySQL: компьютер, с которым надо связаться, Ваше имя пользователя и пароль. Например, клиент mysql может быть запущен примерно так (факультативные параметры заключены в `[' и `]'):

shell> mysql [-h host_name] [-u user_name] [-pyour_pass]

Альтернативные формы параметров -h, -u и -p: --host=host_name, --user=user_name и --password=your_pass. Обратите внимание, что не должно быть никаких пробелов вообще между -p или --password= и паролем.

ОБРАТИТЕ ВНИМАНИЕ: Определение пароля в командной строке далеко не безопасно! Любой пользователь в Вашей системе может выяснить Ваш пароль командой, наподобие ps auxww.

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

Таким образом, для Unix-пользователя joe эквивалентно:

shell> mysql -h localhost -u joe
shell> mysql -h localhost
shell> mysql -u joe
shell> mysql

Другая MySQL-клиентура ведет себя аналогично.

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