В этом описании рассматривается СУБД MySQL. Руководство рассчитано на пользователей среднего уровня подготовки. Оно может быть использовано как в качестве справочного руководства по данной СУБД, так и в качестве учебника. В целях его использования в качестве справочника, в самом начале документа предусмотрено полное оглавление.
ЭТО НЕ ПЕРЕВОД ОРИГИНАЛЬНОЙ ДОКУМЕНТАЦИИ! Этот документ написан после прочтения фирменной документации, работы с пакетом и даже попыток его повалить, правда, не слишком удачных. Таким образом, в документе нашлось место и для личного мнения автора по ряду вопросов. Этот абзац мне пришлось включить на основании опыта подготовки подобной документации. Увы, описания, выстраданные кропотливым изучением программ, посчитали примитивным переводом, что говорит о том, что с ними просто не ознакомились должным образом. Я не отрицаю изучения мной оригинальной документации на пакет, но этот документ переводом не является.
С другой стороны, мне понравилась структура оригинальной документации, и я ее по, возможности, придерживался. Однако, структура-это еще не документация.
Данное описание пакета MySQL подготовлено Паутовым Алексеем Валентиновичем в качестве курсовой работы. По вопросам использования данного документа прошу обращаться по e-mail.
Я заранее приношу извинения за ошибки и неточности (если таковые здесь есть), и прошу Вас сообщить мне о них. Я постараюсь их исправить. Я не несу какой-либо ответственности за какие бы то ни было последствия применения данного документа или сведений, изложенных в нем (в частности, упоминания возможных дыр в защите СУБД). Так что, если кто-то, прочитав этот документ возьмет, да и сотрет базу данных записей этак тысяч на сто, то я тут ни при чем!
В заключение хочется попросить Вас, если Вам понравилась эта страничка или пригодилась изложенная здесь информация, послать благодарность автору. Это поможет мне вести статистику того, скольким людям пригодилось хоть что-то из моих трудов.
Ну а теперь к делу...
MySQL разработал Михаэль Видениус (Michael Widenius, monty@analytikerna.se). MySQL является относительно небольшой и быстрой реляционной СУБД основанной на традициях Hughes Technologies Mini SQL (mSQL).
Последнюю версию MySQL можно скачать с www.tcx.se.
Перечислю основные приятные стороны пакета MySQL.
SQL - это сокращение от Structured Query Language (структурированный язык запросов). SQL создан для работы с реляционными базами данных. Он позволяет пользователям взаимодействовать с базами данных (просматривать, искать, добавлять и управлять данными). MySQL соответствует спецификации ANSI 92 SQL. Подробности.
Наиболее простой способ работы с MySQL сводится к использованию программы MySQL. Это клиентская часть СУБД MySQL. Можно выполнять команды SQL непосредственно из командной строки системы unix или из интерактивного режима MySQL. Подробнее о клиентских программах.
СУБД MySQL имеет библиотеку C API. Ее можно использовать для запросов к базе данных, вставки данных, создания таблиц и т.п. C API поддерживает все функции MySQL. Подробности в главе "Интерфейс для С (C API)".
Язык perl поддерживается сразу двумя способами:
Также доступен 32-битный ODBC драйвер для MySQL. Он позволяет запрашивать и получать данные из других источников с поддержкой ODBC. С подробностями можно ознакомиться на домашней страничке MySQL (увы, только на английском языке).
В заключение хочется попросить Вас, если Вам понравилась эта страничка или пригодилась изложенная здесь информация, послать благодарность автору. Это поможет мне вести статистику того, скольким людям пригодилось хоть что-то из моих трудов.
Это простой пример того, как может выглядеть вполне типичная база данных.
В проектировании базы данных первое дело, которое Вы должны сделать, это вычислить последовательность действий, необходимых Вам для решения поставленной задачи. В SQL это может выглядеть так:
# The Widget table. # # Detailed information on a widget. Linked to by Purchase_Order_Item # by way of the widget_id field. Linked to Widget_Color by way of # the widget_color field, and to the Widget_Size table by way of the # widget_size field. CREATE TABLE Widget_Table ( widget_id MEDIUMINT(8) NOT NULL AUTO_INCREMENT, widget_name CHAR(60) NOT NULL, widget_color_id MEDIUMINT(8) NOT NULL, widget_size_id MEDIUMINT(8) NOT NULL, widgets_on_hand SMALLINT NOT NULL, widget_price FLOAT(8,2) NOT NULL, commission_percent FLOAT(2,2) NOT NULL, PRIMARY KEY (widget_id), KEY (widget_name), KEY (widget_color_id,widget_size_id) );
Первая строка сообщает СУБД MySQL, что мы определяем таблицу по имени Widget_Table. Следующие шесть строк определяют поля, которые таблица содержит, тип данных, которые входят в них, и какие атрибуты эти поля имеют.
Прежде, чем Вы сможете создать эту таблицу, Вы должны создать пустую базу данных. В MySQL это выполнено посредством программы mysqladmin.
prompt> mysqladmin create Widget-DB
Одна из множества основных концепций в хорошем проекте реляционной базы данных это то, что Вы никогда не должны хранить избыточные данные. В случае Widget_Table это отражено в полях Widget_color_id и widget_size_id. Эти два поля могли бы быть строками. Взамен мы делаем их указателями на другие таблицы, которые будут содержать одну запись для каждого возможного значения, которое может содержать такое поле.
Это сделано по двум причинам:
Widget_id поле - среда (3 байт) установленное по размеру целое число. Это имеет специальные атрибуты NOT NULL и AUTO_INCREMENT. NOT NULL является ANSI SQL стандартом и определяет что, когда кто-то вводит widget информацию в эту таблицу, они должны дать некоторое значение для этого поля. Если не дали, MySQL назначит полю значение по умолчанию. Конечно, если значение по умолчанию было определено, то будет использоваться оно, когда не задано никакого значения. Если же оно не определено, то поле получит значение, исходя из его типа.
AUTO_INCREMENT специфический атрибут MySQL. Если Вы вставляете ноль в это поле MySQL, автоматически назначит значение, которое на единицу выше, чем самое высокое предыдущее значение, назначенное к этому полю в этой таблице. Это простой метод для производства уникальных идентификаторов для нового widgets, поскольку они введены в таблицу.
Мы также определяем несколько ключей. Когда Вы назначаете полю атрибут AUTO_INCREMENT, Вы должны также определить это поле как первичный ключ. Вы можете иметь только один первичный ключ на таблицу. Только одно поле на таблицу может иметь AUTO_INCREMENT атрибут.
Мы также создаем вторичные индексы использованием слова KEY. Индексирование значительно увеличивает быстродействие запросов и объединений. Индексы могут включать больше чем одно поле. Если Вы имеете индекс, который включает больше чем одно поле, Вы не нуждаетесь в создании другого индекса с первым полем в составном индексе.
Мы определили Widget_Table. Теперь надо определить путь слежения за заказами. Для этой цели мы определяем таблицу Purchase_Order.
# The Purchase Order table. # # customer_id links us to the Customer_Table # Where we can get more information about the customer. # # To allow for N items on a Purchase order we have to # have another table called Purchase_Order_Item that # we link to be way of purchase_order. CREATE TABLE Purchase_Order ( purchase_order MEDIUMINT(8) NOT NULL AUTO_INCREMENT, customer_id SMALLINT NOT NULL, order_date DATE NOT NULL, due_date DATE NOT NULL, close_date DATE NOT NULL, status_code TINYINT(2) UNSIGNED NOT NULL, last_action_date TIMESTAMP, PRIMARY KEY (purchase_order), KEY (customer_id,order_date,status_code) );
Мы считаем, что заказчик собирается заказывать у нас товар более чем однажды. По этой причине вместо записей об адресе и имени заказчика, мы назначаем каждому заказчику уникальный номер идентификации, который связывает нас со входом в таблице, которая содержит эту информацию. Мы назовем эту таблицу Customer. О ней поговорим немного позже. Также обратите внимание, что мы не имеем никакого упоминания о widgets в этой таблице. Это потому, что порядок приобретения может быть разным. Мы могли бы только определить некоторое фиксированное число способов покупки, но это не будет очень гибко. Взамен этого мы определяем поле, названное purchase_order, которое будет содержать уникальный номер для каждого способа приобретения. Затем мы определяем другую таблицу, которая будет содержать один вход для каждого значения порядка покупки.
Еще одно интересное поле last_action_date. Это поле имеет тип TIMESTAMP. Поля этого типа автоматически модифицируются всякий раз, когда на них выполняется команда INSERT или UPDATE. Это показывает, когда запись была в последний раз изменена.
Таблица для Purchase_Order_Item:
# The Purchase_Order_Item table. # # Since there can be more than one item on a purchase order # we need a table that contains a single item. We link back to # The main Purchase_Order table by use of the purchase_order field. # # We can also link back to the Widget_Table table by use of the # widget_id field. # # Last of all we link to the Status table by way of the status_code field. CREATE TABLE Purchase_Order_Item ( purchase_order SMALLINT NOT NULL, order_sequence SMALLINT NOT NULL, widget_id MEDIUMINT(8) NOT NULL, quantity SMALLINT(4) UNSIGNED NOT NULL, status_code TINYINT(2) UNSIGNED NOT NULL, order_date DATE NOT NULL, item_due_date DATE NOT NULL, deliver_date DATE NOT NULL, last_action_date TIMESTAMP, PRIMARY KEY (purchase_order,order_sequence), KEY (widget_id), KEY (status_code,order_date) );
В таблице Purchase_Order_Item хранится информация о всех элементах поля способа покупки. Здесь хранится информация о том кто, когда, что и сколько заказывал.
Таблица Customer:
# The Customer table. # # We need to know where to send those widgets. # # Links back to Purchase_Order by way of customer_id. CREATE TABLE Customer ( customer_id SMALLINT NOT NULL AUTO_INCREMENT, customer_name VARCHAR(80) NOT NULL, customer_contact VARCHAR(80) NOT NULL, customer_address VARCHAR(80), customer_city VARCHAR(80), customer_zip VARCHAR(10), customer_phone VARCHAR(20), customer_fax VARCHAR(20), PRIMARY KEY (customer_id), KEY (customer_name) );
Это и совсем просто. Здесь хранится информация о каждом заказчике: его имя, с кем связаться в случае проблем, адрес, телефон и факс.
Теперь давайте подумаем. Среди заказчиков наверняка найдутся свободные торговцы, которые рады продавать Ваш товар по своим ценам. Неплохо бы их привлечь к себе, например, небольшой скидочкой. Но для этого надо хотя бы примерно представлять, кто купил товар для себя, а кто на продажу. Отлично, накроем их колпаком.
# The Sales_droid table. # # Keep track of the people who sell the widgets. # CREATE TABLE Sales_Droid ( sales_droid_id SMALLINT NOT NULL AUTO_INCREMENT, sales_droid_first_name VARCHAR(80) NOT NULL, sales_droid_last_name VARCHAR(80) NOT NULL, sales_droid_phone VARCHAR(20) NOT NULL, PRIMARY KEY (sales_droid_id) );
Нужны еще три простые таблицы для служебной информации:
# The Status table. # # Table to contain all valid status codes. # # Links to to Purchase_Order_Item and Purchase_Item by way of status_code. CREATE TABLE Status ( status_code TINYINT NOT NULL AUTO_INCREMENT, status_text VARCHAR(80) NOT NULL, PRIMARY KEY(status_code) );
Таблица Status очень простая. Нам нужен уникальный числовой ID, который связан с коротким текстовым полем, которое содержит текст кода состояния.
# The Widget_Color table. # # Table to contain all valid color codes. CREATE TABLE Widget_Color ( widget_color_id TINYINT NOT NULL AUTO_INCREMENT, color_text VARCHAR(80) NOT NULL, PRIMARY KEY(widget_color_id) ); # The Widget_Size table. # # Table to contain all valid color codes. CREATE TABLE Widget_Size ( widget_size_id TINYINT NOT NULL AUTO_INCREMENT, size_text VARCHAR(80) NOT NULL, PRIMARY KEY(widget_size_id) );
Таблицы Widget_Color и Widget_Size почти идентичен таблице Status. Только имена изменены.
Все! Можно вводить данные.
В заключение хочется попросить Вас, если Вам понравилась эта страничка или пригодилась изложенная здесь информация, послать благодарность автору. Это поможет мне вести статистику того, скольким людям пригодилось хоть что-то из моих трудов.
Перенос прикладных программ mSQL в MySQL относительно прост.
Сначала выполните скрипт msql2mysql (поставляется вместе с MySQL) над вашим источником. Он оттранслирует имена функций mSQL в имена функций MySQL. Но он не будет корректировать типы параметров или изменять число параметров в функциях MySQL, которые нуждаются в дополнительных параметрах.
Замечания:
MySQL поставляется с портированными версиями тестовых программ mSQL insert_test.c и select_test.c. Хорошая идея сравнить их с их mSQL эквивалентами. Это должно дать Вам хорошее начало для понимания, что Вы будете должны сделать для портирования mSQL программы в MySQL. Это также даст Вам некоторые мысли о том, что Вы должны делать, чтобы написать свою MySQL программу.
Имеются значительные различия. Среди них:
- CREATE TABLE: MySQL: имеет опции для поля: UNSIGNED, ZEROFILL, имеет значение по умолчанию для не пустых полей. mSQL: опций не имеет. - Создание индексов: MySQL: Все индексы должны быть заданы в CREATE TABLE. mSQL: Индексы должны быть созданы отдельным оператором CREATE INDEX. (msql использует новый файл ключа для каждого индекса?) Индексы могут быть удалены оператором DROP INDEX - Для получения уникального идентификатора при вставке: MySQL: Используйте 'auto_increment' как определение типа столбца. Используемый индекс может быть получен после обновления функцией API mysql_insert_id(). mSQL: Создает структуру SEQUENCE для таблицы и использует функцию __seq для получения уникального индекса. - Групповые функции: MySQL: count(), avg(), min(), max() и sum(). min() и max() могут принимать строковые аргументы. count(*) оптимизирована для возвращения значения в случае одного столбца. mSQL: Нет. - Независимый от регистра поиск: MySQL: LIKE обязательно не зависит от регистра. Если возможно, MySQL использует индексы при условии, что подобный параметр не начинается с подстановочных знаков. mSQL: Использует CLIKE. - Поиск с регулярными выражениями. MySQL: Использует REGEXP or RLIKE mSQL: Использует RLIKE. - Какие различия в операторе WHERE: MySQL имеет скобки, Скоро он будет иметь полную функциональную поддержку оператора WHERE (это планируется для версии 3.21.X). - Имена столбцов: MySQL: Если имя столбца уникально, Вы не должны использовать полное имя. mSQL: При использовании более чем одной таблицы в SELECT, Вы должны использовать полное имя таблицы. - Псевдонимы: MySQL: Псевдонимы для таблиц и столбцов. mSQL: Псевдонимы для таблиц. - Insert/update с вычислениями: MySQL: Полная поддержка вычислений. В insert можно использовать значения предшествующих полей. mSQL: Только константы в insert и update. - Какие формулы могут использоваться в инструкции select: MySQL: См. руководство. mSQL: Никакие. - HAVING: MySQL: Поддерживается, но может использовать вычисление только на выбранных полях. Для select на расчетном значении, нужно использовать псевдоним столбца. ПРИМЕР: SELECT COUNT(*) AS id_count, id FROM groups GROUP BY id HAVING id_count > 10 mSQL: Не поддерживается вовсе. - Импорт и экспорт данных: MySQL: MySQL имеет соответствующие функциональные возможности, включая сервис для импорта данных посредством оператора LOAD DATA INFILE, что весьма ускоряет загрузку данных. mSQL: Внешние программы.
В заключение хочется попросить Вас, если Вам понравилась эта страничка или пригодилась изложенная здесь информация, послать благодарность автору. Это поможет мне вести статистику того, скольким людям пригодилось хоть что-то из моих трудов.
Модуль расширения для web-сервера Apache. Обеспечивает аутенфикацию пользователей, соединяющихся с Вашим web-сайтом.
PTS:Проект трассировочной системы для отладчика.
В заключение хочется попросить Вас, если Вам понравилась эта страничка или пригодилась изложенная здесь информация, послать благодарность автору. Это поможет мне вести статистику того, скольким людям пригодилось хоть что-то из моих трудов.
Во избежание искажения смысла лицензии, являющейся юридическим докуметом, привожу ее в оригинальном виде (скопирована из оригинальной документации).
MYSQL FREE PUBLIC LICENSE (Version 4, March 5, 1995) Copyright (C) 1995, 1996 TcX AB & Monty Program KB & Detron HB Stockholm SWEDEN, Helsingfors FINLAND and Uppsala SWEDEN, All rights reserved. NOTE: This license is not the same as any of the GNU Licenses published by the Free Software Foundation. Its terms are substantially different from those of the GNU Licenses. If you are familiar with the GNU Licenses, please read this license with extra care. This License applies to the computer program known as "mysql". The "Program", below, refers to such program, and a "work based on the Program" means either the Program or any derivative work of the Program, as defined in the United States Copyright Act of 1976, such as a translation or a modification. The Program is a copyrighted work whose copyright is held by TcX Datakonsult AB and Monty Program KB and Detron HB. BY MODIFYING OR DISTRIBUTING THE PROGRAM (OR ANY WORK BASED ON THE PROGRAM), YOU INDICATE YOUR ACCEPTANCE OF THIS LICENSE TO DO SO, AND ALL ITS TERMS AND CONDITIONS FOR COPYING, DISTRIBUTING OR MODIFYING THE PROGRAM OR WORKS BASED ON IT. NOTHING OTHER THAN THIS LICENSE GRANTS YOU PERMISSION TO MODIFY OR DISTRIBUTE THE PROGRAM OR ITS DERIVATIVE WORKS. THESE ACTIONS ARE PROHIBITED BY LAW. IF YOU DO NOT ACCEPT THESE TERMS AND CONDITIONS, DO NOT MODIFY OR DISTRIBUTE THE PROGRAM. 1. Licenses. Licensor hereby grants you the following rights, provided that you comply with all of the restrictions set forth in this License and provided, further, that you distribute an unmodified copy of this License with the Program: (a) You may copy and distribute literal (i.e., verbatim) copies of the Program's source code as you receive it throughout the world, in any medium. (b) You may modify the Program, create works based on the Program and distribute copies of such throughout the world, in any medium. 2. Restrictions. This license is subject to the following restrictions: (a) Distribution of the Program or any work based on the Program by a commercial organization to any third party is prohibited if any payment is made in connection with such distribution, whether directly (as in payment for a copy of the Program) or indirectly (as in payment for some service related to the Program, or payment for some product or service that includes a copy of the Program "without charge"; these are only examples, and not an exhaustive enumeration of prohibited activities). However, the following methods of distribution involving payment shall not in and of themselves be a violation of this restriction: (i) Posting the Program on a public access information storage and retrieval service for which a fee is received for retrieving information (such as an on-line service), provided that the fee is not content-dependent (i.e., the fee would be the same for retrieving the same volume of information consisting of random data). (ii) Distributing the Program on a CD-ROM, provided that the files containing the Program are reproduced entirely and verbatim on such CD-ROM, and provided further that all information on such CD-ROM be redistributed for non-commercial purposes without charge. (b) Activities other than copying, distribution and modification of the Program are not subject to this License and they are outside its scope. Functional use (running) of the Program is not restricted, and any output produced through the use of the Program is subject to this license only if its contents constitute a work based on the Program (independent of having been made by running the Program). (c) You must meet all of the following conditions with respect to the distribution of any work based on the Program: (i) If you have modified the Program, you must cause your work to carry prominent notices stating that you have modified the Program's files and the date of any change; (ii) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole and at no charge to all third parties under the terms of this License; (iii) If the modified program normally reads commands interactively when run, you must cause it, at each time the modified program commences operation, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty). Such notice must also state that users may redistribute the Program only under the conditions of this License and tell the user how to view the copy of this License included with the Program. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.); (iv) You must accompany any such work based on the Program with the complete corresponding machine-readable source code, delivered on a medium customarily used for software interchange. The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable code. However, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable code; (v) If you distribute any written or printed material at all with the Program or any work based on the Program, such material must include either a written copy of this License, or a prominent written indication that the Program or the work based on the Program is covered by this License and written instructions for printing and/or displaying the copy of the License on the distribution medium; (vi) You may not impose any further restrictions on the recipient's exercise of the rights granted herein. If distribution of executable or object code is made by offering the equivalent ability to copy from a designated place, then offering equivalent ability to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source code along with the object code. 3. Reservation of Rights. No rights are granted to the Program except as expressly set forth herein. You may not copy, modify, sub-license, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sub-license or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 4. Other Restrictions. If the distribution and/or use of the Program is restricted in certain countries for any reason, Licensor may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 5. Limitations. THE PROGRAM IS PROVIDED TO YOU "AS IS," WITHOUT WARRANTY. THERE IS NO WARRANTY FOR THE PROGRAM, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL LICENSOR, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
В заключение хочется попросить Вас, если Вам понравилась эта страничка или пригодилась изложенная здесь информация, послать благодарность автору. Это поможет мне вести статистику того, скольким людям пригодилось хоть что-то из моих трудов.
API поддерживает богатый ассортимент функций, которые обеспечивают доступ к СУБД MySQL из программы пользователя, независимо от того, запущена ли она в локальной или на удаленной системе.
Вы должны подключить файл mysql.h в начале Вашей программы на C:
#include "mysql.h"
Вы также должны компоновать программу с математической (для шифрования) и mysqlclient библиотеками:
$ cc -I/usr/include/mysql -L/usr/lib/mysql myapp.c -o myapp -lm -lmysqlclient
Включаемые файлы обычно размещены в /usr/include/mysql, а библиотеки могут быть найдены в /usr/lib/mysql.
Если Вы имеете утечку памяти в вашей программе-клиенте, Вы можете компилировать с опцией --with-debug=yes. Это заставит код клиента использовать пакет 'safe_malloc' в библиотеке клиентов MySQL. Вызовите TERMINATE(stdout) или my_end(1) в вашей прикладной программе-клиенте перед выходом, чтобы получить список всех утечек памяти. Детали - в файле mysys/safemalloc.c из дистрибутива MySQL.
Рассмотрим простой пример MySQL-клиента, который только выполнит SELECT и выведет все возвращенные строки в STDOUT. В нем использованы далеко не все функции С API, он должен только дать Вам представление о типичном виде программы-клиента.
#include <stdio.h> #include <stdlib.h> #include "mysql.h" MYSQL mysql; MYSQL_RES *res; MYSQL_ROW row; void exiterr(int exitcode) { fprintf(stderr, "%s\n", mysql_error(&mysql)); exit(exitcode); } int main() { uint i = 0; if (!(mysql_connect(&mysql,"host","username","password"))) exiterr(1); if (mysql_select_db(&mysql,"payroll")) exiterr(2); if (mysql_query(&mysql,"SELECT name,rate FROM emp_master")) exiterr(3); if (!(res = mysql_store_result(&mysql))) exiterr(4); while((row = mysql_fetch_row(res))) { for (i=0 ; i < mysql_num_fields(res); i++) printf("%s\n",row[i]); } if (!mysql_eof(res)) exiterr(5); mysql_free_result(res); mysql_close(&mysql); } |
MySQL API использует структуры данных MYSQL (определены в mysql.h) чтобы установить связь с СУБД. Вы можете устанавливать много соединений из одной программы-клиента, однако, каждое соединений должно быть связано с собственной отдельной структурой MYSQL.
После успешного запроса, если данные должны быть возвращены пользователю, набор результатов должен быть передан через функции mysql_use_result или через функцию mysql_store_result. Обе эти функции сохраняют набор результатов в структуре MYSQL_RES. Разница в том, что mysql_store_result передает весь набор результатов в память клиента, а mysql_use_result инструктирует клиента, чтобы он мог получить строку динамически с сервера с каждым обращением к mysql_fetch_row. Имейте в виду, что mysql_use_result занимает ресурсы сервера, и не должен использоваться для интерактивных прикладных программ, где действия пользователя часто непредсказуемы и могут привести к большим задержкам. Обратите внимание также, что Вы можете держать только одно соединение, которое использует mysql_user_result, открытым, и это должно быть последнее созданное соединение. По умолчанию процесс mysqld закроет соединение после тридцати секунд неактивности.
Данные, переданные из набора результатов с помощью mysql_fetch_row, будут помещены в структуру MYSQL_ROW, которая является просто массивом указателей на начало каждого поля.
СИНТАКСИС:
int mysql_affected_rows(MYSQL *mysql)
ОПИСАНИЕ:
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:
ПРИМЕР:
mysql_query(&mysql,"INSERT INTO gl_transact(acctnbr, amount) VALUES(12345, 651.30)"); if (mysql_affected_rows(&mysql) < 0) fprintf(stderr, "Attempted to add duplicate primary key\n");
MySQL оптимизирован для случая удаления всех записей в таблице. Побочный эффект этой оптимизации - то, что MySQL возвратится, ноль для числа строк, на которые воздействовал в этой ситуации. Выполнение 'select count(*) from the_table' перед удалением всех записей даст Вам значение = на сколько строк воздействовала система, хотя это значение может изменяться между SELECT и DELETE. MySQL 3.20.X не поддерживает блокировку таблицы. Это исправлено в версии 3.21.X
СИНТАКСИС:
void mysql_close(MYSQL *mysql);
ОПИСАНИЕ:
Закрывает открытое соединение подключение. mysql_close должен быть вызван после завершения всех операций, выполняемых через соединение с MySQL. Если это не сделать, поток, созданный mysql_connect, зависнет до окончания тайм-аута сервера. На сервере, работающем с сильной нагрузкой, это может быстро израсходовать много памяти, хотя нужно очень немного времени центрального процессора.
Если подключение закрыто до того, как запущенный запрос завершился, запрос будет продолжаться, пока не попытается вернуть результат пользователю. При этом он завершится аварийно, узнав, что соединение не активно.
По умолчанию тайм-аут = 30 секундам для активного запроса и 8 часам для открытого подключения.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:
СИНТАКСИС:
MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd)
ОПИСАНИЕ:
Пытается установить соединение с сервером MySQL, работающем на компьютере host. Значение host может быть сетевым именем или IP адресом. Параметр user задает логин пользователя MySQL, параметр passwd задает пароль для user. ОБРАТИТЕ ВНИМАНИЕ: Не пытайтесь шифровать passwd перед вызовом mysql_connect. Шифрование выполняется автоматически клиентским API.
mysql_connect должен успешно завершиться до каких-либо действий с базой данных.
Вы можете опционально задать первый аргумент mysql_connect как (MYSQL*) 0. Это вынудит C API к автоматическому распределению памяти для структуры подключения и освобождению ее при завершении. Расплатой за это служит то, что Вы не сможете получать сообщения об ошибках из mysql_connect, когда используете эту опцию.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:
ПРИМЕР:
MYSQL *mysql; if ((mysql = malloc(sizeof(MYSQL))) != NULL) { if (!(mysql_connect(mysql, "pr_server", "jqpublic", "mypasswd"))) { free(mysql); exit(1); } } free(mysql); |
СИНТАКСИС:
int mysql_create_db(MYSQL *mysql, const char *db);
ОПИСАНИЕ:
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:
СИНТАКСИС:
void mysql_data_seek(MYSQL_RES *res, uint offset);
ОПИСАНИЕ:
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:
СИНТАКСИС:
int mysql_drop_db(MYSQL *mysql, const char *db);
ОПИСАНИЕ:
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:
СИНТАКСИС:
ОПИСАНИЕ:
Возвращает значение != 0, если последний вызов mysql_fetch_row не вернул ничего потому, что достигнут конец набора результатов.
СИНТАКСИС:
ОПИСАНИЕ:
СИНТАКСИС:
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *handle);
ОПИСАНИЕ:
Находит тип поля таблицы.
СИНТАКСИС:
unsigned int *mysql_fetch_lengths(MYSQL_RES *mysql)
ОПИСАНИЕ:
Возвращает длину всех столбцов в наборе результатов запросов. Если Вы планируете получение данных, содержащих \0, Вы должны использовать эту функцию, чтобы получить фактическую длину значения поля.
СИНТАКСИС:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *mysql);
ОПИСАНИЕ:
Выбирает следующую строку в результате запроса. Возвратит пустой указатель, когда все строки были получены.
СИНТАКСИС:
ОПИСАНИЕ:
СИНТАКСИС:
void mysql_free_result(MYSQL_RES *result);
ОПИСАНИЕ:
Освобождает память, использованную, чтобы сохранить результат запроса. Должна быть вызвана всякий раз, когда Вы закончили использовать результаты вызова mysql_store_result().
СИНТАКСИС:
char *mysql_get_client_info(void);
ОПИСАНИЕ:
Эта функция просто возвращает строку с информацией о версии используемой в настоящее время клиентской библиотеки. Иногда полезно.
СИНТАКСИС:
char *mysql_get_host_info(MYSQL *mysql);
ОПИСАНИЕ:
Возвращает имя сервера (заданное в аргументе "host" при вызове mysql_connect).
СИНТАКСИС:
int mysql_get_proto_info(MYSQL *mysql);
ОПИСАНИЕ:
Получает версию протокола, используемую подключением. MySQL поддерживает динамические протоколы, основанные на возможностях клиента. В версии 3.20.X это не делает ничего, но в будущих версиях, эта возможность позволит, например, одному пользователю подключать использование текущего протокола, в то время как другой использует шифрование и сжатие.
СИНТАКСИС:
char *mysql_get_server_info(MYSQL *mysql);
ОПИСАНИЕ:
Возвращает версию сервера.
СИНТАКСИС:
ОПИСАНИЕ:
СИНТАКСИС:
MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild);
ОПИСАНИЕ:
Предоставляет простой способ переноса mSQL прикладных программ. Подобно выполнению 'SHOW databases [ LIKE wild-card ]', как запроса.
СИНТАКСИС:
MYSQL_RES *mysql_list_fields(MYSQL *mysql, const char *table, const char *wild);
ОПИСАНИЕ:
Предоставляет простой способ переноса mSQL прикладных программ. Подобно выполнению 'SHOW fields [FROM table] [FROM database] [LIKE wild-card]', как запроса.
СИНТАКСИС:
MYSQL_RES *mysql_list_processes(MYSQL *mysql);
ОПИСАНИЕ:
Получает список потоков, в настоящее время запущенных на сервере MySQL. Вы должны иметь привилегии process.
СИНТАКСИС:
MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild);
ОПИСАНИЕ:
Предоставляет простой способ переноса mSQL прикладных программ.
Вызывает как запрос 'SHOW tables [FROM database]'.
СИНТАКСИС:
int mysql_num_fields(MYSQL_RES *result);
ОПИСАНИЕ:
Возвращает количество столбцов (полей) в результате запроса.
ПРИМЕР:
MYSQL mysql; MYSQL_RES *result; int fields; if (mysql_query(&mysql, "SELECT * FROM emp_master") == 0) { result = mysql_store_result( &mysql ); if (result != NULL ) { fields = mysql_num_fields( result ); printf( "Retrieved %u fields\n", fields ); } else printf( "Query failed\n" ); } else abort(); |
См. также:
mysql_list_dbs, mysql_list_fields, mysql_list_processes, mysql_list_tables, mysql_store_result, mysql_use_result
СИНТАКСИС:
int mysql_num_rows(MYSQL_RES *result);
ОПИСАНИЕ:
Возвращает количество строк, возвращенных последним вызовом mysql_list_dbs, mysql_list_fields, mysql_list_processes, mysql_list_tables или mysql_store_result.
ПРИМЕР:
MYSQL mysql; MYSQL_RES *result; int rows; if (mysql_query(&mysql, "SELECT * FROM emp_master") == 0) { result = mysql_store_result(&mysql ); if (result != NULL) { rows = mysql_num_rows(result); printf("Retrieved %u rows\n", rows); } else printf("Query failed\n"); } else abort(); |
См. также:
mysql_list_dbs, mysql_list_fields, mysql_list_processes, mysql_list_tables, mysql_store_result, mysql_use_result
СИНТАКСИС:
int mysql_query(MYSQL *mysql, const char *query);
ОПИСАНИЕ:
Выполняет SQL запрос указанный query к базе данных, указанной в mysql. Эта функция возвращает 0, если запрос выполнен успешно. Результат, отличный от нуля, указывает на ошибку. Обращение к mysql_error выведет текстовое сообщение об ошибке.
Вызов mysql_num_rows даст Вам число строк, возвращенных запросом.
Если Вы имеете поле AUTO_INCREMENT в модифицируемой таблице, и выполняете оператор INSERT, Вы можете получить последнее назначенное значение поля, проверяя mysql_insert_id.
СИНТАКСИС:
int mysql_real_query(MYSQL *mysql, const char *query, uint length);
ОПИСАНИЕ:
Эта функция вызывается mysql_query после того, как она выполнила обращение к функции strlen чтобы вычислить длину строки запроса. Это можно использовать, если Ваша программа распределяет фиксированный буфер для строки запроса.
Вы будете должны использовать эту функцию, если Вы имеете данные, в которые значение \0 входит не как последнее.
СИНТАКСИС:
int mysql_reload(MYSQL *mysql);
ОПИСАНИЕ:
Перезагружают таблицу доступа пользователей, очищает все кэши и закрывает все открытые неиспользуемые таблицы. Должна быть вызвана перед запуском isamchk на любой таблице. Требует, чтобы пользователь имел право на перезагрузку (reload).
СИНТАКСИС:
int mysql_select_db(MYSQL *mysql, const char *db);
ОПИСАНИЕ:
Пытается соединиться с базой данных, указанной в db, на сервере, указанном в mysql. Сервер СУБД MySQL использует логин и пароль, содержащиеся в mysql, чтобы опознать подключение. Перед использованием mysql_select_db необходимо успешно вызвать mysql_connect.
mysql_select_db должен быть вызван успешно перед попыткой сделать запрос к базе данных. Исключительные ситуации - запросы типа:
SHOW DATABASES like 'A%';
SELECT 1+1; # SELECT без использования таблиц(ы).
СИНТАКСИС:
int mysql_shutdown(MYSQL *mysql);
ОПИСАНИЕ:
Останавливает сервер СУБД MySQL. Пользователь должен иметь право shutdown.
СИНТАКСИС:
char *mysql_stat(MYSQL *mysql);
ОПИСАНИЕ:
Возвращает информацию, которую выдает команда 'mysqladmin version' в виде строки символов. Эквивалентно опции stat программы mysqladmin. В строку включается информация о простое в секундах, запущенных потоках, запросах, перезагрузках и открытых таблицах.
СИНТАКСИС:
MYSQL_RES *mysql_store_result(MYSQL *mysql);
ОПИСАНИЕ:
Передает результат клиенту. Вы должны использовать эту функцию или mysql_use_result() чтобы получить результат с сервера. Вы обязательно должны использовать mysql_store_result() или mysql_use_result() после того, как выполнили успешный запрос.
mysql_store_result() вернет NULL при ошибке или если инструкция не вернула никаких данных. Вы можете обрабатывать ошибки так:
if (!(result=mysql_store_result(&mysql)) && mysql_num_fields(&mysql)) fputs(mysql_error(&mysql),stderr); |
Вызов mysql_free_result() должен быть выполнен, чтобы освободить память.
СИНТАКСИС:
MYSQL_RES *mysql_use_result(MYSQL *mysql);
ОПИСАНИЕ:
То же, что и mysql_store_result(), за исключением того, что результат выдается сервером динамически для каждого вызова mysql_fetch_row(). Эта функция не должна использоваться в интерактивных прикладных программах, так как она связывает сервер. Зато она помогает уменьшить использование памяти на стороне клиента.
В заключение хочется попросить Вас, если Вам понравилась эта страничка или пригодилась изложенная здесь информация, послать благодарность автору. Это поможет мне вести статистику того, скольким людям пригодилось хоть что-то из моих трудов.
Есть два способа обращения из программы на perl к базе данных MySQL. Дело в том, что два разных человека написали в общем-то одинаково хорошие, хотя и разные библиотеки для такого доступа. Решено включить в поставку оба варианта perl API.
Наличие perl API дает огромные возможности по доступу к базам данных MySQL из скриптов на этом языке. Учитывая, что perl очень часто используется в интернете (для написания CGI-скриптов), этот интерфейс позволяет создавать web-ориентированные базы данных.
Этот интерфейс представляет собой первый способ обратиться к базе данных MySQL из программы на perl.
Коротко о главном:
use Mysql; $dbh = Mysql->Connect; $dbh = Mysql->Connect($host); $dbh = Mysql->Connect($host,$database); $dbh = Mysql->Connect($host,$database,$password); $dbh = Mysql->Connect($host,$database,$password,$user); $dbh->SelectDB($database); $sth = $dbh->ListFields($table); @arr = @{$sth->name}; @arr = @{$sth->length}; $value = $sth->numfields; @arr = @{$sth->type}; @arr = @{$sth->is_num}; @arr = @{$sth->is_blob}; @arr = @{$sth->is_not_null}; $sth = $dbh->Query($sql_statement); @arr = $dbh->ListDBs; @arr = $dbh->ListTables; @arr = $sth->FetchRow; %hash = FetchHash $sth; $sth->DataSeek($row_number); $scalar = $dbh->sock; $scalar = $dbh->host; $scalar = $dbh->database; $scalar = $dbh->quote($binary_string);
Ну что, всем все ясно? Кому еще не ясно, объясняю.
При разработке этого пакета, его старались сделать как можно более похожим на C API.
Вы будете иметь дело с двумя классами: Mysql::Statement работаете с ним через операторный дескриптор, возвращенный командами Query или ListFields. Единственный класс, который Вы называете явно - Mysql. Это предоставляет Вам команду Connect.
Из-за ограничений perl по обработке числовых значений, Вы будете иметь проблемы при использовании чисел больше чем signed LONG (2147483647). Это может происходить при использовании в MySQL типов данных unsigned LONG (DOUBLE) или LONGLONG (BIGINT). Perl хранит возвращаемые значения как строки, но автоматически преобразуют их в числа, когда Вы используете значения в числовом контексте. Это их усечет до 2147483647, так как perl использует тип signed LONG, чтобы хранить такие числа.
Вы можете использовать один способ это обойти. Прежде всего всегда обрабатывайте значения, которые могут быть ОЧЕНЬ большими, как строки, а не как числа. Пока Вы делаете это, они могут отображаться и заново вставляться в базу данных без инцидентов. То же самое можно посоветовать для вставки новых значений в таблицы. Если Вы устанавливаете переменную, названную $tmpvar, равную "4147483647" и затем выполняете INSERT, чтобы вставить ее в базу данных, все будет нормально. Обратите внимание, что кавычки здесь очень важны, так как они заставляют perl обрабатывать значение как строку.
Если Вы должны делать вычисления, включающие большие числа, то их нужно выполнять через начальный SELECT.
Эта команда устанавливает соединение с сервером и базой данных. Без аргумента или с пустой строкой в качестве первого аргумента он связывается с устройством UNIX /dev/mysql, который сильно повышает эффективность. Имя базы данных во втором аргументе указывает с какой именно базой данных надо связаться. Возвращается дескриптор базы данных, если команда Connect выполнена успешно. В противном случае возвращаемое значение не определено. Если Вы используете mysqld, скомпилированный с библиотекой потоков MIT, Вы не сможете использовать устройства. В этом случае укажите имя сервера в переменной host. А вообще библиотека потоков MIT такое глюкало...
Можно указать имя пользователя и пароль. Если имя пользователя не указано, используется текущий логин. Если не указан пароль, а пользователь его имеет, связь установить не получится.
Возвращаемый дескриптор нужен для обращения к базе данных. Можно отдать несколько команд Connect переменных ($dbh1,$dbh2, $dbh3, ...)
Из полученного дескриптора можно извлечь сведения о имени сервера, порте и имени базы данных:
$scalar = $dbh->sock;
$scalar = $dbh->host;
$scalar = $dbh->database;
Имя базы данных не определено, если при вызове команды Connect было указано только имя сервера.
$ENV{"MYSQL_TCP_PORT"}=3334;
$ENV{"MYSQL_UNIX_PORT"}="/tmp/mysql_new.sock";
use Mysql;
$dbh = Mysql->Connect($host);
Выбор базы данных для использования.
СИНТАКСИС:
$dbh->SelectDB($database);
ОПИСАНИЕ:
Если база данных не выбрана в команде Connect, или если нужно связаться с другой базой данных, то используется дескриптор базы данных из предыдущего вызова команды Connect. Он используется командой SelectDB.
Список полей в таблице.
СИНТАКСИС:
$sth = ListFields $dbh $table;
ОПИСАНИЕ:
ListFields возвращает операторный дескриптор, который может использоваться, чтобы выяснить, что именно сервер должен Вам передать. В случае ошибки возвращаемое значение не определено.
MySQL ListFields не работает так же как mSQL ListFields. В MySQL Вы используете следующие команды, чтобы получить информацию после вызова ListFields.
Перед использованием следующих функций, Вы должны выполнить успешное обращение к ListFields.
@arr = @{$sth->name}; | Возвращает массив имен столбцов |
@arr = @{$sth->length}; | Возвращает массив длин столбцов |
$value = $sth->numfields; | Возвращает количество столбцов в таблице |
@arr = @{$sth->type}; | Массив MySQL типов |
@arr = @{$sth->is_num}; | Массив 0 и 1, где 1 указывает что столбец числовой |
@arr = @{$sth->is_blob}; | Массив 0 и 1, где 1 указывает что столбец - blob |
@arr = @{$sth->is_not_null}; | Массив 0 и 1, где 1 указывает что столбец - не NULL |
Выполнить запрос.
СИНТАКСИС:
ОПИСАНИЕ:
Эта функция позволяет Вам посылать запрос базе данных. Вы должны использовать FetchRow, чтобы получить результат.
ПРИМЕР:
$sth = $dbh->Query("SELECT * FROM Widget_Table WHERE widget_id = 1") or die $Mysql::db_errstr; $foo = $record[0]; $bar = $record[1]; }
Хорошая идея - всегда проверить ошибки. В этом примере такой проверкой занимается блок "or die..." оператора Query.
Список доступных баз данных.
СИНТАКСИС:
ОПИСАНИЕ:
ListDBs возвращает массив, который содержит один элемент для имени каждой базы данных, управляемой MySQL.
ПРИМЕР:
@dbs = $dbh->ListDBs; # Возвращает массив имен баз данных. $count = $#dbs; # Вычисляет сколько элементов. for ($i=0;$i<=$count;$i++) { print(" ".$dbs[$i]."\n"); }
Список таблиц, доступных в базе данных.
СИНТАКСИС:
@arr = $dbh->ListTables;
ОПИСАНИЕ:
Возвращает массив с одним элементом для каждого имени таблицы в базе данных. Вы должны были, определить базу данных при вызове Connect или SelectDB.
ПРИМЕР:
@tables = $dbh->ListTables; # Assumes that $dbh points # to a valid database $count = $#tables; # Figure out how many elements. for ($i=0;$i<=$count;$i++) { # Print out the table names. print(" ".$tables[$i]."\n"); }
Возвращает массив, содержащий один столбец, состоящий из значений.
СИНТАКСИС:
@arr = $sth->FetchCol($col);
ОПИСАНИЕ:
Возвращает массив значений для столбца номер $col. FetchRow возвращает следующую строку результата запроса. FetchCol возвращает весь одиночный столбец результата запроса.
Обратите внимание, что эта функция сбросит текущий указатель строки на конец таблицы; вы должны использовать DataSeek(0), чтобы переустановить его.
Возвращает результат запроса.
СИНТАКСИС:
ОПИСАНИЕ:
Возвращает ассоциативный массив, содержащий следующую строку, полученную с сервера.
Возвращает строку результатов.
СИНТАКСИС:
@arr = $sth->FetchRow;
ОПИСАНИЕ:
Возвращает массив значений следующей строки, полученной с сервера.
Позиционируется на произвольную позицию в данных.
СИНТАКСИС:
DataSeek $sth $row_number;
ОПИСАНИЕ:
Дает возможность Вам определить смещение в данных, связанное с операторным дескриптором. Следующий вызов FetchRow возвратит соответствующую строку (первая строка имеет смещение = 0).
Некоторых символов нужно избежать прежде, чем двоичные строки могут быть вставлены в базу данных MySQL. MySQL perl API обеспечивает следующую функцию, чтобы делать это автоматически.
СИНТАКСИС:
$scaler = $dbh->quote($binary_string)
ОПИСАНИЕ:
Конвертирует строку: пропускает все символы ' и \, а также конвертирует \0 и \n.
Всякий раз, когда обработчик, который обеспечивает доступ к базе данных, обрабатывает потерянное значение, Mysql выбирает соответствующее действие (освобождает результат или закрывает подключение к базе данных). Так, если Вы хотите освободить результат или закрыть подключение, Вы можете делать одно из следующих действий:
Теперь пересмотрим вышеупомянутые методы в отношении метаданных.
Как упомянуто выше, Вы получаете дескриптор базы данных с помощью:
$dbh = Connect Mysql $host, $database;
Дескриптор базы данных хранит сведения о хост-имени сервера, его порте и имени базы данных, с которой установлена связь. Эти три значения можно получить так:
$scalar = $dbh->sock;
$scalar = $dbh->host;
$scalar = $dbh->database;
База данных не определена, если связь установлена без аргументов или только с одним аргументом.
Два конструктора возвращают операторный дескриптор:
$sth = ListFields $dbh $table;
$sth = Query $dbh $sql_statement;
$sth хранит все метаданные, предоставляемые API:
$scalar = $sth->affected_rows; | Сколько записей вставлено или изменено. |
$scalar = $sth->info; | Статистика о предыдущих запросах ALTER TABLE или LOAD DATA FROM INFILE. |
$arrref = $sth->is_blob; | Массив битов, специфицирующих является ли данное поле BLOB. |
$arrref = $sth->is_not_null; | Массив битов, специфицирующих является ли данное поле NULL. |
$arrref = $sth->is_pri_key; | Массив битов, специфицирующих является ли данное поле первичным ключом. |
$arrref = $sth->is_num; | Массив битов, специфицирующих является ли данное поле числом. |
$scalar = $sth->insert_id; | Значение, присвоенное столбцу с помощью AUTO_INCREMENT последним INSERT. |
$arrref = $sth->length; | Массив длин всех полей в байтах. |
$arrref = $sth->name; | Имена всех столбцов. |
$scalar = $sth->numrows; | Количество возвращаемых записей. |
$scalar = $sth->numfields; | Количество возвращаемых полей. |
$arrref = $sth->table; | Имена каждого столбца в таблице. |
$arrref = $sth->type; | Тип каждого столбца, определен в mysql.h. Доступен с помощью &Mysql::CHAR_TYPE, &Mysql::INT_TYPE, &Mysql::REAL_TYPE |
Опция -w может быть очень полезной в случае проблем с отладкой. Если Вы вызываете программу на perl с опцией -w, то предупреждения, обычно хранимые в $Mysql::db_errstr будут выводиться в STDERR (стандартный поток ошибок). Таким образом, Вы получите сообщения об ошибках сервера MySQL без обработки их в Вашей программе.
Если надо использовать опцию -w, но не надо, чтобы сообщения об ошибках увидел демон MySQL, можно установить переменную $Mysql::QUIET в любое ненулевое значение.
MySQL использует библиотеку libmysql.a, написанную Михаэлем Видениусом (Michael Widenius). Эта библиотека обязательно должна быть установлена до использования этого интерфейса с perl.
Этот драйвер представляет собой второй способ обратиться к базе данных MySQL из программы на perl.
В настоящее время эта часть описания интерфейса с perl только немного переработана, относительно версии стандартной pod-документации. Данная часть описания изготовлена с помощью команды pod2html -mke.
Обзор:
use DBI; $dbh = DBI->connect( $host, $database, $user, 'mysql' [, $password] ); # or $dbh = DBI->connect('', '', '', 'mysql', {hostname => "localhost", port => 3333, database => "test", username => "myname", password => "mypassword",}); |
ПРИМЕР:
#!/usr/bin/perl use DBI; $drh = DBI->install_driver('mysql'); $dbh = $drh->connect('','test','','') or die "Error connecting to database"; $dbh->do("DROP TABLE foo"); $dbh->do("CREATE TABLE foo ( Field_1 VARCHAR(60) )"); $count = 1; while ($count < 500) { $sth = $dbh->prepare("INSERT INTO foo VALUES('XXXYYYZZZ')"); $sth->execute; $sth->finish; # Очень важно вызвать finish, иначе не освободится память. print "$count\n" unless $count % 10; $count = $count + 1; } |
DBD::mysql является драйвером для работы с базой данных, управляемой СУБД MySQL. Он портирован Michael 'Monty' Widenius of Alligator Descartes' DBD::msql. Вы должны установить DBI-модуль перед использованием DBD::mysql.
$host может быть просто именем сервера (``up.botik.ru'') или именем сервера с указанием порта (``up.botik.ru:3333'').
$database задает имя базы данных с которой надо связаться.
$user задает имя пользователя для доступа к базе данных. (если не указано, используется идентификатор пользователя текущего процесса).
$password является опциональным и нужно только для аккаунтов, которые имеют не пустые пароли.
Системные переменные, которые использует DBD::mysql:
Значения в системных переменных отменяют значения, переданные раньше. TCP номер порта, отменяет TCP номер порта, переданный в hostname.
Можно разрешить отладку, установив переменную MYSQL_DEBUG 'd:t:O,filename' (где filename является именем файла для записи протокола). Протокол будет записан в файл только если libmysql откомпилирована с поддержкой отладки (опция DBUG).
Поддерживаются следующие тэги:
Для получения значения поля AUTO_INCREMENT INSERT, надо:
$id = $dbh->func("_InsertID");
Ограничения на работу с ОЧЕНЬ БОЛЬШИМИ числами специфичны для языка perl вообще, а не для какого-либо API в частности. Так что все, что об этом сказано выше, справедливо и в данном случае.
В случае вставки двоичных данных в базу данных Вы должны обойти некоторые символы. Вы можете использовать следующий метод:
$mystring = $dbh->quote($rawstring);
Msqlperl разработан (C)1997 Alligator Descartes. Модифицирован Msqlperl by Michael 'Monty' Widenius. Все изменения доступны на условиях public domain. Pod-документация, на которой основана данная глава, и _InsertID
В заключение хочется попросить Вас, если Вам понравилась эта страничка или пригодилась изложенная здесь информация, послать благодарность автору. Это поможет мне вести статистику того, скольким людям пригодилось хоть что-то из моих трудов.
Студент нанимается на лето подработать в
университете, его спрашивают:
- Языком владеешь?
- Я в совершенстве владею языком!
- Отлично, будешь наклеивать марки на конверты.
СУБД MySQL предоставляет в Ваше распоряжение подмножество языка SQL, соответствующее спецификации ANSI SQL 92.
Основные цели MySQL - быстродействие и ошибкоустойчивость. Добавление транзакций принесет значительное быстродействие и повышение сложности. В настоящее время имеется проект, который должен дать подобные функциональные Это, вероятно, будет выполнено, с помощью введения атомарной модификации нескольких таблиц сразу.
Ядро, на котором сформирован MySQL - набор подпрограмм, которые использовались в высокотребовательном окружении много лет. В то время, как MySQL все еще находится в разработке, это уже предоставляет богатый и полезный функциональный набор.
СИНТАКСИС:
ALTER [IGNORE] TABLE table_name alter_specification [, alter_specification ...]
alter_specification: ADD [COLUMN] create_definition or CHANGE [COLUMN] old_column_name create_definition or ALTER [COLUMN] column_name { SET default | DROP DEFAULT } or DROP [COLUMN] column_name or DROP PRIMARY KEY or DROP INDEX key_name DROP FOREIGN KEY key_name
ОПИСАНИЕ:
Команда ALTER TABLE может быть использована для изменения определения таблицы. ALTER TABLE работает с временно созданной таблицей в которую копирует все данные из текущей таблицы. Когда копия готова, старая таблица удаляется, а новая переименуется в нее. Это выполнено таким способом, что все изменения автоматически переназначаются на новую таблицу.
Пока работает ALTER TABLE, старая таблица доступна для других клиентов. Обновления и запись в таблицу останавливаются и будут выполнены только после того, как новая таблица будет готова. Если IGNORE не определен, то копирование будет прервано и процесс отработан назад в случае наличия любых уникальных ключей, дублированных в новой таблице.
Вы можете использовать функцию C API mysql_info(&MYSQL_RESULT) чтобы узнать, сколько записей скопировано и сколько удалено из-за дублированных ключей.
Для использования команды ALTER TABLE вы должны иметь права доступа select, insert, delete, update, create и drop для этой таблицы.
СИНТАКСИС:
CREATE TABLE table_name (create_definition, ...)
Здесь create_definition имеет следующий формат:
create_definition: column_name type NOT NULL [DEFAULT default_value] [ PRIMARY KEY ] or column_name type [NULL] [ PRIMARY KEY ] or PRIMARY (KEY|INDEX) [key_name] ( column_name,... ) or (KEY|INDEX) [key_name] ( column_name[length],...) or INDEX [key_name] ( column_name[length],...) or UNIQUE (column_name[length],...) or FOREIGN (KEY|INDEX) [key_name] (column_name[length],...) REFERENCES table_name [ON DELETE (RESTRICT | CASCADE | SET NULL) ]
ОПИСАНИЕ:
В MySQL все поля имеют неявное значение по умолчанию, если объявлены, как не пустые (NOT NULL). Если вы не даете значения по умолчанию при использовании не пустого поля, оно будет назначено, исходя из типа поля.
Блок FOREIGN нужен только для совместимости. Ключевое слово REFERENCE тоже не выполняет в данной версии никаких действий.
Команда MySQL CREATE TABLE не поддерживает ключевое слово SQL CHECK.
Для создания таблицы Вы должны иметь права доступа create.
Замечания:
Если Вы желаете начать отсчет не с ноля, просто вставьте желательное стартовое значение в первой записи, которую Вы вставляете в данную таблицу. В настоящее время нет никакого другого способа достичь этого эффекта.
ВНИМАНИЕ:
Если Вы используете AUTO_INCREMENT, Вы можете использовать его только в одном поле таблицы. Обратите внимание также, что это поле должно быть объявлено как первичный ключ, и должно быть числовым.
ПРИМЕР:
INT(5) ZEROFILL; значение 5 превращается в "00005"
Поля должны иметь один из следующих типов данных:
BIGINT [(length)] [UNSIGNED] [ZEROFILL] | 8 байт целое (если компилятор поддерживает такой тип) |
BLOB | Двоичный объект (максимальная длина 65535 байт) |
CHAR(NUM) | Строка фиксированной длины (1 <= NUM <= 255) |
DATE | Сохраняет информацию о дате. Использует формат "YYYY-MM-DD". Может
модифицироваться как строка или число, хотя Вы, вероятно, используете
контекст строки для времени и даты.
MySQL тип DATEпонимает по крайней мере следующие синтаксис.
Диапазон для этого типа данных от 0000-00-00 до 9999-12-31. Так что "проблема 2000" здесь не стоит. В отличие от TIMESTAMP, DATE принимает годы и в виде двух цифр от 0000 до 0099. Это не очень полезно в большинстве случаев. Используйте задание лет четырьмя цифрами в полях типа DATE. Тип DATE имеет длину 4 байта. |
DATETIME | Объединение типов DATE и TIME. Тип DATETIME идентичен типу TIMESTAMP со
следующими исключениями:
Тип DATETIME имеет длину 8 байт. |
DECIMAL (length,dec) | Десятичное число с плавающей запятой. |
DOUBLE [(length,dec)] | Число (4 или 8 байт) двойной точности с максимальной длиной и фиксированном числом десятичных чисел. |
FLOAT [(precision)] | Номер с плавающей запятой. FLOAT(4) и FLOAT одиночная точность. FLOAT(8) обеспечивает двойную точность. |
FLOAT [(length,decimals)] | Число одиночной точности с максимальной длиной и фиксированном числом десятичных чисел (4 байта). |
INT [(length)] [UNSIGNED] [ZEROFILL] | Целое (4 байта). |
INTEGER [(length)] [UNSIGNED] [ZEROFILL] | Целое число 4 байта |
LONGBLOB | Двоичный объект с максимальной длиной 2**32 байт. |
MEDIUMBLOB | Двоичный объект с максимальной длиной 16777216 байт. |
MEDIUMINT [(length)] [UNSIGNED] [ZEROFILL] | Целое (3 байта). |
REAL [(length,dec)] | Идентично DOUBLE (8 байт). |
SMALLINT [(length)] [UNSIGNED] [ZEROFILL] | Целое (2 байта). |
TINYBLOB | Двоичный объект с максимальной длиной 255 байт. |
TINYINT [(length)] [UNSIGNED] [ZEROFILL] | Целое число (1 байт). |
VARCHAR(NUM) | Строка переменной длины (1 <= NUM <= 255) |
TIME | Хранит информацию о времени. Использует формат "HH:MM:SS".
Может использоваться как строка или число. MySQL тип TIME понимает
следующий синтаксис.
|
TIMESTAMP(NUM) | Автоматически изменяется при вставке/обновлении. Имеет формат
YYMMDDHHMMSS или YYYYMMDDHHMMSS. Вы можете модифицировать поле TIMESTAMP
при выполнении INSERT. Это полезно, когда Вы хотите установить
произвольную дату/время для записи. В течение модификаций Вы не должны
определять значение для вашего поля TIMESTAMP, или определять NULL как
значение, для вставки. Иначе вы получите недопустимое значение для этого
поля.
Когда используете mysql с ODBC и Access Вы должны использовать значение 14 для NUM, поскольку это заставляет MySQL всегда использовать в годах четыре цифры. Значение 12 заставит MySQL использовать в году две цифры. Значение по умолчанию - 14. Обратите внимание, что в случае таблиц с несколькими полями TIMESTAMP только первое такое поле будет модифицироваться автоматически. |
Длина поля определяет, сколько всего цифр может иметь число, в то время как поле dec определяет, сколько из этих цифр будет после десятичной точки. Эти значения используются только для форматирования и вычисления максимальной ширины столбца.
MySQL таблица может иметь до 16 ключей, каждый из которых может иметь до 15 полей. Максимальная поддерживаемая длина ключа 120 байт. Вы можете увеличить длину ключа, изменяя N_MAX_KEY_LENGTH в файле nisam.h и перекомпилировав пакет. Обратите внимание, что длинные ключи могут привести к низкой эффективности.
Ключи могут иметь имена. В случае первичного ключа имя будет всегда PRIMARY. Если имя ключа не задано в процессе создания таблицы, то заданное по умолчанию имя ключа - первое имя столбца с факультативным суффиксом (_2, _3, и т. д.) чтобы сделать это имя уникальным. Имя ключа может использоваться с командой ALTER TABLE, чтобы удалить ключ.
При создании ключа Вы можете факультативно определить, что только первые N символов поля будут использоваться. Например, если Вы хотите создавать уникальный ключ на поле, в котором только первые 40 символов уникальны, можно сделать следующее.
CREATE TABLE SomeTable (composite CHAR(200), INDEX comp_idx(composite(40)));
Хорошая идея - использовать эту опцию на неуникальных полях, поскольку эта мера значительно уменьшит размер вашего индекса, а снижение производительности будет очень не большим.
Вы можете иметь один первичный ключ на таблицу. Если поле определено, как поле первичного ключа, то генерируется индекс. Нет никакой необходимости определять нормальный ключ. Кроме того, при определении дополнительных индексов, которые содержат первичный ключ не будет иметь смысла, поскольку первичный ключ сделает индекс бесполезным.
Ключи с несколькими полями следует использовать для оптимизации узкоспецифических запросов. То есть, все поля в предложении WHERE запроса должны появляться в многопольном ключе.
Поскольку MySQL использует B-Tree не нужно объявлять ключи, которые являются префиксами других ключей. Оптимизатор найдет любой пригодный для использования префикс ключа и использует его, чтобы выполнить поиск. Например, если Вы объявляете следующий ключ:
INDEX (first, second, third, fourth)
Вы также неявно создали следующие ключи:
(first, second, third)
(first, second)
(first)
Объявление ненужных ключей только займет дополнительное место и замедлит ваши запросы. Ключи должны быть созданы во время создания таблицы или изменения таблицы с использованием команды ALTER TABLE.
BLOB - "Binary Large OBject" - двоичный большой объект.
Как отмечено выше, MySQL поддерживает четыре типа BLOB:
tinyblob (0-255 байт) blob (0-65535 байт) mediumblob (0-16777216 байт) longblob (0-2147483648 байт)
Обратите внимание, что могут иметься некоторые ограничения из-за размера буфера сообщения. Буфер сообщений выделяется динамически. Вы должны знать, что 'max_allowed_packet' устанавливается на сервере и клиенте. По умолчанию, это - 64КБ для сервера и 512КБ для клиента.
Вы можете сменить размер буфера, запустив mysqld с опцией -O. Но помните, что это количество памяти будет выделяться каждому потоку!
ПРИМЕР:
mysqld -O max_allowed_packet=max_blob_length
MySQL WIN95 ODBC драйвер определяет BLOB как LONGVARCHAR.
Если Вы вставляете двоичные данные в BLOB, Вы не должны применять следующие символов:
\0
\\
'
или "
СИНТАКСИС:
ОПИСАНИЕ:
В MySQL эта команда проверит был ли данный индекс создан, когда создавалась таблица. Она не создает индекс. Это предусмотрено по причинам совместимости. Если Вы хотите добавить, ключ используйте команду ALTER TABLE.
СИНТАКСИС:
Здесь where_definition имеет формат:
where_definition: where_expr or where_expr [AND | OR] where_exprwhere_expr имеет формат:
where_expr: column_name [> | >= | = | <> | <= | < ] column_name_or_constant or column_name LIKE column_name_or_constant or column_name IS NULL or column_name IS NOT NULL or (where_definition)
ОПИСАНИЕ:
Удаляет записи из таблицы.
Замечания:
Вы должны иметь права доступа delete для удаления записей.
СИНТАКСИС:
(DESCRIBE | DESC) table [column]
ОПИСАНИЕ:
Описывает таблицу или столбец. Эта команда подобна команде SHOW. Факультативный параметр [column] может быть именем столбца или строкой. Если [column] - строка, он может содержать символы подстановки.
СИНТАКСИС:
DROP TABLE table_name [table_name ...]
ОПИСАНИЕ:
Удаляет (в оригинальной документации почему-то сказано, что роняет) одну или несколько таблиц.
Если Вы хотите только удалить все данные в таблице и сохранить ее структуру для будущего повторного заполнения, Вы можете использовать команду DELETE.
ОСТЕРЕГАЙТЕСЬ! DROP TABLE полностью удалит именованную таблицу(ы) из вашей системы. Не предусмотрено никакого UNDO или UNERASE (если Вы не имеете резервной копии, конечно).
Вы должны иметь права доступа delete, чтобы использовать DROP.
СИНТАКСИС:
DROP INDEX index_name
ОПИСАНИЕ:
Эта команда ничего не делает. Чтобы удалить индекс, Вы должны использовать команду ALTER TABLE.
DROP INDEX предусмотрен по причине совместимости. Это вводит в заблуждение некоторые клиенты, которые думают, что получили то, что они просили. Прежде всего это касается тупых ODBC драйверов.
СИНТАКСИС:
GRANT (ALL PRIVILEGES | (SELECT, INSERT, UPDATE, DELETE, REFERENCES (column list), USAGE)) ON table TO user,... [WITH GRANT OPTION]
ОПИСАНИЕ:
Команда GRANT ничего не делает. Она всегда возвращает истину и нужна прежде всего, чтобы ввести в заблуждение некоторые прикладные программы, которые используют ODBC и думают, что команда GRANT, которую они выдали, что-то сделала. Вообще, ODBC такая библиотека, что для совместимости с ней предусмотрена не одна функция... См. главу Администрирование пакета для получения подробностей по поводу прав доступа в MySQL.
СИНТАКСИС:
SELECT [STRAIGHT_JOIN] [DISTINCT | ALL] select_expression,... [FROM tables... [WHERE where_definition] [GROUP BY column,...] [ORDER BY column [ASC | DESC], ...] HAVING full_where_definition [LIMIT [offset,] rows] [PROCEDURE procedure_name]] [INTO OUTFILE 'file_name'... ]
Здесь where_definition:
where_definition: where_expr or where_expr [AND | OR] where_exprwhere_expr имеет формат:
where_expr: column_name [> | >= | = | <> | <= | <] column_name_or_constant or column_name LIKE column_name_or_constant or column_name IS NULL or column_name IS NOT NULL or (where_definition)
ОПИСАНИЕ:
Оператор SELECT является краеугольным камнем всего языка SQL. Он используется, чтобы выполнить запросы к базе данных. Это действительно основа языка SQL. Для хорошего общего учебника о том, как работает SELECT, посмотрите http://w3.one.net/~jhoffman/sqltut.htm#Basics of the SELECT Statement.
В MySQL версии меньше 3.21.x предложение WHERE очень ограничено. HAVING будет работать там, где предложение WHERE ничего не делает. Некоторые примеры, которые не работают в предложении WHERE - REGEXP и операторе !. В основном, Вы не можете использовать функции с WHERE, но Вы можете использовать функции с HAVING.
HAVING по существу, WHERE применительно к результатам. Он используется главным образом для узкой области данных, возвращенных запросом.
Вы должны иметь права select для использования SELECT.
select_expression может содержать следующие функции и операторы:
+ - * / | Арифметические действия. |
% | Остаток от деления (как в C) |
| & | Битовые функции (используется 48 бит). |
- | Смена знака числа. |
( ) | Скобки. |
BETWEEN(A,B,C) | (A >= B) AND (A <= C). |
BIT_COUNT() | Количество бит. |
ELT(N,a,b,c,d) | Возвращает a, если N == 1, b, если N == 2 и т. д. a,b,c,d строки.
ПРИМЕР: ELT(3,"First","Second","Third","Fourth") |
FIELD(Z,a,b,c) | Возвращает a, если Z == a, b, если Z == b и т. д. a,b,c,d строки.
ПРИМЕР: FIELD("Second","First","Second","Third","Fourth") |
IF(A,B,C) | Если A истина (!= 0 and != NULL), то вернет B, иначе вернет C. |
IFNULL(A,B) | Если A не null, вернет A, иначе вернет B. |
ISNULL(A) | Вернет 1, если A == NULL, иначе вернет 0. Эквивалент ('A == NULL'). |
NOT ! | NOT, вернет TRUE (1) или FALSE (0). |
OR, AND | Вернет TRUE (1) или FALSE (0). |
SIGN() | Вернет -1, 0 или 1 (знак аргумента). |
SUM() | Сумма столбца. |
= <> <= < >= > | Вернет TRUE (1) или FALSE (0). |
expr LIKE expr | Вернет TRUE (1) или FALSE (0). |
expr NOT LIKE expr | Вернет TRUE (1) или FALSE (0). |
expr REGEXP expr | Проверяет строку на соответствие регулярному выражению expr. |
expr NOT REGEXP expr | Проверяет строку на соответствие регулярному выражению expr. |
select_expression может также содержать один или большее количество следующих математических функций.
ABS() | Абсолютное значение (модуль числа). |
CEILING() | () |
EXP() | Экспонента. |
FORMAT(nr,NUM) | Форматирует число в формат '#,###,###.##' с NUM десятичных цифр. |
LOG() | Логарифм. |
LOG10() | Логарифм по основанию 10. |
MIN(),MAX() | Минимум или максимум соответственно. Должна иметь при вызове два или более аргументов, иначе рассматривается как групповая функция. |
MOD() | Остаток от деления (аналог %). |
POW() | Степень. |
ROUND() | Округление до ближайшего целого числа. |
RAND([integer_expr]) | Случайное число типа float, 0 <= x <= 1.0, используется integer_expr как значение для запуска генератора. |
SQRT() | Квадратный корень. |
select_expression может также содержать одну или больше следующих строковых функций.
CONCAT() | Объединение строк. |
INTERVAL(A,a,b,c,d) | Возвращает 1, если A == a, 2, если A == b... Если совпадений нет, вернет 0. A,a,b,c,d... строки. |
INSERT(org,strt,len,new) | Заменяет подстроку org[strt...len(gth)] на new. Первая позиция строки=1. |
LCASE(A) | Приводит A к нижнему регистру. |
LEFT() | Возвращает строку символов, отсчитывая слева. |
LENGTH() | Длина строки. |
LOCATE(A,B) | Позиция подстроки B в строке A. |
LOCATE(A,B,C) | Позиция подстроки B в строке A, начиная с позиции C. |
LTRIM(str) | Удаляет все начальные пробелы из строки str. |
REPLACE(A,B,C) | Заменяет все подстроки B в строке A на подстроку C. |
RIGHT() | Get string counting from right. |
RTRIM(str) | Удаляет хвостовые пробелы из строки str. |
STRCMP() | Возвращает 0, если строки одинаковые. |
SUBSTRING(A,B,C) | Возвращает подстроку из A, с позиции B до позиции C. |
UCASE(A) | Переводит A в верхний регистр. |
И наконец несколько просто полезных функций, которые тоже можно применить в select_expression.
CURDATE() | Текущая дата. |
DATABASE() | Имя текущей базы данных из которой выполняется выбор. |
FROM_DAYS() | Меняет день на DATE. |
NOW() | Текущее время в форматах YYYYMMDDHHMMSS или "YYYY-MM-DD HH:MM:SS". Формат зависит от того в каком контексте используется NOW(): числовом или строковом. |
PASSWORD() | Шифрует строку. |
PERIOD_ADD(P:N) | Добавить N месяцев к периоду P (в формате YYMM). |
PERIOD_DIFF(A,B) | Возвращает месяцы между A и B. Обратите внимание, что PERIOD_DIFF работает только с датами в форме YYMM или YYYMM. |
TO_DAYS() | Меняет DATE (YYMMDD) на номер дня. |
UNIX_TIMESTAMP([date]) | Возвращает метку времени unix, если вызвана без date (секунды,
начиная с GMT 1970.01.01 00:00:00). При вызове со столбцом TIMESTAMP
вернет TIMESTAMP.
date может быть также строкой DATE, DATETIME или числом в формате YYMMDD (или YYYMMDD). |
USER() | Возвращает логин текущего пользователя. |
WEEKDAY() | Возвращает день недели (0 = понедельник, 1 = вторник, ...). |
Следующие функции могут быть использованы в предложении GROUP:
AVG() | Среднее для группы GROUP. |
SUM() | Сумма элементов GROUP. |
COUNT() | Число элементов в GROUP. |
MIN() | Минимальный элемент в GROUP. |
MAX() | Максимальный элемент в GROUP. |
Здесь MIN() и MAX() могут принимать строку или число в качестве аргумента. Эти функции не могут использоваться в выражении, хотя их параметр может быть выражением:
ПРИМЕР: "SUM(value/10)" нормально, но вот "SUM(value)/10" уже нет!
ПРИМЕР:
"a" < "b" ; Сравнение строк "a" < 0 ; Сравнение строк 0 < "a" ; Сравнение чисел a < 5 ; Если поле имеет тип CHAR, то сравниваются строки, ; иначе сравниваются числа.
Замечание: Вы не можете написать:
SELECT user,MAX(salary) FROM users GROUP BY users HAVING
max(salary)>10
Вместо этого, используйте нечто вроде следующего (это хороший пример
использования псевдонимов столбцов):
SELECT user,MAX(salary) AS sum FROM users GROUP BY users HAVING
sum > 10
ПРИМЕР:
SELECT Widget_Table.widget_id, Widget_Table.widget_name, Purchase_Order_Item.widget_id, sum(Purchase_Order_Item.quantity) FROM Widget_Table, Purchase_Order_Item WHERE Widget_Table.widget_id = Purchase_Order_Item.widget_id GROUP BY Widget_Table.widge t_name ORDER BY 4;
Свойство объединения SQL дает способность определить связи между таблицами и отыскивать) информацию, основанную на этих связях.
Связи перечисляются в предложении FROM запроса SELECT. Каждая связь отделяется запятой.
ПРИМЕР:
$ mysql mysql Welcome to the mysql monitor. Commands ends with ; or \g. Type 'help' for help. mysql> SELECT db.user, db.delete_priv, user.user, user.delete_priv -> FROM db,user WHERE db.user = user.user; |
+------+-------------+------+-------------+ | user | delete_priv | user | delete_priv | +------+-------------+------+-------------+ |mke | N | mke | N | +------+-------------+------+-------------+ |
Первые два поля фактические db.user и db.delete_priv , последние два user.user и user.delete_priv.
Обратите внимание, что мы используем имена таблицы в нашем запросе, чтобы определить точно, с какими полями мы работаем.
Вы можете объединить до пятнадцати таблиц в одном объединении.
MySQL не будет использовать ключи, чтобы соединить таблицы посредством полей, которые не имеют идентичный тип. Это означает, что Вы должны всегда использовать те же самые типы для полей, которые предназначены, для использования в объединениях.
Псевдонимы могут также использоваться для имен столбца. См. детали в следующем разделе.
СУБД MySQL поддерживает концепцию псевдонимов для таблиц и полей.
Псевдонимы для таблиц являются стандартной частью языка SQL.
ПРИМЕР:
SELECT A.user,A.select_priv,A.insert_priv,A.update_priv FROM user A
В этом примере использован псевдоним таблицы, чтобы сократить ваш запрос, объявляя псевдоним, который короче имени таблицы. Вы используете псевдоним в первой части выбора, и определяете это в FROM, определяя реальное имя таблицы, пробел и псевдоним. Если Вы имеете больше чем одну таблицу, для которой Вы желаете создать псевдоним, просто добавьте запятую после каждой пары имя/псевдоним таблицы.
Если Вы используете псевдонимы с запросом, который будет иметь предложение WHERE, Вы должны использовать псевдоним в предложении WHERE вместо реального имени таблицы.
Псевдонимы для полей таблицы - специфическое для MySQL расширение.
ПРИМЕР:
SELECT user.user AS "User Name", user.delete_priv AS "Delete"
FROM user;
Одно хорошее дело, которое делают псевдонимы поля - это то, что они
позволяют Вам определять более дружественные метки для вашего вывода.
Результат вышеупомянутого запроса мог бы окончательно выглядеть примерно так:
+-----------+--------+ | User Name | Delete | +-----------+--------+ | root | Y | | mke | N | | dummy | N | | admin | N | +-----------+--------+ |
Хороший совет - брать псевдонимы в кавычки, в данном примере "Delete" вызвало бы ошибку синтаксического анализа при применение без кавычек. (Это потому, что DELETE является ключевым словом SQL.
СИНТАКСИС:
INSERT INTO table [(column_name, ...)] VALUES (expression,...) ||
INSERT INTO table [(column_name, ...)] SELECT ...
ОПИСАНИЕ:
Вставляет данные в таблицу.
@result{Records: 220 Duplicates: 1 Warnings: 1}
ПРИМЕР:
INSERT INTO Customer(customer_name,customer_contact) VALUES("Joes Wholesale","Joe Smith")
Этот запрос создаст новую запись в таблице Customer, которая будет содержать автоматически сгенерированный customer_id, и значения, определенные в запросе. Все другие поля будут пустыми (NULL).
Вы также можете использовать SELECT для копирования элементов из одной таблицы в другую. MySQL поддерживает ограниченную форму запросов sub, для выполнения этой возможности.
Вы должны иметь права доступа insert для использования этой команды.
СИНТАКСИС:
LOAD DATA INFILE syntax
ОПИСАНИЕ:
Команды, для чтения данных из текстового файла.
ПРИМЕР:
LOAD DATA INFILE 'customer.tab' [REPLACE | IGNORE] INTO TABLE Customer [fields [terminated by ',' [optionally] enclosed by '"' escaped by '\\' ]] [lines terminated by '\n'] [(field list)]
Для записи в текстовый файл используйте:
SELECT ... INTO OUTFILE 'customer.tab' fields terminated by ','
enclosed by '"' escaped by '\\' lines terminated by '\n'
.
"fields terminated by" | Имеет значение по умолчанию \t. |
"fields [optionally] enclosed by" | Имеет значение по умолчанию ". |
"fields escaped by" | Имеет значение по умолчанию '\\'. |
"lines terminated by" | Имеет значение по умолчанию '\n'. |
"fields terminated by" и "lines terminated by" могут быть больше, чем 1 символом.
Если "fields terminated by" и "fields enclosed by" являются пустыми строками, то размер строки будет фиксированным. То есть, будет производиться чтение полей одной длины.
С фиксированными значениями NULL для размера строки будут выводиться пустые строки.
Если указаны "optionally" в "enclosed by" и Вы не используете фиксированный размер строк, только строки с этим символом будут включены в команду SELECT ... INTO.
Если "escaped by" не пусто, то следующие символы будут снабжены префиксом: "escaped by", ASCII 0, и первый символ из "fields terminated by", "fields enclosed by" и "lines terminated by".
Если использован REPLACE, новая строка заменит все строки, которые имеют тот же самый уникальный ключ. Если использован IGNORE, строки будут пропущен, если там уже существует запись с идентичным уникальным ключом. Если ни один из вышеупомянутых параметров не используется, будет выдана ошибка, и остальная часть textfile будет игнорироваться, если найден дублирующий ключ.
Некоторые ситуации, которые не поддерживаются LOAD DATA INFILE:
Все строки читаются в таблицу. Если строка имеет слишком мало полей, остальная часть полей в таблице устанавливается в значения по умолчанию.
По соображениям безопасности textfile должен находиться в каталоге баз данных или быть читаемым всеми.
Если "FIELDS ENCLOSED BY" не пустое, то NULL читается как значение NULL. Если "FIELDS ESCAPED" не пустое, то \N тоже читается как значение NULL. Note Обратите внимание, что это БОЛЬШАЯ N, верхний регистр!
Когда запрос LOAD DATA выполнен, Вы можете получить следующую строку информации, используя функцию C API mysql_info().
@result{Records: 1 Deleted: 0 Skiped: 0 Warnings: 0}
Переменная Warnings увеличивается с каждым столбцом, который не может быть сохранен без потери точности, для каждого столбца, который не получал значение из строки текста при чтении (это случается, если строка слишком короткая) и для каждой строки, которая имеет большее количество данных чем может вписываться в данные столбцы.
Вы должны иметь права доступа select и insert таблице user для использования этой команды.
СИНТАКСИС:
SET OPTION SQL_VALUE_OPTON=value, ...
ОПИСАНИЕ:
Меняет или устанавливает опции MySQL. Опции действуют только в пределах текущего сеанса.
MySQL поддерживает следующие опции (в этой версии пока одну):
SQL_SELECT_LIMIT=value | Максимальное число записей, которое возвращает SELECT. Если SELECT имеет параметр LIMIT, то используется значение из этой опции. |
СИНТАКСИС:
UPDATE table SET column=expression,... WHERE where_definition
Здесь where_definition:
where_definition: where_expr or where_expr [AND | OR] where_exprЗдесь where where_expr имеет формат:
where_expr: column_name [> | >= | = | <> | <= | < ] column_name_or_constant or column_name LIKE column_name_or_constant or column_name IS NULL or column_name IS NOT NULL or (where_definition)
ОПИСАНИЕ:
Обновляет одно или несколько полей в таблице MySQL.
ПРИМЕРЫ:
UPDATE Widget_Table SET widgets_on_hand=widgets_on_hand - 300 where widget_id=3;
Этот запрос вычтет 300 из значения widgets_on_hand для widget = 3.
DELETE FROM Purchase_Order_Item WHERE purchase_order = 456
Этот запрос удалит все записи из Purchase_Order_Item, которые имеют значение 456 для purchase_order. Обратите внимание, что вообще Вы НИКОГДА не должны бы удалять данные из этого сорта базы данных. Вы создаете базы данных, чтобы следить за информацией, и даже плохая информация могла бы стать полезной в некотором случае. Гораздо лучше иметь некоторый тип кода состояния, который Вы используете, когда данные стали недопустимыми по каким-либо причинам.
Вы также хотели бы удалять запись в Purchase_Order для purchase_order 456. Важно убедиться, что, когда Вы удаляете информацию, Вы избавляетесь от всех ссылок к этой информации. Иначе Вы закончите с разрушенной базой данных.
Вы должны иметь права доступа update для использования этой команды.
СИНТАКСИС:
SHOW DATABASES [LIKE wild]
SHOW KEYS FROM table_name
SHOW TABLES [FROM database] [LIKE wild]
SHOW [COLUMNS|FIELDS] FROM table [FROM database] [LIKE wild]
ОПИСАНИЕ:
Отображает информацию о базе данных MySQL. "wild" эквивалент регулярному выражению для SQL LIKE.
ПРИМЕР:
$ mysql WidgetDB Welcome to the mysql monitor. Commands ends with ; or \g. Type 'help' for help. mysql> SHOW fields FROM Widget_Table from WidgetDB; 6 rows in set (0.34 sec) +--------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------------+--------------+------+-----+---------+----------------+ | widget_id | mediumint(8) | | PRI | 0 | auto_increment | | widget_name | char(60) | | MUL | | | | widget_color_id | mediumint(8) | | MUL | 0 | | | widget_size_id | mediumint(8) | | | 0 | | | widgets_on_hand | smallint(5) | | | 0 | | | widget_price | float(8,2) | | | 0.00 | | | commission_percent | float(4,2) | | | 0.00 | | +--------------------+--------------+------+-----+---------+----------------+ mysql> |
Первые два поля довольно очевидны. Null будет содержать YES, если это поле может быть равным NULL, Key сообщает имеет ли это поле индекс, Default сообщает Вам значение по умолчанию, которое будет назначено этому полю, если там ничего не окажется после выполнения команды INSERT, Extra указывает другие атрибуты поля, такие как AUTO_INCREMENT, например.
\0 | ASCII 0. Примечание: это - 5C 30, а не 5C 00! |
\n | Новая строка. |
\t | Табуляция. |
\r | Возврат каретки. |
\b | backspace |
\' | ' |
\" | " |
\\ | \ |
\% | % (используется в строках с символами подстановки для поиска '%') |
\_ | _ (используется в строках с символами подстановки для поиска '_') |
Примеры правильных строк:
' в строке записывается как ''.
" в строке записывается как "".
Пример, чтобы прояснить ситуацию:
mysql> select 'hello',"'hello'",'""hello""','''h''e''l''l''o''',"hel""lo"; 1 rows in set (0.01 sec) +-------+---------+-----------+-------------+--------+ | hello | 'hello' | ""hello"" | 'h'e'l'l'o' | hel"lo | +-------+---------+-----------+-------------+--------+ | hello | 'hello' | ""hello"" | 'h'e'l'l'o' | hel"lo | +-------+---------+-----------+-------------+--------+ |
Вы можете использовать только набор символов ISO8859-2 (или набор символов который Вы определили при компиляции начальном выборе конфигурации и компиляции пакета), символ подчеркивания, и 0-9 в именах столбцов.
Дефисы, пробелы и другие специальные символы не могут использоваться, поскольку они сделали бы невозможным использование таблицы или столбца в операторе SELECT.
В заключение хочется попросить Вас, если Вам понравилась эта страничка или пригодилась изложенная здесь информация, послать благодарность автору. Это поможет мне вести статистику того, скольким людям пригодилось хоть что-то из моих трудов.
СУБД MySQL использует специальную базу данных для предоставления прав доступа к своим базам данных. Эти права могут базироваться на именах серверов и/или пользователей и предоставляться для одной или нескольких баз данных
Пользовательские аккаунты могут быть снабжены паролями. При обращении к базе данных, пароль шифруется. Поэтому он не может быть перехвачен и использован посторонним (это мнение автора СУБД...).
СУБД MySQL имеет три таблицы, а именно:
Поле | Тип | Null | Ключ | Умолчание | Extra |
---|---|---|---|---|---|
Хост | char(60) | PRI | |||
Db | char(32) | PRI | |||
Пользователь | char(16) | PRI | |||
Select_priv | char(1) | N | |||
Insert_priv | char(1) | N | |||
Update_priv | char(1) | N | |||
Delete_priv | char(1) | N | |||
Create_priv | char(1) | N | |||
Drop_priv | char(1) | N |
Поле | Тип | Null | Ключ | Умолчание | Extra |
---|---|---|---|---|---|
Хост | char(60) | PRI | |||
Db | char(32) | PRI | |||
Select_priv | char(1) | N | |||
Insert_priv | char(1) | N | |||
Update_priv | char(1) | N | |||
Delete_priv | char(1) | N | |||
Create_priv | char(1) | N | |||
Drop_priv | char(1) | N |
Поле | Тип | Null | Key | Умолчание | Extra |
---|---|---|---|---|---|
Хост | char(60) | PRI | |||
Пользователь | char(16) | PRI | |||
Пароль | char(8) | ||||
Select_priv | char(1) | N | |||
Insert_priv | char(1) | N | |||
Update_priv | char(1) | N | |||
Delete_priv | char(1) | N | |||
Create_priv | char(1) | N | |||
Drop_priv | char(1) | N | |||
Reload_priv | char(1) | N | |||
Shutdown_priv | char(1) | N | |||
Process_priv | char(1) | N | |||
File_priv | char(1) | N |
Пример добавления новых пользователей:
$ mysql mysql
mysql> INSERT INTO user VALUES ('%','monty',password('something'),
-> 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user (host,user,password) values('localhost','dummy','');
mysql> INSERT INTO user VALUES ('%','admin','','N','N','N','N','N','N','Y','N','Y','N');
mysql> quit
$ mysqladmin reload
Добавлено три новых пользователя (юзверя):
monty: | Суперпользователь (администратор), должен использовать пароль, для
работы с mysql.
|
dummy: | Должен быть допущен к индивидуальной базе данных по таблице 'db
'.
|
admin: | Не нуждается в пароле, но разрешено выполнение только команд 'mysqladmin reload' and 'mysqladmin processlist'. Может быть допущен к индивидуальной базе данных через таблицу 'db'. |
ВНИМАНИЕ! Вы ДОЛЖНЫ использовать функцию password()
при создании пользователя, имеющего пароль. СУБД MySQL ожидает получить
зашифрованный пароль.
Атрибуты, установленные в таблице пользователей перекрывают атрибуты, установленные в таблице DB. Если сервер поддерживает много баз данных, лучше создавать пользователей без прав доступа в таблице пользователей и назначать им права доступа к базе данных по таблице db.
Если Вы используете MIT threads package, обратите внимание, что имя localhost не будет работать, так как MIT threads package не поддерживает socket-подключения. Это означает, что Вы должны всегда определять ваш hostname (имя сервера) при подключении, даже если Вы работаете с одним и тем же сервером.
Следует помнить следующие правила при настройке прав доступа:
Пользователь | Сортируется по именам серверов и пользователей. |
db | Сортируется по именам серверов, пользователей и баз данных. |
Сервер | Сортируется по именам серверов и баз данных. |
Начиная с версии 3.20.19 сервера введена еще одна хитрость, для попытки вычислить, как данный пользователь обратится к данной базе данных. Допустим существование пользователя с именем Джо, который зарегистрирован так:
INSERT INTO user VALUES('%.external.domain.com','','','N','N','N',
'N','N','N','N','N','N','N');
Проверка таблицы баз данных будет выполнена для пользователя '' (пустое имя), а не для пользователя Джо, даже если пользователь, Джо имеет запись в таблице доступа к базам данных (db таблице).
Создание пользовательских аккаунтов - вероятно, наиболее путающий аспект СУБД MySQL, (особенно, если никогда не имел с ней дела), так что не удивляйтесь, если потребуется некоторое время, чтобы во всем разобраться и получить парочку несколько неприятных сюрпризов. Использование программы mysqlaccess делает управление доступом несколько более ясным.
Вообще лучше избегать использования регулярных выражений SQL в полях имени сервера. Это упрощает отладку.
Конкретно, установите все поля "имя сервера" в '%' и очистите таблицу серверов. Как только все начнет нормально функционировать, можно начинать эксперименты с добавлением имен серверов в таблицу серверов в случае такой необходимости.
Если получено сообщение об ошибке 'Access denied', то скорее всего вы нормально связались с демоном mysqld, но имеете неправильную информацию в вашей таблице пользователей.
Зашифрованный пароль сохраняется в таблице пользователей ('user ').
Проверьте все пути в скрипте mysql.server. Проверьте и установите safe_mysqld в /etc/init.d/mysql.server и в /etc/rc2.d/S99mysql.server .
В Caldera Open Linux надо добавить в файл /etc/rc.d/rc.local следующее:
/usr/local/bin/safe_mysql &
Конечно, здесь надо задать правильный путь в каталог с MySQL.
Зайдите в систему как пользователь-владелец MySQL и дайте следующую команду (Предполагается, что исполняемый модуль mysql находится в вашем пути. Если это не так, укажите полный путь):
safe_mysql &
Если вы не хотите, чтобы пользователи могли применять опцию -u для входа в mysql под другим логином, можно закомментировать в файле global.h строку:
#define SAFE_USER 1 /* Comment this if you are paranoid */
По умолчанию MySQL автоматически назначит значение по умолчанию полям, которые явно не объявлены. MySQL будет делать это исходя из типа конкретного поля. Если Вы предпочли бы, чтобы поля с необъявленными значениями имели значение NULL, то добавьте в файл global.h строку:
#define DONT_USE_DEFAULT_FIELDS
По умолчанию MySQL рассматривает только 1120 байтов ключа. Вы можете увеличивать это значение, редактируя файл nisam.h и изменяя значение N_MAX_KEY_LENGTH. Обратите внимание, что это может вести к снижению производительности. Нет причины делать это значение меньше, поскольку можно определить ключ, длина которого меньше указанного поля. Более подробно это рассмотрено в разделе "Ключи".
По умолчанию MySQL сортирует строки согласно ISO8859-1 (latin1). Вы можете изменить это во время конфигурации, определяя следующую опцию.
--with-charset=[charset]Где [charset] может быть один из: latin1, latin2, koi8_ru, dec8, dos, hp8, swe7, usa7.
Чтобы узнать о том, как добавлять новые наборы символов, посмотрите каталог строк в исходниках.
Обратите внимание: Если Вы меняете наборы символов уже создав базу данных, Вы будете должны выполнить isamchk с параметрами -e, и -q для всех таблиц, иначе MySQL не будет работать правильно.
Если Вы понимаете C++, и Yacc, то относительно просто добавить функцию к СУБД MySQL. Если не понимаете, то дело хуже.
Сначала добавьте строку в файл sql_lex.cc с именем функции в массив sql_functions.
Затем добавьте две строки в файл sql_yacc.y. Первая определяет символ препроцессора yacc. Вы должны добавить это к началу файла. Затем определите параметры функции, и создайте 'item' с этими параметрами.
В файле item_func.h объявляют класс, который наследуется из Item_num_func или Item_str_func, в зависимости от того, возвращает ли ваша функция число или строку.
В intem_func.cc добавьте:
Для строковой функции вы должны также определить следующую функцию:
Она должна по крайней мере вычислить 'max_length' основанный на полученных параметрах. max_length - максимальное число символов, которое функция может вернуть (максимальная длина возвращаемого значения).
Если функция не может возвращать null, Вы должны также установить 'maybe_null=0'.
Для строковых функций параметр 'String *str', предоставляет буфер для хранения результата. Строковая функция должна вернуть строку, которая хранит результат.
Все строковые функции должны избегать выделения памяти больше, чем им абсолютно необходимо! Системные ресурсы не бесконечны...
Самый быстрый способ загружать данные в MySQL - команда LOAD DATA INFILE. Это в 3-20 раз быстрее, чем использование инструкций INSERT. Для еще большего количества быстродействия Вы можете использовать следующую процедуру, чтобы отключить формирование ключа на вашей таблице, в то время как данные загружаются. Для этого надо находиться в вашем MySQL каталоге баз данных, или обеспечивать полные пути к вашей базе данных.
isamchk -rq -k0 [имя_базы_данных]/[имя_таблицы] | Удаление ключей |
LOAD DATA INFILE ... | Чтение Ваших данных |
isamchk -rq [имя_базы_данных]/[имя_таблицы] | Создание ключей таблицы заново |
mysqladmin reload. | Сообщите, чтобы mysql использовал новую таблицу |
$ mysqld -O
Возможные переменные в опции -O:
Имя | Значение по умолчанию | |
---|---|---|
back_log | Определите размер очереди для входящих tcp/ip подключений. Убедитесь, что установили его побольше, когда Вы ожидаете большое количество подключений в коротком периоде времени. Некоторые ОС могут иметь максимальное значение этой переменной 128 или 256. Подробности об этой очереди можно посмотреть на man-странице listen(2). | |
keybuffer | Размер кэш-буфера, для хранения всех недавно использованных ключей. Большой буфер дает самую лучшую эффективность. С переключателем -Sl распределен только один буфер. | |
max_allowed_packet | Буфер подключений сервера может быть изменен до этого значения, если пользователь дает длинную команду. Начальный буфер = 'net_buffer_length'. На каждое подключение выделяется один буфер. | |
net_buffer_length | Начальный размер буфера подключений. На каждое подключение выделяется один буфер. | |
max_connections | Максимальное число подключений, которые mysqld может иметь открытыми в одно и то же время. | |
table_cache | Максимальное число таблиц сохраняемых открытыми на сервере. Таблицы хранятся открытыми, для ускорения запроса к часто используемым таблицам. Однако, каждая открытая таблица требует много памяти. | |
recordbuffer | Размер кэш-буфера для хранения прочитанных записей. На каждое подключение выделяется один буфер. | |
sortbuffer | Размер буфера, используемого при сортировке. На каждое подключение выделяется один буфер. | |
max_sort_length | Максимальное время для сортировки? |
Если Вы имеете прикладную программу, которая требует большого количества потоков, это является хорошим способом уменьшить значения recordbuffer и sortbuffer примерно до 32K. Вы можете даже уменьшить recordbuffer до 8КБ без особых проблем. Кроме того можно рассматривать уменьшение значения переменной keybuffer до размера в 512КБ. Это сохранит большой объем памяти, и повысит эффективность работы.
После того, как Вы загрузили данные в вашу базу данных, Вы можете выполнить команду 'isamchk -a' над вашими таблицами. Программа isamchk соберет статистику по вашим таблицам, которую сможет использовать оптимизатор. Вообще, надо выполнить isamchk только однажды на таблице. При этом предполагается, что что данные в таблице во время isamchk выполнены в типичном представлении для вашей таблицы.
key = 1 or A = 10 -> NULL (Нельзя использовать ключ) key = 1 or A = 10 and key=2 -> key = 1 OR key = 2 key_part_1 = const and key_part_3 = const -> key_part_1 = const
const_table.key = constant
const_table.key_part_1 = const_table2.field and
const_table.key_part_2 = constant
Есть несколько вещей, которые Вы можете сделать, чтобы минимизировать количество места, которое используют ваши таблицы. Прежде всего используйте НЕ ПУСТОЙ указатель всякий раз, когда возможно. Это ускорит запросы, и сохранит 1 бит на поле.
Вы можете сохранить много места, используя меньшие целочисленные переменные. Например, MEDIUMINT часто вполне достаточен.
Вообще Вы должны выбрать самый маленький тип данных, в котором Вы будете нуждаться, если есть проблемы с памятью.
Имейте в виду, что поля фиксированной длины в mysql обрабатываются значительно быстрее. Избегая полей переменной длины (VARCHAR, BLOBs), можно повысить эффективность на 10-200%.
В настоящее время инструкция INSERT дает ошибку только при вставке пустого указателя (NULL) в не пустой столбец.
При использовании INSERT или команды, которая может воздействовать на много записей, выполняется следующее:
Во время связи клиента с сервером 'warnings information' возвращается только при использовании 'ALTER TABLE' или 'LOAD DATA FROM...'.
111.222.333
111 | Если первая цифра изменяется, это означает, что были сделаны серьезные изменения. Они могут включать поддержку новых форматов файлов, новые протоколы, и т.д. Будьте готовы сделать некоторые модификации ваших прикладных программ перед выполнением после обновления. По крайней мере Вам придется выполнить дамп и перезагрузить Ваши таблицы. |
222 | Значительный новый код/функциональные возможности. Может включать мелочь в поддержке синтаксиса SQL или интерфейса пользователя. Вам не придется делать сильных изменений в Ваших прикладных программах, но тщательно проверьте их перед выполнением. |
333 | Маленькие безопасные изменения, которые не должны разорвать что-нибудь у сисопа на части. Самая большая проблема здесь - добавление ключевых слов SQL, которые находятся в противоречии с существующими именами таблицы. Если Вы избегаете использовать ключевые слова стандарта SQL-92 для ваших имен таблиц (так вообще-то и надо...), все должно быть ХОРОШО. |
Хорошая идея - всегда проверять файл NEWS, когда Вы загружаете новую версию. Это должно дать Вам, представление о том, что именно изменилось, начиная с вашей последней модификации.
На всякий случай приведу подробное описание протокола "клиент-сервер", используемого пакетом MySQL для связи между клиентом и сервером базы данных.
< = клиент > = сервер [] 1 байт [2: ] 2 байта (нижний байт первый) [3: ] 3 байта (нижний байт первый) [4: ] 4 байта (нижний байт первый) [string: ] строка, кончающаяся нулем. [length: ] длина целого числа. Проверьте Net_store_length() для этого! Идея в том, чтобы наиболее часто получать данные длиной в 1 байт, но допускать и более длинные данные (и NULL).
Каждый передаваемый пакет имеет следующий префикс:
[3: длина пакета] [номер пакета] данные
При приеме пакета добавляется [0] после каждого принятого пакета, чтобы получить простую обработку строк ошибки.
Номера пакетов начинаются с 0 и увеличиваются для каждого посланного/полученного пакета.
> [protocol version] [string: password crypt seed]
< [2: 0] [3: max_allowed_client_packet_length] [string: user name]
[string: scrambled password]
> ok packet
Посмотрите в файле password.c из исходников MySQL какой метод используется для шифрования паролей. Пароль должен быть пустым, если пользователь не имеет никакого пароля.
[0] [length: affected_rows] [length: unique id]
Может приходить в любое время.
> [255] [string: error message]
< [command number]
enum enum_server_command{SLEEP,QUIT,INIT_DB,QUERY,FIELD_LIST, CREATE_DB,DROP_DB,RELOAD,SHUTDOWN,STATISTICS, PROCESS_INFO,CONNECT}
< [QUERY command] [string: query string] (The end null is not sent)
> [0] [length: affected rows] [length: insert id] (Insert, delete...)
или:
> [length: column_count] (a query result)
> column field data packets
> row data packets
: Данные передаются пока не придет пакет, который состоит только из одиночного символа [254]. Остерегайтесь: могут иметься пакеты, которые начинаются с символа 254! Каждый пакет типа 'data' имеет поле 'column count'.
Формат каждого поля:
[:length] == NULL_LENGTH -> NULL field
или:
[:length] [length data] (Строка не оканчивается на \0!)
Пакет данных столбца состоит из 5 столбцов со следующими данными:
[:string table name]
[:string column name]
[:3 create length of column (may be larger in a few cases)]
[:1 type (as of enum_field_types)]
[:1 flag] [:1 decimals] (2 байта!)
При использовании команды list_fields имеется шестой столбец:
[:string default]
Посмотрите в файлах libmysql.c, net.c и password.c более подробную информацию о форматах пакетов.
Для получения описания таблицы используйте команду (Вы должны перейти в каталог, который содержит таблицу, информацию о которой Вы желаете получить. Вообще это будет $DATADIR/[dbname], где dbname - имя базы данных, которая содержит таблицу.):
prompt> isamchk -d table_name ISAM file: table_name Data records: 215 Deleted blocks: 0 Recordlength: 85 Record format: Packed table description: Key Start Len Index Type 1 37 14 unique text packed stripped 2 1 30 multip. text packed stripped 3 51 4 multip. long 4 31 2 multip. short 33 2 short 35 2 short |
prompt> isamchk -d -v table_name ISAM file: Customer Isam-version: 2 Creation time: 1996-12-17 21:40:04 Data records: 0 Deleted blocks: 0 Datafile: Parts: 0 Deleted data: 0 Datafilepointer (bytes): 4 Keyfile pointer (bytes): 3 Recordlength: 374 Record format: Packed table description: Key Start Len Index Type Root Blocksize Rec/key 1 2 2 unique short -1 1024 1 2 4 80 multip. text packed stripped -1 1024 1 3 2 2 multip. short -1 1024 1 |
Объяснение полученного результата:
ISAM file | Имя ISAM-файла. |
Isam-version | Версия ISAM формата. Сейчас всегда 2. |
Creation time | Когда файл данных был создан? |
Recover time | Когда в последний раз был восстановлен файл индекса/данных? |
Data records | Сколько записей/строк. |
Deleted blocks | Сколько удаленных блоков все еще занимают место? См. примеры в разделе по isamchk для информации относительно избавления от неиспользуемого места. |
Datafile: Parts | Для динамической записи это показывает, сколько блоков данных в ней. Для оптимизированной таблицы без дырок это будет то же, что и Data records. |
Deleted data | Сколько всего байт занимают удаленные данные. |
Datafilepointer | Сколько байтов занимает указатель файла данных? Это 2, 3 или 4 байта. Большинство таблиц обходится 2 байтами, но это не может управляться из MySQL. Для фиксированных таблиц это адрес записи. Для динамических таблиц это адрес байта. |
Keyfile pointer | Сколько байтов занимает указатель файла данных? Это обычно 1, 2 или 3 байта. Большинство таблиц обходится 2 байтами, но это вычисляется mysql автоматически. Это всегда адрес блока. |
Max datafile length | Сколько байт может использовать для этой таблицы файл данных (.ISD). |
Max keyfile length | Сколько байт может использовать для этой таблицы файл ключей. |
Recordlength | Сколько пробела занимает каждая запись/строка? |
Record format | Какой формат имеет каждая запись/строка? |
table description | Список всех ключей в таблице. Для каждого ключа выводится краткая информация низкого уровня (большее количество информации в следующей таблице). |
Краткая информация низкого уровня для каждого ключа:
Key | Номер ключа. |
Start | Где в записи/строке начинается индексная часть. |
Len | Какой длины индексная часть? Для упакованных чисел это всегда полная длина поля. Для строк она может быть короче полной длины (хотя MySQL все же не поддерживает такой вариант). |
Index | unique или multip. |
Type | Какой тип данных имеет эта индексная часть? Это - C тип данных (опционально packed или short). |
Root | Адрес корня индексного блока. |
Blocksize | Размер каждого индексного блока. По умолчанию 1024, но это может быть изменено во время компиляции. |
Rec/key | Статистическое значение, используемое оптимизатором. Оно
сообщает, сколько записей приходится на этот ключа. Уникальный ключ
всегда имеет значение 1. Это может измениться после того, как таблица
загружена и стабилизирована, используя |
MySQL FAQ имеет обширную информацию по этой теме.
Ниже дается некоторая информацию низкого уровня относительно того, как ключи хранятся и используются в MySQL.
Текущий размер блока для B-tree равен 1024 и и всех блоков (за исключением root) - по крайней мере 2/3 от полного. Для типичного идентификатора (id = 4 байта) это означает 1024/(4+4)*2/3=85 ключей в соответствии с записью, и таким образом можно находить позицию реальной записи в 5 позиционированиях.
Если Вы желаете, чтобы ваши индексы B-tree были 100% полными, выполните isamchk с опцией -rq над вашими файлами таблицы.
Только первая часть ключа может быть префиксно сжата. Если два ключа имеют тот же самый префикс, другая часть ключа будет занимать 1 байт. Все строковые части длиннее 4 символов имеют удаленные хвостовые пробелы.
Если ключ фиксированного размера, то nisam использует двоичный поиск в каждом блоке, иначе используется последовательный поиск.
Все блоки ключей читаются/пишутся через key_buffer (по умолчанию 1M) так что блок root буферизуется всегда.
Чтение следующего оптимизировано, так что библиотека не должна консультироваться с любым другим блоком при чтении из списка блоков. Это дает очень хорошую эффективность, когда Вы должны читать группу записей с тем же самым ключом.
Ниже приводятся планы по дальнейшему развитию и совершенствованию пакета MySQL и его будущих версиях.
Включение блокировки таблицы и сохраненных процедур должно пройти длинный путь к предоставлению людям функциональных возможностей, в которых они нуждаются без серьезного воздействия на эффективность MySQL.
Такие свойства как views, rollback и triggers будут добавлены на каком-то этапе опционально. Они требуют основательной переработки пакета.
Внутренние и внешние объединения, возможно, будут добавлены в версии 3.21.0
Когда MySQL запущен на Linux системе и использует потоки Linux, Вы будете видеть минимум три процесса. Фактически, это потоки. Будет иметься один поток для Linux Threads manager, один, чтобы обрабатывать подключения и один, чтобы обработать сигналы.
В заключение хочется попросить Вас, если Вам понравилась эта страничка или пригодилась изложенная здесь информация, послать благодарность автору. Это поможет мне вести статистику того, скольким людям пригодилось хоть что-то из моих трудов.
Библиотека отладчика, используемая MySQL была первоначально написана Фредом Фишом (Fred Fish). Она будет очень полезна, если Вы планируете отлаживать и/или добавлять функциональные возможности к СУБД MySQL.
Автор зачем-то приводит заголовок файла dbug.c из исходников пакета (вместе со всеми комментариями к нему). Приведу его и я, поскольку это может быть продиктовано какими-либо юридическими проблемами с копирайтом. Поскольку я не юрист, привожу этот заголовок без какого-либо перевода (во избежание ошибок или искажения смысла юридического документа при переводе).
/************************************************************************* * N O T I C E * * * * Copyright Abandoned, 1987, Fred Fish * * * * This previously copyrighted work has been placed into the public * * domain by the author and may be freely used for any purpose, * * private or commercial. * * * * Because of the number of inquiries I was receiving about the use * * of this product in commercially developed works I have decided to * * simply make it public domain to further its unrestricted use. I * * specifically would be most happy to see this material become a * * part of the standard Unix distributions by AT&T and the Berkeley * * Computer Science Research Group, and a standard part of the GNU * * system from the Free Software Foundation. * * * * I would appreciate it, as a courtesy, if this notice is left in * * all copies and derivative works. Thank you. * * * * The author makes no warranty of any kind with respect to this * * product and explicitly disclaims any implied warranties of mer- * * chantability or fitness for any particular purpose. * ************************************************************************* */ /* * FILE * dbug.c runtime support routines for dbug package * * SCCS * @(#)dbug.c 1.25 7/25/89 * * DESCRIPTION * These are the runtime support routines for the dbug package. * The dbug package has two main components; the user include * file containing various macro definitions, and the runtime * support routines which are called from the macro expansions. * * Externally visible functions in the runtime support module * use the naming convention pattern "_db_xx...xx_", thus * they are unlikely to collide with user defined function names. * * AUTHOR(S) * Fred Fish (base code) * Enhanced Software Technologies, Tempe, AZ * asuvax!mcdphx!estinc!fnf * * Binayak Banerjee (profiling enhancements) * seismo!bpa!sjuvax!bbanerje * * Michael Widenius: * DBUG_DUMP - To dump a piece of memory. * PUSH_FLAG "O" - To be used instead of "o" if we don't * want flushing (for slow systems) * Check of malloc on entry/exit (option "S") */
Поместить в стек текущее состояние отладчика, и установить новое.
СИНТАКСИС:
VOID _db_push_ (control) char *control;
ОПИСАНИЕ:
По указателю в параметре "control" на строку управления отладкой помещает в стек текущее состояние отладки, анализирует строку управления и устанавливает новое состояние отладки.
Единственный атрибут нового состояния, унаследованного из предыдущего состояния, это текущая функция вложенного уровня. Это может быть отменено, используя флажок "r" в строке управления.
Строка управления отладкой является последовательностью полей, разделенных двоеточиями:
<field_1><field_2><field_N>
Каждое поле состоит из обязательного символа флажка отладки, сопровождаемого факультативным "," и списком параметров, разделенных запятыми:
flag[,modifier,modifier,...,modifier]
d | Разрешает вывод из макроса DBUG_ |
D | Ждать после каждой выведенной отладчиком строки. Аргумент задает число десятых долей секунды, которое нужно ждать. Например, -#D,20 задает паузу в 2 секунды. |
f | Ограничивает отладку и/или трассировку списком имен функций. Обратите внимание, что пустой список отключит все функции. Соответствующий флажок "d" или "t" должен все же быть дан, поскольку этот флажок только ограничивает их действие, если они включены. |
F | Идентифицируют имя исходного файла для каждой строки отладки или трассирует вывод. |
i | Идентифицируют процесс с pid для каждой строки отладки или трассирует вывод. |
g | Включить профилирование. Создайте файл 'dbugmon.out', содержащий информацию, которая может использоваться, чтобы профилировать программу. Может сопровождаться списком ключевых слов, которые выбирают профилирование только для функций в этом списке. Пустой список подразумевает, что все функции подлежат профилированию. |
L | Идентифицирует номер строки исходного файла для каждой строки отладки или трассирует вывод. |
n | Выводит текущую глубину вложенности функции для каждой строки отладки или трассирует вывод. |
N | Номер каждой строки вывода отладки. |
o | Переназначает выходной поток отладчика в файл. По умолчанию задан stderr. |
O | То же, что и o, но файл сбрасывается между записями. То есть, после каждой записи файл закрывается, и снова открывается только перед следующей записью. Тормозит, конечно, кошмарно, но зато гарантирует сохранность данных в этом файле на случай слета системы. Что при отладке не бесполезно... |
p | Ограничивает действия отладчика определенными процессами. Процесс должен быть указан в макросе DBUG_PROCESS и совпадать с одной из записей в списке действий отладчика. |
P | Выводит имя текущего процесса для каждой строки отладки или трассирует вывод. |
r | При установке нового состояния отладки не наследует предыдущее состояние вложенности функции. Полезно, когда вывод должен начаться в левом поле. |
S | Функция _sanity(_file_, _line_) для каждой отлаживаемой функции до _sanity() возвращает отличное от 0 значение. Обычно используется с safemalloc. Как задается это значение, и что оно вообще значит в документации не сказано (!!!), а опытным путем это установить не удалось. |
t | Включить функцию трассировки строк вызова и выхода (call/exit). Может сопровождаться списком, содержащим число номер максимального уровня трассировки, вне которого никакого вывода не произойдет для отладочных или трассировочных макрокоманд. Умолчание задается при компиляции. |
Некоторые примеры строк управления отладкой:
-#d:t -#d:f,main,subr1:F:L:t,20 -#d,input,output,files:n
ОПИСАНИЕ:
Извлекает из стека отладки последнее записанное туда состояние отладки и устанавливает в него состояние отладки. Обратите внимание, что извлечение будет терпеть неудачу, если оно удалит последнее имеющее силу состояние из стека. Это предотвращает ошибки пользователя в последовательности действий со стеком из отладчика.
СИНТАКСИС:
VOID _db_enter_ (_func_, _file_, _line_, _sfunc_, _sfile_, _slevel_, _sframep_) char *_func_; points to current function name char *_file_; points to current file name int _line_; called from source line number char **_sfunc_; save previous _func_ char **_sfile_; save previous _file_ int *_slevel_; save previous nesting level char ***_sframep_; save previous frame pointer
ОПИСАНИЕ:
Вызывается в начале каждой функции пользователя, чтобы сообщить отладчику, что была введена новая функция. Обратите внимание, что указатели на предыдущее имя функции пользователя и предыдущее имя файла пользователя сохраняются в стеке вызовов (это причина того, почему макрокоманда ENTER должна быть первым "выполнимым" кодом в функции, так как она распределяет память для этой области. Предыдущий уровень вложения также сохраняется в стеке вызовов для внутренней самопроверки непротиворечивости.
Также печатает строку трассировки, если трассировка включена и увеличивает текущее значение глубины вложения функций.
Обратите внимание, что этот механизм позволяет отладчику знать, какая функция пользователя является текущей, без того, чтобы поддерживать внутренний стек для имен функции.
СИНТАКСИС:
VOID _db_return_ (_line_, _sfunc_, _sfile_, _slevel_) int _line_; current source line number char **_sfunc_; where previous _func_ is to be retrieved char **_sfile_; where previous _file_ is to be retrieved int *_slevel_; where previous level was stashed
ОПИСАНИЕ:
Вызывается перед тем, как функция пользователя выполняет явный или неявный возврат. Выводит строку трассировки, если трассировка разрешена, уменьшает текущее значение глубины вложения функций и восстанавливает текущую функцию и имена файлов из стека более не существенной функции.
Параметры файла протокола для последующего использования _db_doprnt_().
СИНТАКСИС:
VOID _db_pargs_ (_line_, keyword) int _line_; char *keyword;
ОПИСАНИЕ:
Новая универсальная макрокоманда печати DBUG_PRINT, которая заменяет все формы макрокоманд DBUG_N, нуждается в двух обращениях к подпрограммам поддержки во время выполнения. Первая, это функция, которая запоминает параметры, которые используются последующим обращением для _db_doprnt_().
Печать дескриптора строк отладки.
СИНТАКСИС:
VOID _db_doprnt_ (format, va_alist) char *format; va_dcl;
ОПИСАНИЕ:
Когда вызывается через одну из DBUG макрокоманд, проверяет текущий набор ключевых слов, вызывая _db_pargs_() чтобы узнать, была ли эта макрокоманда выбрана для обработки через строку управления отладчика, и если так, печатает аргументы с помощью форматированной строки. Номер строки DBUG макрокоманды в источнике найден в u_line.
Обратите внимание, что строка формата (format) НЕ ДОЛЖНА включить завершение строки (\n), это делается автоматически.
Выполняет дамп строки, пока не найдет '\0'.
СИНТАКСИС:
void _db_dump_ (_line_,keyword,memory,length) int _line_; current source line number char *keyword; char *memory; Memory to print int length; Bytes to print
ОПИСАНИЕ:
Выполняет дамп N символов в двоичный массив. Используется, чтобы исследовать разрушенную память или массивы.
Анализ списка параметров в строке контроля отладки.
СИНТАКСИС:
static struct link *ListParse (ctlp) char *ctlp;
ОПИСАНИЕ:
Принимает указатель на список строк в "ctlp", разделенный запятыми, анализирует список, формируя список и возвращая указатель на него. Первоначальный список разрушается в процессе формирования связанного списка, таким образом, лучше иметь его дубликат, если он важен.
Обратите внимание что, так как каждая связь добавляется в начало списка, конечный список будет в обратном порядке", который не значителен для нашего использования здесь.
Проверите данную строку на членство в данном списке.
СИНТАКСИС:
static BOOLEAN InList (linkp, cp) struct link *linkp; char *cp;
ОПИСАНИЕ:
Проверяет строку, на которую указывает "cp" чтобы определить, находится ли эта строка в списке, на который указывает "linkp". Linkp указывает на первую строку в списке. Если linkp == NULL, то строка обрабатывается, как будто она находится в списке (все строки находятся в пустом списке). Это может казаться довольно странным сначала, но ведет к желательной операции, если никакой список не задан. Результатом является то, что все строки будут приняты, когда не имеется никакого списка, но когда имеется список, будут приняты только те строки, которые есть в списке.
Сохраняет текущее состояние в стеке и устанавливает новое.
СИНТАКСИС:
static VOID PushState()
ОПИСАНИЕ:
Сохраняет текущее состояние в стеке и устанавливает новое. Единственным параметром, унаследованным из предыдущего состояния является уровень вложения функции. Это можно отменить флажком "r".
Стек состояния это связанный список состояний, с новым состоянием, добавленным в начало. Это позволяет стеку расти до самых границ памяти в случае необходимости.
Проверка разрешения на трассировку.
СИНТАКСИС:
static BOOLEAN DoTrace (stack)
ОПИСАНИЕ:
Проверяет разрешена ли трассировка, не достигнута ли еще максимальная глубина трассировки, текущая функция выбрана и текущий процесс выбран. Возвращает TRUE, если все в порядке, и FALSE в противном случае.
Проверяет разрешено ли профилирование.
СИНТАКСИС:
static BOOLEAN DoProfile()
ОПИСАНИЕ:
Проверяет разрешено ли профилирование, не достигнута ли еще максимальная глубина трассировки, текущая функция выбрана и текущий процесс выбран. Возвращает TRUE, если все в порядке, и FALSE в противном случае.
Проверяет ключевое слово на членство в списке ключевых слов.
СИНТАКСИС:
BOOLEAN _db_keyword_ (keyword) char *keyword;
ОПИСАНИЕ:
Проверяет ключевое слово на членство в списке ключевых слов. Как и в случае со строками, все ключевые слова принадлежат пустому списку. Когда отладка не включена, никакие ключевые слова не принимаются. После того, как максимальный уровень трассировки превышен, никакие ключевые слова тоже не принимаются. Дополнительно, текущая функция и текущий процесс должны входить в соответствующие списки.
Возвращает TRUE, если ключевое слово входит в список, и FALSE в противном случае.
СИНТАКСИС:
static VOID Indent (indent) int indent;
ОПИСАНИЕ:
Выравнивает строку на заданный уровень indent. Отступ может быть задан во время компиляции пакета в виде количества символов на один уровень вложения.
Освободить всю память, занятую элементами списка.
СИНТАКСИС:
static VOID FreeList (linkp) struct link *linkp;
ОПИСАНИЕ:
Параметр linkp указывает на первый элемент связанного списка. Освобождается вся память, занятая элементами списка и самим списком.
Создает копию строки в новой области памяти.
СИНТАКСИС:
static char *StrDup (string) char *string;
ОПИСАНИЕ:
Параметр string задает строку, копия которой нужна. Функция распределяет количество памяти, достаточное для создания копии строки и копирует строку в эту область памяти. Сбой при распределении памяти фатален.
Вывести префикс строки отладки.
СИНТАКСИС:
static VOID DoPrefix (_line_) int _line_;
ОПИСАНИЕ:
Выводит префикс, общий для всех строк отладки. Выводит такую информацию, как текущее имя процесса, текущее имя исходного файла, номер строки и текущее значение глубины вложения.
Открывает новый поток вывода для вывода отладчика.
СИНТАКСИС:
static VOID OpenFile (name) char *name;
ОПИСАНИЕ:
Параметр name является именем нового файла (или "-" для stdout). Файл открывается, и в него назначается вывод отладчика.
Открывает новый поток вывода для вывода профайлера.
СИНТАКСИС:
static FILE *OpenProfile (name) char *name;
ОПИСАНИЕ:
Параметр name задает имя файла, который открывается и назначается в качестве вывода для профайлера.
В настоящее время неясно, должно ли открытие файла усечь любой существующий файл, или просто добавлять записи в него. Последний вариант был бы желателен для сбора хронологии во время выполнения в ходе нескольких разных запусков программы. Это потребует некоторых изменений в программе анализатора.
Закрывает поток вывода отладчика.
СИНТАКСИС:
static VOID CloseFile (fp) FILE *fp;
ОПИСАНИЕ:
Закрывает поток вывода отладчика, если это не stdout или stderr.
Выводит сообщение об ошибке и завершает работу.
СИНТАКСИС:
static VOID DbugExit (why) char *why;
ОПИСАНИЕ:
Выводит сообщение об ошибке, используя текущее имя процесса, причина прерывания выполнения (обычно мало памяти), и выходит с 1 состоянием. Это должно быть изменено, чтобы использовать при выходе код состояния, определенный в отладчике пользователя. Но это будет в следующих версиях.
Выделяет память для библиотек поддержки отладчика.
СИНТАКСИС:
static long *DbugMalloc (size) int size;
ОПИСАНИЕ:
Выделяет дополнительную память для библиотек поддержки отладчика. Сбой при распределении запрошенного число байтов фатален для текущего процесса. Это довольно недружелюбное поведение. Лучше просто печатать предупреждающее сообщение, замораживать текущее состояние отладчика, и продолжать выполнение. Но это в следующей версии (может быть)...
СИНТАКСИС:
static char *static_strtok (s1, separator)
ОПИСАНИЕ:
Аналог strtok, но 2 разделителя в строке заменены на 1 для совместимости с именами каталогов, принятыми в DOS.
Удаляет путь из полного имени файла.
СИНТАКСИС:
static char *BaseName (pathname) char *pathname;
ОПИСАНИЕ:
Параметр pathname является указателем на полное имя файла. Функция размещает в памяти короткое имя файла и возвращает указатель на него.
Проверяет возможность записи/создания файла.
СИНТАКСИС:
static BOOLEAN Writable (pathname) char *pathname;
ОПИСАНИЕ
Поскольку отладчик может быть связан и с программой, которая выполняется с битом uid прав доступа (suid), мы должны быть внимательными относительно открытия заданного пользователем файла для вывода отладчика. Это состоит из проверки доступа к файлу на запись с реальным идентификатором пользователя, или проверкой каталога, где файл будет создан.
Вернет TRUE, если все в порядке и FALSE в противном случае.
Меняет владельца на реального пользователя для suid программ.
СИНТАКСИС:
static VOID ChangeOwner (pathname)
ОПИСАНИЕ:
Для Unix-систем, меняет владельца недавно созданного файла отладки на реального владельца. Это нужно в случаях выполнения программ, запущенных с правом доступа set-user-id.
Обратите внимание, что владелец файла уже установлен на момент выдачи этой команды. Так что, если она выполняется без права доступа set-user-id, то эта команда смысла не имеет (но безобидна).
Сохранить окружение отладчика.
СИНТАКСИС:
VOID _db_setjmp_ ()
ОПИСАНИЕ:
Вызывается как часть макрокоманды пользователя DBUG_SETJMP, чтобы сохранить среду отладчика параллельно с сохранением среды пользователя.
Восстановить предварительно сохраненное окружение отладчика.
СИНТАКСИС
VOID _db_longjmp_ ()
ОПИСАНИЕ:
Вызывается как часть макрокоманды пользователя DBUG_LONGJMP, чтобы восстановить среду отладчика параллельно с восстановлением предварительно сохраненной среды пользователя.
Преобразует параметр флажка D к системному стандарту.
СИНТАКСИС:
static int DelayArg (value) int value;
ОПИСАНИЕ:
Преобразует время задержки, задаваемое в десятых долях секунды, к системному стандарту. Например, на Amiga, имеется системный вызов "Delay()" который получает параметр в импульсах таймера (50 в секунду). На Unix команда sleep работает с числом секунд. Таким образом, значение "10", для задержки в течение одной секунды, преобразуется в 50 на Amiga, и 1 на Unix. Другие системы будут должны использовать цикл синхронизации.
Моделирование perror для систем, которые его не имеют.
СИНТАКСИС:
static VOID perror (s) char *s;
ОПИСАНИЕ:
Perror выдает сообщение в стандартный поток ошибки, которое обеспечивает большее количество информации относительно библиотеки или ошибки системы. Выводится сообщение, заданное строкой s, затем ': ', сообщение об ошибке и перевод строки (\n).
Недокументированная возможность Unix perror сводится к тому, что если 's' является пустой строкой (но не NULL!), то не выводится ': '.
Эта версия выдает сообщение только о "неизвестной ошибке системы".
В заключение хочется попросить Вас, если Вам понравилась эта страничка или пригодилась изложенная здесь информация, послать благодарность автору. Это поможет мне вести статистику того, скольким людям пригодилось хоть что-то из моих трудов.
СУБД MySQL поставляется приходит со следующими основными программами и скриптами.
Еще есть несколько утилит. Они не жизненно важны для MySQL, но обеспечивают полезные дополнительные функциональные возможности.
Клиентская программа MySQL.
Запуск:
ОПИСАНИЕ:
Программой mysql поддерживаются следующие опции. Вы можете использовать или "короткий" одиночный символ или более подробную версию.
-\?, --help | Справка. |
-d, |
Вывести в протокол отладочную информацию. В общем виде 'd:t:o,filename`. Подробности в главе о библиотеке отладки. |
-d, |
Вывести отладочную информацию при выходе из программы. |
-e, --exec | Выполнить команду и выйти, неявная форма опции --batch. |
-f, --force | Продолжить, даже если мы сталкиваемся с SQL ошибкой. |
-h, --hostname=[hostname] | Задает имя сервера, с которым Вы желаете соединиться. |
-P, --port=[port] | Порт, для соединения с сервером MySQL. |
-p, --password=[password] | Пароль пользователя, для соединения с сервером MySQL. Обратите внимание, что не должно быть пробела между -p и паролем. |
-q, --quick | Быстрый (небуферизованный вывод), может замедлить сервер, если вывод приостановлен. |
-s, --silent | Работать молча (подавить вывод). |
-u, --user=[user] | Имя пользователя для соединения с сервером MySQL. Необязательно, если имя пользователя такое же, как ваш логин. По умолчанию именно ваш логин используется в качестве имени пользователя, что облегчает настройку. |
-v, --verbose | Подробный вывод. -v опция может быть удвоена или утроена для более подробного вывода. В программах русских авторов обычно именуется "уровнем болтливости программы". |
-w, --wait | Если подключение терпит неудачу, то подождать и повторить попытку. |
-B, --batch | Выполнить в пакетном режиме. Никаких запросов и никаких ошибок в STDOUT. Устанавливается автоматически при чтении из/записи в канал (пайп). Результаты будут выведены в формате с разделением табуляцией. Одна строка результата соответствует одной строке вывода. |
-I, --help | Справка, эквивалент -\?. |
-V, --version | Вывести информацию о версии пакета. |
В интерактивном режиме mysql будет печатать результаты в таблице подобно примеру, приведенному ниже. Если не задан пароль или имя пользователя mysql попробует зайти в систему на сервере базы данных с использованием вашего логина и НУЛЕВОГО (ПУСТОГО) пароля. Если ваш mysql логин отличается от вашего логина в unix, или если вы имеете пароль, то это провалится.
ПРИМЕР:
$ mysql mysql Welcome to the mysql monitor. Commands ends with ; or \g. Type 'help' for help. mysql> select * from host; 1 rows in set (0.25 sec) +-----------+----+--------+--------+--------+--------+--------+------+ | host | db | select | insert | update | delete | create | drop | +-----------+----+--------+--------+--------+--------+--------+------+ | localhost | % | Y | Y | Y | Y | Y | Y | +-----------+----+--------+--------+--------+--------+--------+------+ mysql> |
Переведу этот пример на русский:
$ mysql mysql Добро пожаловать в монитор mysql. Команды кончаются на ; или \g. Наберите 'help' для получения справки. mysql> select * from host; 1 строка в наборе (0.25 секунды) +-----------+----+--------+--------+--------+--------+--------+------+ | host | db | select | insert | update | delete | create | drop | +-----------+----+--------+--------+--------+--------+--------+------+ | localhost | % | Y | Y | Y | Y | Y | Y | +-----------+----+--------+--------+--------+--------+--------+------+ mysql> |
В режиме командной строки Вы должны иметь возможность работать с историей ввода и редактировать предыдущие команды. Это сильно облегчит работу.
В пакетном режиме результаты выводятся в виде полей, разделенных символами табуляции.
ПРИМЕР:
Создайте файл /tmp/test, который содержит следующую строку:
select * from hostВ командной строке введите:
$ mysql mysql </tmp/test |
host db select insert update delete create drop localhost % Y Y Y Y Y Y |
Проверка прав доступа пользователя.
СИНТАКСИС:
ОПИСАНИЕ:
$ 'mysqladmin reload'после внесения изменений в таблицы базы данных MySQL.
Скрипт mysqlaccess поддерживает следующие параметры (Вы можете использовать "короткий" одиночный символ или более подробную версию):
-?, --help | Справка. |
-v, --version | Информация о версии |
-u, --user=... | Имя пользователя для доступа к базе данных. |
-p, --password=... | Пароль пользователя, для соединения с сервером MySQL. Обратите внимание, что не должно быть пробела между -p и паролем. |
-h, --host=... | Имя сервера, используется для проверки прав доступа. |
-d, --db=... | Имя базы данных, используется для проверки прав доступа. |
-U, --superuser=... | Логин администратора. |
-P, --spassword=... | Пароль администратора. |
-b, --brief | Вывести краткие сведения о таблице. |
--relnotes | Вывести заметки по реализации. |
--plan | Вывести идеи для будущих реализаций. |
--howto | Вывести примеры использования `mysqlaccess' |
--debug=N | Уровень отладки N (0..3) |
Вы должны указать по крайней мере имя пользователя и имя базы данных, которые Вы желаете проверить. Если имя сервера не задано, то подразумевается имя 'localhost'.
"Групповые символы" (*,?, %, _) могут применяться при указании сервера, пользователя и db (базы данных). Убедитесь, что они не будут перехвачены вашей командной оболочкой unix.
СИНТАКСИС:
ОПИСАНИЕ:
-\?, --help | Справка. |
-d, --debug=[options] | Вывести в протокол отладочную информацию. В общем виде 'd:t:o,filename`. Подробности в главе о библиотеке отладки. |
-f, --force | Не спрашивать подтверждения при пропуске таблицы. |
-h, --host=[hostname] | Имя сервера, если не localhost. |
-i, --sleep=[seconds] | Выполнить команды несколько раз с паузой в [секунд] между ними. |
-p, --password[password] | Пароль пользователя, для соединения с сервером MySQL. Обратите внимание, что не должно быть пробела между -p и паролем. |
-u, --user=[user] | Имя пользователя. Если не указано, используется текущий логин. |
-P, --port=[port] | Порт, для соединения с сервером MySQL. |
-V, --version | Вывести информацию о версии. |
create [имя базы данных] | Создать базу данных. |
drop [имя базы данных] | Удалить базу данных (вместе со всеми таблицами). |
processlist | Вывести сведения о работающих потоках MySQL. |
reload | Перечитать настройки и очистить все кэши. |
shutdown | Завершить работу СУБД MySQL. Все запущенные MySQL-сессии помечаются как 'killed'. Это означает, что все потоки, которые простаивают в настоящее время, будут закрыты немедленно, а управление потоками будет закрыто, когда они достигнут точек завершения, определенных сервером. Клиенты получат сообщение об ошибке 'mysql server has gone away'. |
status | Вывести короткое сообщение о статусе сервера. |
version | Вывести информацию о версии. |
Обратите внимание: mysqladmin понимает сокращения. Например, Вы могли бы написать следующее:
$ mysqladmin v pЭто вывело бы версию mysqld и список всех активных в настоящее время потоков.
Вы можете использовать опцию -i=[секунд] для повтора команды каждые [секунд]. Это наиболее полезно с командой processlist.
Обратите внимание, что Вы можете использовать вышеупомянутые команды, только если Вы имеете соответствующие права доступа.
Серверная часть пакета MySQL (mysqld).
СИНТАКСИС:
ОПИСАНИЕ:
Может наблюдаться спад производительности при использовании опции
Опция
Каждая операция UPDATE, DELETE и INSERT имеет заголовок в 13 байтов дополнительно к команде.
Каждая открытая таблица требует девять байтов плюс длина имени файла таблицы. Это необходимо только для таблиц, которые еще не в кэше таблиц.
Кроме того будут иметься одиннадцать байтов дополнительно для любых команд, которые кэшируют/блокируют таблицы. Эти события обычно вызваны внутренними командами mysql. Наиболее часто, когда используется SELECT.
В большинстве случаев нужно выполнять mysqld из скрипта safe_mysqld .
Программа mysqld поддерживает следующие опции командной строки:
-\?, --help | Справка |
-#, --debug=[options] | Вывести в протокол отладочную информацию. В общем виде 'd:t:o,filename`. Подробности в главе о библиотеке отладки. |
-b, --basedir=[path] | Полное имя каталога в который установлен пакет. |
-h, --datadir [homedir] | Полное имя каталога в котором хранятся базы данных. |
-l, |
Имя файла протокола запросов к базам данных и подключений. |
Имя файла протокола изменений isam. | |
-O, |
Установить переменную. См. ниже. |
-L, --language=[language] | Значение по умолчанию 'english/'. Может быть так же 'swedish/', 'germany/','french/' или 'czech/'. Текущий список можно посмотреть в подкаталог share/mysql каталога, в который установлен MySQL. |
-P, --port=[port] | Порт для соединения. |
-T, |
Вывести отладочную информацию. |
Не использовать новые (возможно, глючные) возможности этой версии. | |
Игнорировать таблицы предоставления доступа. Это дает любому ПОЛНЫЙ доступ ко всем таблицам. | |
Не использовать блокировку системы. Может дать лучшую эффективность, но не должен использоваться вместе с isamchk. ТО ЕСТЬ, сначала остановите сервер. | |
Эта опция заставит mysqld принимать адреса IP только тех серверов, которые явно указаны в базе данных привилегий mysql. DNS можно более или менее просто хакнуть, а эта опция позволяет избежать ряда проблем, если прикладная программа требует высокого уровня защиты. | |
Использовать подключения только через интерфейс localhost. Эта опция не будет работать с MIT потоками. Если подключения к базе данных будут только локальные, то использование этой опции защитит от создания удаленных подключений. | |
Пропустить возможно опасные оптимизации. | |
--socket=[socket] | Имя сокет-файла для MySQL. Недоступно при использовании версии MySQL,
скомпилированной с MIT потоками.
ПРИМЕР: |
-V, --version | Вывести информацию о версии. |
Если опция -h не определена, mysql будет считать, что основной каталог = "/my/data/sql/mysql".
Все базы данных размещены в каталоге [homedir]/[имя базы данных] .
Опция -l должна использоваться осторожно. Когда используется сервер, с большим объемом транзакций, этот файл может стать большим очень быстро. Если Вы не определяете имя logfile, при использовании опции -l mysqld будет писать протокол в файл [homedir]/[hostname].log.
Опция -O позволяет Вам определять значения для следующих параметров:
Имя | Значение по умолчанию |
---|---|
back_log | 5 |
keybuffer | 1048568 |
max_allowed_packet | 65536 |
net_buffer_length | 8192 |
max_connections | 90 |
table_cache | 64 |
recordbuffer | 131072 |
sortbuffer | 2097144 |
max_sort_length | 1024 |
Информация относительно того, что эти значения делают, и как поднять эффективность mysqld, находится здесь.
СИНТАКСИС:
ОПИСАНИЕ:
Программа mysqldump поддерживает следующие параметры (Вы можете использовать короткую или подробную версию):
-#, --debug=[options] | Вывести в протокол отладочную информацию. В общем виде 'd:t:o,filename`. Подробности в главе о библиотеке отладки. |
-?, --help | Справка. |
-c, |
Генерируйте полные инструкции insert (не исключая значений, которые соответствуют значениям столбца по умолчанию). |
-h, --host=[hostname] | Соединиться с сервером hostname. |
-d, |
Экспорт только схемы информации (исключая данные). |
-t, |
Экспорт только данных, исключая информацию для создания таблицы. Противоположность -d. |
-p, --password=[password] | Пароль пользователя, для соединения с сервером MySQL. Обратите внимание, что не должно быть пробела между -p и паролем. |
-q, --quick | Не буферизовать результаты запроса, дамп выдать непосредственно к STDOUT. |
-u, --user=[username] | Имя пользователя. Если не задано, используется текущий логин. |
-v, --verbose | Вывести подробную информацию относительно различных стадий выполнения mysqldump. |
-P, --port=[port] | Порт для связи. |
-V, --version | Информация о версии. |
Вы можете направить вывод mysqldump в клиентскую программу MySQL, чтобы копировать базу данных. ПРИМЕЧАНИЕ: Вы должны убедиться, что база данных не изменяется в это время, иначе Вы получите противоречивую копию!
ПРИМЕР:
mysqladmin create foo
mysqldump mysql | mysql foo
СИНТАКСИС:
ОПИСАНИЕ:
Программа mysqlshow поддерживает следующие параметры (Вы можете использовать короткую или подробную версию):
-#, --debug=[options] | Вывести в протокол отладочную информацию. В общем виде 'd:t:o,filename`. Подробности в главе о библиотеке отладки. Как мне надоела эта опция... |
-?, --help | Справка. |
-h, --host=[hostname] | Связаться с сервером hostname. |
-k, --key | Вывести ключ(и) для таблиц(ы). |
-p, --password=[password] | Пароль пользователя, для соединения с сервером MySQL. Обратите внимание, что не должно быть пробела между -p и паролем. |
-u, --user=[username] | Имя пользователя. Если не задано, используется текущий логин. |
-P, --port=[port] | Порт для связи. |
-V, --version | Информация о версии. |
Если последний параметр содержит '?' или '*', то они используются как подстановочные знаки.
ПРИМЕР:
mysqlshow test 'a*'
показать список всех таблиц в базе данных test, начиная с 'a'.
mysqlshow по существу идентичен программе mSQL msqlshow. СУБД MySQL обеспечивает, подобные функциональные возможности посредством команд языка SQL SHOW и DESCRIBE .
СИНТАКСИС:
isamchk [-?adeiqrsvwzIV] [-k #] [-O xxxx=size] [-Si] [-Sr #] [-O keybuffer=#] [-O readbuffer=#] [-O writebuffer=#] [-O sortbuffer=#] [-O sort_key_blocks=#] files
ОПИСАНИЕ:
Необходимо остановить СУБД MySQL перед запуском isamchk с единственным переключателем -r.
Вообще, используйте переключатель -rq для ремонта таблицы, потому что он выполняет "оперативный" ремонт. Для такого ремонта не нужно временного места в памяти, таким образом он проходит быстро, так как isamchk не копирует файл данных.
Перед началом работы, надо перейти в каталог с таблицей, которая нуждается в проверке и/или ремонте. В общем случае, это $DATADIR/DBNAME.
Опции программы isamchk:
-# | Вывести в протокол отладочную информацию. В общем виде 'd:t:o,filename`. Подробности в главе о библиотеке отладки. |
-? | Справка. |
-a | Анализ. Используется для для оптимизации размещения таблиц. |
-d | Информация о таблице. |
-e | Расширенная проверка. При запуске с этой опцией надо остановить демон mysqld. |
-f | Принудительно создать временный файл. Эта опция вызовет |
-k# | Используемые ключи. |
-i | Дополнительная информация. |
-q | Быстрая проверка. |
-r[o] | Восстановление, Эта опция также уплотнит внутренние индексы B-Tree, используемые MySQL. Используйте эту опцию, чтобы уменьшить место, занимаемое таблицей, за счет удаления неиспользуемых индексов. |
-s | Работать молча. |
-u | Распаковать упакованный файл. |
-v | Подробный вывод. Используется вместе с другими параметрами, чтобы получить большее количество информации. Можно задать большее количество символов v для повышения объема выдаваемой информации (например, vv). |
-w | Ждать, если таблица заблокирована. |
-I | Справка. |
-S[ir]# | Сортировать индекс/записи по ключу #. Эта опция оптимизирует размещение данных в таблице. |
-V | Информация о версии. |
-O var=# | Опция оптимизации var=#[k][m] |
Имеется несколько примеров. См. Подробно о таблицах.
ПРИМЕРЫ:
isamchk -r [table_name] | Убрать все дырки, которые сформировались из-за использования BLOBS или VARCHARS. Также установить какие еще есть проблемы. |
isamchk -ei [table_name] | Проверить таблицу и отобразить статистику. |
isamchk [table_name] | Найти большинство ошибок. |
isamchk -rq [table_name] | Обновить только индексный файл. Быстро, но не исправляет ошибки в файле данных. |
Описание таблицы. | |
isamchk -rq -Si [table_name] | Полная оптимизация таблицы [table_name]. Надолго... |
СИНТАКСИС:
isamlog [-?iruvIV] [-c #] [-f #] [-p #] [-F filepath/] [-o #] [-R file recordpos] [-w write_file] [log-filename]ОПИСАНИЕ:
mysqld
.
Файл file_name будет хранить протокол всех изменений для всех таблиц. Программа isamlog может быть использована для получения информации об этом файле и обновить все таблицы и базы данных.
Чтобы восстановить базу данных, нужна копия, которая содержит вашу базу данных до того, как mysqld сгенерировал ISAM журнал, или полный набор ISAM журналов с начала работы вашей базы данных.
-? or -I | Справка. |
-V | Информация о версии. |
-c # | Выполнить только # команд. |
-f # | Максимальное число открытых файлов. Если откроется больше чем # файлов, то лишние будут автоматически закрыты и вновь открыты по мере необходимости. |
-F [path] | Файл протокола ISAM содержит полный путь к таблицам. Вы можете
использовать эту опцию, чтобы отменить сохраненный путь.
ПРИМЕР: -F '/var/mirror/' заставит isamlog работать с файлами в /var/mirror, а не с теми, которые указаны в сохраненном пути. |
-i | Вывести более детальную информацию. |
-o # | Начать со смещения #. |
-p # | Удалить # компонент из пути. |
-r | Игнорировать все ошибки, с которыми сталкиваемся в течение модификаций. |
-R | Указать позицию в файле ISAM, о которой надо выдать сведения.
ПРИМЕР:
Выведет все изменения в таблице /usr/local/data/mysql/user, которые
найдены в позиции 1234. Это полезно для ситуаций, в которых Вы имеете
разрушенную запись в известной позиции. Вы, возможно, получили эту
информацию посредством Если Вы укажете позицию -1, будут обработаны все записи. |
-u | Пытаться модифицировать все таблицы. Остановиться, если встречена ошибка. |
-v | Подробный вывод. Можно задать большее количество символов v для повышения объема выдаваемой информации (например, vv). |
-w [filename] | Записать все записи вставленные или измененные опцией -R в [filename]. Эта опция может использоваться, чтобы получить двоичный файл всех вставок и модификаций конкретной таблицы для использования в отладке. |
СИНТАКСИС:
ОПИСАНИЕ:
СИНТАКСИС:
comp_err [-?] [-I] [-V] fromfile[s] tofile
ОПИСАНИЕ:
Эта программа используется для компиляции текстовых файлов которые содержат соответствие между кодами ошибок mysql и текстовыми сообщениями об этих ошибках в формат, который понимает mysql. Это нужно для изменения уже существующего файла сообщений или генерации такого файла для другого языка.
ПРИМЕР:
comp_err share/english/errmsg.txt share/english/errmsg.sys
СИНТАКСИС:
Программа msql2mysql - фактически довольно простой скрипт, который использует команду replace, которая поставляется с СУБД MySQL, чтобы заменить mSQL обращения к функции на их MySQL эквиваленты. Меняются только имена, дополнительные параметры не добавляются.
СИНТАКСИС:
ОПИСАНИЕ:
СИНТАКСИС:
$ perror [-?vIV] [errorcodes]
ОПИСАНИЕ:
Программа perror поддерживает опции:
-? or -I | Справка. |
-v | Подробная информация. |
-V | Информация о версии. |
СИНТАКСИС:
ОПИСАНИЕ:
Программа program используется скриптом msql2mysql. Replace может быть использована для замены строки на месте в файле или получать строку через канал (пайп), производить замену и выводить результат в STDOUT.
Допустимы следующие опции:
-? | Справка. |
-s | Работать молча (никаких статусных сообщений). |
-v | Подробная информация о ходе работы (выводить дополнительные сообщения). |
ПРИМЕРЫ:
replace Apple Orange somefile
Заменит все вхождения Apple на Orange в файле somefile.
cat INFILE | replace Apple Orange Blimp Train > OUTFILE
Все вхождения Apple в файле INFILE будут заменены на Orange и результат выведен в файл OUTFILE. В то же время, все вхождения Blimp в файле INFILE будут заменены на Train и тоже выведены в файл OUTFILE. Таким образом, можно заменять более чем одно выражение за один проход.
Вы можете использовать специальные символы во входных строках:
\^ | Соответствует началу строки. |
\$ | Соответствует концу строки. |
\b | Соответствует пробелу. Может появляться или отдельно, или в начале, или в конце лексемы. Если \b используется в конце лексемы, следующие замены начнутся после пробела. \b соответствует только пробелу. |
Replace простая и очень полезная утилита с большими потенциальными возможностями использования в MySQL.
Найти команду.
СИНТАКСИС:
ОПИСАНИЕ:
СИНТАКСИС:
ОПИСАНИЕ:
zap
запросит подтверждение для каждого
подходящего процесса.ПРИМЕР:
prompt> zap -t "my" UID PID PPID C STIME TTY TIME CMD root 1217 1 1 15:21:30 pts/4 0:00 /bin/sh /usr/local/pkg/mysql-3.20.15/bin/safe_mysqld root 1224 1217 3 15:21:32 pts/4 0:01 /usr/local/pkg/mysql-3.20.15/libexec/mysqld -b /usr/local/pkg/mysql-3.20.15 -h |
Программа zap поддерживает опции:
-I or -? | Справка. |
-f | Послать сигнал без запроса подтверждения. |
-t | Вывести список процессов, соответствующих образцу, но не сигнал им не посылать. |
В качестве сигнала допускается любой сигнал системы unix. По умолчанию сигнал = 9 (завершить процесс).
В заключение хочется попросить Вас, если Вам понравилась эта страничка или пригодилась изложенная здесь информация, послать благодарность автору. Это поможет мне вести статистику того, скольким людям пригодилось хоть что-то из моих трудов.