SQL СУБД (реляционная) без излишеств (правда, в последней версии появились транзакции с помощью Berkley DB и INNOBASE), зато быстрая (для поиска и добавления, если предстоят частые изменения, то лучше поискать другую СУБД). Стандарты: entry level SQL92, ODBC levels 0-2. Лицензия - GPL/LGPL (но в случае извлечения прибыли от MySQL фирма - MySQL AB, Швеция - мягко намекает на оплату поддержки). Для хостинга лицензия не нужна, но клиенты должны иметь возможность убедиться, что все установлено правильно (предлагается давать доступ на чтение к установленным исходникам). Написана на C и C++. Базовая платформа: Solaris 2.7-2.8, SuSE Linux 7.1 (ядро 2.4, ReiserFS), но работает также в AIX, BSDI, DEC Unix, FreeBSD, HP-UX, Linux 2.0, Mac OS X, NetBSD, OpenBSD, OS/2, SGI Irix, SunOS, SCO OpenServer, SCO UnixWare, Tru64, Win9x, NT, Win2000. Многопотоковая. Первоначально мимикрировала под mSQL. API для C, C++, Java, Eiffel, Perl, PHP, Python, Tcl. ODBC. Парольная защита (пароли шифруются перед пересылке, это, однако, не увеличивает безопасность). Таблицы в виде B-tree со сжатием индекса. До 32 индексов на таблицу. До 16 колонок на индекс. Длина индекса до 500 байт. Таблицы в памяти. Записи переменной длины. Есть примеры использования MySQL с 60000 таблиц и 5 миллиардами строк. Отсутствует memory leak (проверено Purify). Поддержка koi8-r и cp1251 (сортировка, сравнение и т.д.). Клиенты могут соединяться по TCP/IP (можно использовать только, если никто не подслушивает) или Unix socket. Можно встраивать в свои программы. Стабильность подсистем: ISAM - стабильная, MyISAM - gamma, C API - стабильная (буфер до 16МБ), mysql(admin,show,dump,import) - стабильные, Basic SQL - стабильная, оптимизатор - стабильная, блокировка (одновременный доступ нескольких процессов, не клиентов) - gamma (проблемы в Linux, рекомендуется --skip-locking), нити в Linux - рекомендуется --skip-locking и использовать не более 1000 одновременных соединений, DBD - стабильная, MyODBC - gamma, репликация - бета/gamma, BDB - бета (транзакции), автоматическое восстановление MyISAM - бета, слияние таблиц - бета/gamma, INNODB - альфа (транзакции с блокировкой на уровне строк), полнотекстовый поиск - бета. Расширения к ANSI SQL92: - типы полей MEDIUMINT, SET, ENUM и различные модификации BLOB и TEXT
- атрибуты полей: AUTO_INCREMENT, BINARY, NULL, UNSIGNED и ZEROFILL
- по умолчанию строки сравниваются независимо от регистра
- ключевые слова TEMPORARY и IF NOT EXISTS при создании/удалении таблиц
- ключ DELAYED при создании/замене строк
- ключ LOW_PRIORITY при манипуляции со строками
- SHOW
- строки можно заключать не только в апострофы, но и в кавычки
- SET OPTION
- синонимы операторов OR (||) и AND (&&) и MOD (%)
- LAST_INSERT_ID()
- REGEXP
- IT_COUNT(), CASE, ELT(), FROM_DAYS(), FORMAT(), IF(), PASSWORD(), ENCRYPT(), md5(), ENCODE(), DECODE(), PERIOD_ADD(), PERIOD_DIFF(), TO_DAYS(), or WEEKDAY()
- REPLACE вместо DELETE + INSERT
- присвоение значений переменным в выражениях
- комментарии в стиле C и sh
- множество других мелких улучшений и несовместимостей, которые не позволят Вам "соскочить" с MySQL на другую СУБД
Отсутствующие возможности ANSI SQL92: - sub-select (в руководстве приводятся примеры как обойтись без него)
- хранимые процедуры и тригеры (тригеры не планируются совсем)
- FOREIGN KEY
- views
Установка и настройка (Linux) Опции ./configure mysql.server (запуск MySQL при загрузке копьютера) safe_mysqld (надстройка над mysqld) mysqld (сервер БД) Разбор параметров и конфигурационных файлов Типы таблиц (методы доступа) Права доступа и привилегии Базовый синтаксис Типы данных (в колонках) Операторы SQL Функции для SELECT и WHERE Отличия версий - иметь gcc лучше, чем 2.8.1 (egcc 1.0.2), рекомендуется 2.95.2
- создать директорию для сборки, распаковать в нее mysql-3.23.37.tar.gz (взять на http://www.mysql.ru/download)
- для версии ранее 3.23.34 распаковать туда db-3.2.3h.tar.gz (это специальная версия bdb для MySQL)
- создать группу mysql
- создать пользователя mysql (в группе mysql) (зачем ему bash?)
- ./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --with-unix-socket-path=путь --with-mysqld-user=mysql --disable-large-files --with-libwrap --without-debug --with-charset=cp1251 --with-extra-charsets=all --with-berkeley-db
- make (70MB/91MB)
- если upgrade, то остановить mysql, сохранить базы данных и my.cfg (не забыть потом удалить!)
- make install (как root)(16 MB, из них 5МБ - тест)
- /usr/local/mysql/include/mysql
- /usr/local/mysql/info
- /usr/local/mysql/man
- /usr/local/mysql/lib/mysql (libdbug, libheap, libmerge, libmyisam, libmyisammrg, libmysqlclient, libmystrings, libmysys, libnisam); эту директорию указывать для libtool, либо занести в /etc/ld.so.conf
- /usr/local/mysql/bin (comp_err, isamchk, isamlog, my_print_defaults, myisamchk, myisamlog, myisampack, mysql, mysqladmin, mysqlbinlog, mysqlshow, mysqldump, mysqlimport, mysqltest, pack_isam, perror, replace, resolve_stack_dump, resolveip, скрипты )
- /usr/local/mysql/share/mysql (сообщения об ошибках - koi8-r, таблицы кодировок - cp1251, koi8-r; mi_test_all; mi_test_all.res)
- /usr/local/mysql/libexec (mysqld)
- /usr/local/mysql/sql-bench
- /usr/local/mysql/mysql-test
- /usr/local/mysql/data (базы данных, конфигурация, журналы, pid-файл)
- при первой установке: scripts/mysql_install_db (как root - создание таблиц с правами доступа, дает все права пользователю root без пароля и позволяет делать все с базами test и test_*, кроме раздачи привилегий)
- chown -R root:mysql /usr/local/mysql (как root)
- chown -R mysql /usr/local/mysql/data (и отдельную директорию для mysql.sockets с правами чтения для всех; mysql не нужны права на запись для my.cnf)
- support-files/mysql.server в /etc/rc.d/init.d для автоматического запуска и дать ему права на исполнение и сделать линк K00mysql из rc0.d и rc6.d на него, S99mysql из rc2.d, rc3.d и rc5.d на него
- скопировать my-medium.cnf в /usr/local/mysql/data/my.cnf и слегка отредактировать [mysqld]
- socket=имя-файла под Unix-socket (и в раздел [client] тоже)
- skip-locking (не блокировать доступ к данным от ДРУГИХ процессов)
- log-bin #журнал изменений для репликации
- log-slow-queries
- log-update #журнал изменений
- #secure - говорит, что нет такой опции
- skip-networking #если не нужен доступ по TCP/IP (а еще лучше использовать ssh + port forward)
- safe-show-database
- skip-show-database
- server-id=1 # что это?
- куча set-variable из исходного файла
- set-variable = max_connections=500
- тестовый запуск: /usr/local/mysql/bin/safe_mysqld --user=mysql (как root)(или сразу /etc/rc.d/rc3.d/S99mysql start)
- /usr/local/mysql/bin/mysqladmin -u root -p password 'пароль' (при запросе пароля нажать Enter)
- /usr/local/mysql/bin/mysqladmin -u root -h localhost.localdomain -p password 'пароль' (надо ли?)
- установка интерфейса с Perl
- взять модули Data-Dumper, DBI и Msql-Mysql-modules
- каждый распаковать в отдельную директорию (Msql-Mysql-modules последним)
- зайти в нее
- perl Makefile.PL (опционально хочет RPC::PlServer, RPC::PlClient, Storable, Net::Daemon).
- make
- make test (mysqld должен работать)
- make install (как root)
- тестирование
- зайти в sql-bench
- ./run-all-tests --user=test (нужны права для записи в директорию output, час времени и 200 МБ на диске)(connect/disconnect временами грохает mysqld!)
- можно удалить sql-bench и mysql-test
- настроить права доступа (как минимум, убрать анонимный доступ)
- --prefix=куда-устанавливать (множество мелочных опций по установке)
- --enable-maintainer-mode [no]
- --enable-shared (делать разделяемые библиотеки)[yes]
- --enable-static (10% быстрее)[yes]
- --with-mit-threads (для linux 2.2 не надо)
- --with-pthread (для linx 2.2 не надо)
- --with-named-thread-libs=где
- --with-named-curses-libs=где
- --with-named-z-libs=где
- --enable-thread-safe-client (если клиентская программа использует потоки)
- --enable-assembler
- --with-raid
- --with-unix-socket-path=куда-класть-unix-socket
- --with-tcp-port=порт [3306]
- --with-mysqld-user=имя-пользователя-для-mysqld
- --disable-large-files
- --with-libwrap
- --without-debug (15% быстрее)
- --without-server
- --without-docs
- --without-bench
- --without-readline (использовать системный readline вместо встроенного)
- --with-charset=кодировка-по-умолчанию (cp1251, koi8_ru, latin1, ...)
- --with-extra-charsets=список-дополнительных-кодировок (включая - none, complex, all)
- --with-berkeley-db
- --with-innodb
- --with-gemini (Gemini DB)
Скрипт предназначен для /etc/rc.d/init.d (и линки в 0,2,3,5,6 не забыть). Соответственно первый параметр start или stop (посылается сигнал процессу, вместо выполнения "mysqladmin shutdown"). Далее обработка опций из конфигурационного файла (группы [mysqld] и [mysql_server]) и командной строки (какая командная строка в скрипте из rc.d?!). Ищет и запускает safe_mysqld. Если нужны какие-либо специфические опции safe_mysqld, то их можно указать здесь. Секция [mysql.server] в конфигурационном файле /etc/my.cnf может содержать установку переменных: - user
- datadir
- basedir
- bindir
- pid-file
Скрипт запускает mysqld и перезапускает его ежели тот помрет. Проверяет, что не был запущен ранее. Грохает зависшие процессы. Запускать под root. Пытается определить где что лежит (понимает только стандартные конфигурации, иначе надо запускать из BASEDIR). Собирает опции из секций mysqld, server и safe_mysqld конфигурацинных файлов и командной строки (м.б. модифицированных опциями --no-defaults, --defaults-file=имя и --defaults-extra-file=имя). Передает их ("улучшив" некоторые из них) mysqld. Свои опции: - --err-log=имя
- --open-files=для-установки-ulimit-на-открытые-файлы
- --open-files-limit=
- --core-file-size=для-установки-ulimit-на-coresize
- --timezone=установить-TZ
Есть закоментированные проверки всех таблиц. Пользователь по умолчанию - mysql. Пытается запустить mysqld под "nice nohup". Вместо ключей запуска можно использовать конфигурационные файлы. - --ansi (бОльшая совместимость с ANSI SQL)
- --basedir=путь
- --bdb-lock-detect=[DEFAULT | OLDEST | RANDOM | YOUNGEST | число-секунд]
- --bdb-logdir=директория
- --bdb-no-sync
- --bdb-no-recover
- --bdb-shared-data (запускать Berkeley DB в режиме разделения с другими процессами)
- --bdb-tmpdir=директория
- --bind-address=IP-адрес (для хостов с несколькими адресами)
- --chroot=путь (умеет?!)
- --core-file
- --datadir=путь
- --default-character-set=кодировка (сменил кодировку - перестрой индексы)
- --default-table-type=метод-хранения [MyISAM]
- --defaults-extra-file=дополнительно-к-my.cnf
- --defaults-file=имя-файла-параметров (вместо my.cnf)
- --enable-locking (внешняя блокировка - если нужна блокировка нескольких серверов или myisamchk к одной базе данных; работает неустойчиво и медленно)
- --flush (сбрасывать буфера на диск после каждой SQL-команды
- --help (выдает список команд; настройки, выбранные при сборке с учетом текущих параметров и значения переменных)
- --init-file=имя-файла (при запуске читать команды из файла)
- --language (язык сообщений об ошибках)
- --log[=имя-файла] (записывать все соединения и команды в журнал)
- --log-bin[=имя-файла] (записывать журнал в новом двоичном формате для репликации)
- --log-bin-index=имя-файла (хранит имена последних бинарных журналов)
- --log-slow-queries[=имя-файла] (записывать все слишком медленные - занимающие более long_query_time секунд - команды в журнал)
- --log-update[=имя-файла] (записывать изменения в журнал)
- --log-long-format (дополнительную информацию в журнал изменений)
- --low-priority-updates (INSERT/DELETE/UPDATE будут иметь меньший приоритет, чем SELECT)
- --memlock (не свопировать mysqld)
- --myisam-recover[=опция...] (проверка корректности myisam таблиц и способ восстановления):
- DEFAULT
- BACKUP (делать резервную копию при исправлениях - .BAK)
- FORCE (исправлять даже если это приведет к потере многих данных)
- QUICK
- --new (использовать новые, т.е. недоотлаженные возможности)
- --no-defaults
- --port=TCP-порт
- -O имя=значение (установить переменную, список по --help)
- --safe-mode (уменьшить уровень оптимизации)
- --safe-show-database (не показывать имена БД пользователям, которые не имеют к ним никаких прав)(или нет такой опции? в списке ее нет, но не ругается)
- --secure (двойная проверка IP-адресов - есть ли такая опция? если ее указать, то не стартует. Или она теперь по умолчанию? Если нет, то именами хостов вообще нельзя пользоваться!)
- --skip-bdb
- --skip-delay-key-write (отключить буферизацию записи ключей)
- --skip-grant-tables (отключить проверку прав доступа)
- --skip-locking (не использовать внешнюю блокировку; safe_mysqld использует этот ключ; ключ применяется, если не нужна блокировка нескольких серверов или myisamchk к одной базе данных; все равно внешняя блокировка работает неустойчиво и медленно; команда LOCK работает даже с этим ключом)
- --skip-name-resolve (в таблицах прав доступа д.б. только IP)
- --skip-networking (не слушать TCP/IP, только через unix socket)
- --skip-new (не использовать новые, т.е. не доотлаженные возможности)
- --skip-show-database (не позволять команду SHOW DATABASE, если пользователь не имеет привилегии работы с процессами. В другом месте говорится, что вообще ничего не показывать - но это неправда)
- --skip-thread-priority (ускоряет ответ)
- --socket=путь
- --tmpdir=путь (вместо /tmp)
- --user=имя-пользователя (обязательно, если запускается из под root)
Опции берутся в следующем порядке (последующие затирают предыдущие): - переменные окружения
- /etc/my.cnf
- /usr/local/mysql/data/my.cnf (нельзя поменять с помощью --datadir)
- из файла, указанного ключом --defaults-extra-file
- ~/.my.cnf
- опции в командной строке
Действуют на mysql, mysqld, mysqladmin, mysqlimport, mysqldump, myisamchk, myisampack, mysql.server. Файл делится на секции. Секция начинается со строки, в которой указано имя секции в квадратных скобках. Имя секции соответствует имени программы на которую она действует. Любая длинная опция программы (начинающаяся с двух минусов, запустите программу с ключом --help) может быть использована здесь (минусы надо отбросить). Секция с именем client позволяет задать опции (например, пароль ;), общие для всех клиентских программ. Переменные устанавливаются строкой: set-variable = имя=значение. MySQL позволяет использовать для хранения данных различные типы таблиц (методы доступа). Меняется командой ALTER TABLE, описание хранится в файле .frm. - MyISAM (по умолчанию, см. --default-table-type). Индекс - .MYI, данные - .MYD. Восстановление - myisamchk. Бывают таблицы с записями фиксированной длины, переменной длины (BLOB, VARCHAR, TEXT) и сжатые (myisampack - только чтение). Машинонезависимый формат хранения (хотя формат плавающей точки должен совпадать на этих архитектурах).
- MERGE - виртуальное слияние таблиц одинакового формата (SELECT, UPDATE и DELETE). Список в файле .MRG.
- ISAM. Предлагается больше не использовать. Индекс - .ISI, данные - .ISD. Индексирование - B-tree. Восстановление - isamchk. Зависит не только от архитектуры, но и от ОС.
- HEAP - таблицы в памяти с хешированием. Записи только фиксированной длины.
- BDB (с поддержкой транзакций). Надежнее (автоматическое восстановление). Транзакции (BEGIN/COMMIT/ROLLBACK). Дольше, больше места на диске и в памяти.
- InnoDB - в состоянии alfa
Аутентификация пользователя производится по имени (до 16 символов), паролю (м.б. пустым) и хосту или его IP. Большинство клиентских программ по умолчанию используют mysql-имя, совпадающее с unix-именем, но это можно изменить с помощью ключа --user=. Пароль можно задать: - прямо в командной строке после ключа -p (без пробела, очень опасно)
- указав ключ -p без пароля (программа запросит пароль с клавиатуры, наиболее безопасно)
- в файле .my.cnf (права к этому файлу должны быть только у собственника), секция [client], поля host, user и password
- с помощью переменной окружения MYSQL_PWD (очень опасно) и MYSQL_HOST
Вся информация о правах хранится в БД с именем mysql. Никто не должен иметь к ней доступа на чтение (см. про пароли). Используются таблицы: - user (используется чтобы понять - пускать/не пускать; данные здесь права действуют на все БД; административные привилегии и операции с файлами определяются только здесь)
- Host: CHAR(60),PRI, нечувствителен к регистру. Может содержать имя хоста, IP адрес или localhost. Можно использовать шаблоны с символами '%' (любое количество любых символов) и '_' (любой символ). Пустое поле означает, что производится логическое "И" привилегий в данной строке и привилегий в соответствующей строке таблицы host. При использовании IP-адреса можно задавать сетевую маску (в виде - /255.255.255.0 или /24).
- User: CHAR(16),PRI. Пустое поле соответствует любому имени, в данном случае пользователь рассматривается как анонимный и предоставленное им имя заменяется на пустое для дальнейших проверок прав доступа.
- Password: CHAR(16), зашифрован, но не так как в Unix, знание даже зашифрованного пароля позволяет выдать себя за данного пользователя - пароль шифруется на стороне клиента! Может быть пустым - пользователь также должен предъявить пустой пароль.
- привилегии: enum('N','Y'), по умолчанию - 'N'
- select - выборка из строк таблицы
- insert - вставка строки в таблицу
- update - изменение строки таблицы
- delete - удаление строки таблицы
- create - создавать БД/таблицу
- drop - удалять БД/таблицу
- reload - позволяет выполнять административные команды (reload, refresh, flush-*)
- shutdown - позволяет остановить mysqld
- process - позволяет выполнить processlist (можно смотреть текст команд, выполняемых другими пользователями (в т.ч. SET PASSWORD)), kill
- file - читать файлы (LOAD DATA INFILE) и писать файлы (SELECT ... INTO OUTFILE), с точки зрения Unix используются права, с которыми запущен mysqld (в частности, он может прочитать /etc/passwd, любую БД и т.п., записать файл в /tmp и т.п., но не может переписать уже существующий файл)
- grant - передавать свои привилегии другим, два пользователя с различными привилегиями могут объединить их ;)
- references - не реализовано
- index - создавать/удалять индексы таблицы
- alter - изменять формат таблицы, в том числе переименовать ее, что позволяет обмануть систему прав доступа
- host
- Host: CHAR(60),PRI. '%' или пустое поле означает - любой хост.
- DB: CHAR(64),PRI. '%' или пустое поле означает - любая БД.
- привилегии: enum('N','Y'), по умолчанию - 'N'
- select
- insert
- update
- delete
- create
- drop
- grant
- references
- index
- alter
- db
- Host: CHAR(60),PRI. Строка '%' означает - при доступе с любого хоста. Пустое поле означает необходимость посмотреть в таблицу host.
- DB: CHAR(64),PRI. '%' или пустое поле означает - любая БД.
- User: CHAR(16),PRI. Пустое поле - анонимный пользователь.
- привилегии: enum('N','Y'), по умолчанию - 'N'
- select
- insert
- update
- delete
- create
- drop
- grant
- references
- index
- alter
- tables_priv
- Host: CHAR(60),PRI. '%' или пустое поле означает - любой хост.
- DB: CHAR(60),PRI. Не м.б. пустым или содержать шаблоны.
- User: CHAR(16),PRI. Пустое поле - анонимный пользователь.
- Table_name: CHAR(60)(или 64?),PRI. Не м.б. пустым или содержать шаблоны.
- Grantor: CHAR(77)
- Timestamp: timestamp(14)
- Table_priv: set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter')
- Column_priv: set('Select','Insert','Update','References')
- culumns_priv
- Host: CHAR(60),PRI. '%' или пустое поле означает - любой хост.
- DB: CHAR(60),PRI. Не м.б. пустым или содержать шаблоны.
- User: CHAR(16),PRI. Пустое поле - анонимный пользователь.
- Table_name: CHAR(64)(или 60?),PRI. Не м.б. пустым или содержать шаблоны.
- Column_name: CHAR(64)(или 60?),PRI. Не м.б. пустым или содержать шаблоны.
- Timestamp: timestamp(14)
- Column_priv: set('Select','Insert','Update','References')
Проверка права на подсоединение к серверу: mysql-клиент предъявляет имя пользователя, сервер определяет имя (или IP) хоста клиента (или localhost для обращения через unix-socket). По данной паре (адрес/имя) ищется строка в таблице user. Предварительно таблица сортируется по полям (Host/User) так, что наиболее специфичные строки оказываются первыми, наименее специфичные - последними. Если строка не найдена, то соединение отвергается. Если - найдена, то сверяется пароль. Проверка прав при исполнении каждого запроса: таблица db сортируется по полям Host, Db и User, таблица host по полям Host и Db, таблицы tables_priv и columns_priv по полям Host, Db и User от наиболее специфичного к наименее. Для административных запросов и доступа к файлам проверяется только таблица user. Для прочих запросов в начале проверяется таблица user - а нет ли у данного пользователя прав доступа на "глобальном" уровне. Если есть - операция разрешается. Если нет, то проверяются права доступа к конкретной БД с конкретного хоста (по пересечению таблиц Db и Host с учетом шаблонов и пустых полей). Если их достаточно, то доступ дается. Если недостаточно, то к объединению "глобальных" прав и прав БД/хост добавляются права, извлеченные из таблиц tables_priv и columns_priv. Если и этого не хватает, то увы... Права доступа читаются mysqld (и не читаются при "ручном" изменении БД mysql): - при запуске
- при выполнении команд GRANT, REVOKE и SET PASSWORD
- при выполнении команды FLUSH PRIVILEGES
- при выполнении mysqladmin flush-privileges/reload
"Глобальные" привилегии и изменения пароля вступают в силу только при следующем соединении. Изменения в доступе к БД - при следующей команде use. Изменения в доступе к таблицам и колонкам - при следующем запросе. Все команды, введенные в клиенте mysql (а в других?) попадают в .mysql_history (того unix-пользователя, который запускал mysql). А также в различные журналы сервера и в выдачу команды SHOW PROCESSLIST. Изменение пароля: set password for имя=password('новый пароль'). GRANT тип-привилегии [(список-столбцов)] [, тип-привилегии [(список-столбцов)] ...] ON { имя-таблицы | * | *.* | имя-БД.* } TO имя-пользователя [ IDENTIFIED BY 'пароль' ] [, имя-пользователя [ IDENTIFIED BY 'пароль ] ... ] WITH GRANT OPTION REVOKE тип-привилегии [(список-столбцов)] [, тип-привилегии [(список-столбцов)] ...] ON { имя-таблицы | * | *.* | имя-БД.* } FROM имя-пользователя [, имя-пользователя ... ] Типы привилегий: - ALL PRIVILEGES (aka ALL)
- ALTER
- CREATE
- DELETE
- DROP
- FILE
- GRANT OPTION (только для REVOKE)
- INDEX
- INSERT
- PROCESS
- REFERENCES (не реализовано)
- RELOAD
- SELECT
- SHUTDOWN
- UPDATE
- USAGE (никаких - просто место застолбить)
Для столбцов можно задавать только INSERT, SELECT и UPDATE. Для таблиц - INSERT, SELECT, UPDATE, CREATE, DROP, DELETE, GRANT, INDEX, ALTER. Использование "*.*" означает задание глобальных привилегий. Использование "*" означает задание привилегий для текущей БД (если текущей БД нет, то глобальные). SHOW GRANTS FOR имя@хост; Если привилегии на уровне таблиц и колонок используются хотя бы для одного пользователя, то проверки делаются для всех запросов всех пользователей, что очень сильно замедляет работу. Для упрощения жизни можно использовать утилиты mysqladmin и mysqlaccess, xmysqladmin, mysql_webadmin из директории Contrib. Посмотрев на это безобразие, ORACLE может перестать волноваться ;) Зря они различают пользователей с одним именем, пришедших с разных хостов (наверное, когда-то mysql-имя совпадало с unix-именем и этой информации м.б. доверять :). Не говоря об отсутствии шифровки при передаче данных по сети и возможность подсовывать перехваченный зашифрованный пароль Не храните пароли и тому подобную информацию в БД в открытом виде. Константы - строка (в апострофах или кавычках, обратная косая черта как escape-символ)
- целое число (64 бита)
- вещественное число
- шестнадцатеричное число: в численном контексте как целое (64-бит), в строковом контексте пара 16-ричных цифр преобрацуется в символ
- NULL (N при экспорте/импорте)
Имена - БД (имя файла до 64 символов, кроме '/' и точки, в некоторых случаях до 60 символов)
- таблица (имя файла до 64 символов, кроме '/' и '.')
- колонка (до 64 любых символов). Можно ссылаться:
- col_name
- tbl_name.col_name
- db_name.tbl_name.col_name
- алиас (до 255 любых символов)
Если в имени есть спецсимволы или оно совпадает с зарегистрированным словом, то его надо заключать в апострофы. Нельзя использовать символы 0x00 или 0xFF (привет маленькому "я" в cp1251!), апостроф и кавычку. Имена БД и таблиц чувствительны к регистру в Unix и нечувствительны в MS Windows. Имена колонок нечувствительны везде. Алиасы на таблицы чувствительны везде, алиасы на колонки нечувствительны везде. Переменные Имя переменной начинается с '@', может содержать буквы, цифры, '_', '$', '.'. Первоначальное значение - NULL. Может содержать целое (64 бита), вещественное или строку. Можно использовать в тех местах, где разрешается использование выражений (не числовых констант как во фразе LIMIT!). Действует на текущую нить (thread). Установка: - SET @имя=выражение
- @имя:=выражение внутри выражения
Комментарии - как в C (начиная с '/*' до '*/'); если после '/*' стоит восклицательный знак и номер версии, то содержимое комментария исполняется, если номер версии равен или больше указанного
- как в sh (начиная с '#' до конца строки)
- как в SQL :) (начиная с '-- ' до конца строки, не забудьте про пробел!)
M - ширина поля при отображении (максимально - 255). D - число знаков в дробной части (не более M-2 и 30). - Числовые (если число занимает меньше M позиций, то оно дополняется слева пробелами или нулями для ZEROFILL. Если число занимает более M колонок, то выводятся все цифры. Если используется ZEROFILL для целых, то автоматически добавляется UNSIGNED). Все вычисления проводятся с точностью 63 бита или переводом в DOUBLE (кроме нескольких функций).
- TINYINT[(M)] [UNSIGNED[ [ZEROFILL] (1 байт)
- SMALLINT[(M)] [UNSIGNED[ [ZEROFILL] (2 байта)
- MEDIUMINT[(M)] [UNSIGNED[ [ZEROFILL] (3 байта)
- INT[(M)] [UNSIGNED[ [ZEROFILL] (4 байта)
- INTEGER[(M)] [UNSIGNED] [ZEROFILL] (4 байта)
- BIGINT[(M)] [UNSIGNED] [ZEROFILL] (8 байт)
- FLOAT[(M,D)] [ZEROFILL] (4 байта)
- DOUBLE [PRECISION][(M,D)] [ZEROFILL]
- REAL[(M,D)] [ZEROFILL] (синоним DOUBLE)
- DECIMAL[(M[,D])] [ZEROFILL] (неупакованное десятичное вещественное число)
- DEC - синоним DECIMAL
- NUMERIC[(M[,D])] [ZEROFILL] (синоним DECIMAL)
- Дата и время (проверка значений не очень тщательная, например, дата 1999-11-31 будет воспринята нормально; допусимы номер дня, равный нулю, и номера месяца И дня равные нулю; неверное значение преобразуется в "нулевое" - 0000-00-00 и т.д.; заносить можно как строки с разделителями полей - любыми -, так и без разделителей или числа)
- DATE (дата от '1000-01-01' до '9999-12-31'; 3 байта)
- DATETIME (время от '1000-01-01 00:00:00' до '9999-12-31 23:59:59'; 8 байт)
- TIMESTAMP[(M)] (время от 19700101000000 до 2037 года; 4 байта; если при INSERT или UPDATE (должны быть реальные изменения) значение опущено (только первая колонка этого типа) или равно NULL или NOW(), то заносится текущее время; формат выдачи зависит от M (хранится всегда все; задавать надо тоже все):
- 14 (по умолчанию) - YYYYMMDDHHMMSS
- 12 - YYMMDDHHMMSS
- 8 - YYYYMMDD
- 6 - YYMMDD
- TIME (время от -838:59:59 до 838:59:59; выводится как HH:MM:SS; 3 байта; можно вводить как 'D HH:MM:SS.fraction', хотя доли пока не хранятся)
- YEAR[(2|_4_)] (от 1901 до 2155 или от 1970 до 2069; 1 байт)
- Строки (в MySQL CHAR всегда NATIONAL; надо учитывать, что максимальная длина строки таблицы и пакета протокола клиент/сервер - 16 МБ - и надо увеличить размер каких-то буферов как сервера, так и клиента; VARCHAR, BLOB и TEXT - строки переменной длины; BINARY - навязчивый атрибут, т.е. если операнд выражения - BINARY, то все выражение - BINARY; TEXT - это BLOB, который сортируется и сравнивается в нечувствительной к регистру манере; TEXT можно рассматривать как VARCHAR нужного размера, а BLOB можно рассматривать как VARCHAR BINARY нужного размера, но хвостовые пробелы не удаляются и не м.б. значения по умолчанию; для CHAR и VARCHAR можно индексировать префикс колонки; для BLOB и TEXT обязательно индексировать префикс фиксированной длины; для VARCHAR и TEXT можно создавать индекс специального вида FULLTEXT для индексирования всей колонки; ORDER BY и GROUP BY работают только с объектами фиксированной длины или первыми max_sort_length байтами)
- [NATIONAL] CHAR(M) [BINARY] (фиксированной длины от 1 до 255; дополняется справа пробелами; при извлечении правые пробелы удаляются; сортируются и сравниваются нечувствительно к регистру относительно набора символов по умолчанию, если не указано BINARY; CHAR(0) занимает 1 бит и может принимать два значения - NULL и "")
- NCHAR - синоним NATIONAL CHAR
- CHARACTER - синоним CHAR
- [NATIONAL] VARCHAR(M) [BINARY] (строка переменной длины от 1 до 255; правые пробелы удаляются при сохранении; сортируются и сравниваются нечувствительно к регистру относительно набора символов по умолчанию, если не указано BINARY)
- CHARACTER VARYING - синоним VARCHAR
- TINYBLOB (BLOB макс. длины 255)
- TINYTEXT (TEXT макс. длины 255)
- BLOB (BLOB макс. длины 65535)
- TEXT (TEXT макс. длины 65535)
- MEDIUMBLOB (BLOB макс. длины 2^24-1)
- MEDIUMTEXT (TEXT макс. длины 2^24-1)
- LONGBLOB (BLOB макс. длины 2^32-1, в действительности строка таблицы ограничена 16МБ)
- LONGTEXT (TEXT макс. длины 2^32-1)
- ENUM('строка1','строка2',...) (может принимать значение из списка, NULL или "" - как признак ошибки при вставке; не более 65535 различных значений; 1 или 2 байта; если описан как NULL, то по умолчанию вставляется NULL; если описан как NOT NULL, то по умолчанию вставляется первая строка из списка; каждая строка имеет индекс, начиная с 1; индекс "" равен 0; индекс NULL равен NULL; в числовом контексте извлекается индекс, а не строка (как при вставке, так и при извлечении); сортировка производится по индексу; регистр букв не влияет при вставке, но извлекается в том виде, в каком колонка описывалась)
- SET('строка1','строка2',...) (может одновременно принимать от 0 до 64 значений из списка; элемент списка не может содержать запятую; 1, 2, 3, 4 или 8 байт;если значение SET извлекается/устанавливается в числовом контексте, то в числе каждому установленому биту соответствует элемент множества (первый элемент в описании множества соответствует младшему биту); сортируются как числа)
- операции над базами данных
- CREATE DATABASE [IF NOT EXISTS] db_name
- DROP DATABASE [IF EXISTS] db_name
- операции над таблицами
- обслуживание таблиц
- OPTIMIZE TABLE имя-таблицы [, имя-таблицы,...]
полезно после больших удалений или изменений таблиц с переменной длиной строки: сортировка индексов и дефрагментация - CHECK TABLE имя-таблицы [, имя-таблицы,...] {QUICK | FAST | MEDIUM | EXTEND | CHANGED}
- BACKUP TABLE имя-таблицы [, имя-таблицы,...] TO 'имя-директории'
- RESTORE TABLE имя-таблицы [, имя-таблицы,...] FROM 'имя-директории'
- ANALYZE TABLE имя-таблицы [, имя-таблицы,...]
пересчет распределения ключей - REPAIR TABLE имя-таблицы [, имя-таблицы,...] [QUICK] [EXTENDED]
- операции над строками
- DELETE [LOW_PRIORITY] FROM имя-таблицы [WHERE выражение] [LIMIT макс-число-строк]
место не освобождается - используйте OPTIMIZE - TRUNCATE TABLE имя-таблицы
удаляет таблицу и тут же создает заново - SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [HIGH_PRIORITY] [DISTINCT | DISTINCTROW | ALL]
выражение [AS имя-алиаса],... [INTO {OUTFILE | DUMPFILE} 'имя-файла' опции-экспорта [FROM из-каких-таблиц [WHERE выражение] [GROUP BY {номер-колонки | имя-колонки | формула} [ASC | DESC], ...] [HAVING выражение] [ORDER BY {номер-колонки | имя-колонки | формула} [ASC | DESC], ...] [LIMIT [смещение-от-0,] макс-число-строк] [PROCEDURE имя-процедуры] [FOR UPDATE | LOCK IN SHARE MODE]] FROM - простейший случай синтаксиса - имя-таблицы, если таблиц несколько, то смотри синтаксис JOIN (в простейшем случае имена перечисляются через запятую); также можно задавать алиас таблицы с помощью слова AS HAVING применяется последним (в частности, после GROUP BY) непосредственно перед посылкой результата клиенту (т.е. без оптимизации!) DUMPFILE: в файл записывается одна строка безо всяких разделителей полей и строк и escape (позволяет, например, сбросить картинку из BLOB) OUTFILE и DUMPFILE: необходимо иметь привилегии file, если файл с указанным именем существовал, то он не затирается; права к файлу устанавливаются на чтение для всех FOR UPDATE: если тип таблицы позволяет блокировку страницы/строки (InnoDB, GEMINI), то задействованные строки блокируются на запись - синтаксис JOIN (только не надо вопросов ко мне, задавайте их этим фантазерам :)
- таблица::= имя-таблицы [[AS] алиас] [USE INDEX (список-ключей)] [IGNORE INDEX (список-ключей)]
- таблица, таблица
это синоним INNER JOIN - таблица [CROSS] JOIN таблица
- таблица INNER JOIN таблица {ON условное-выражение | USING (список-колонок)}
- таблица STRAIGHT_JOIN таблица
- таблица LEFT [OUTER] JOIN [ON условное-выражение | USING (список-колонок)]
- таблица NATURAL [LEFT [OUTER]] JOIN таблица
- таблица LEFT OUTER JOIN таблица ON условное-выражение
- таблица RIGHT [OUTER] JOIN [ON условное-выражение | USING (список-колонок)]
- таблица NATURAL [RIGHT [OUTER]] JOIN таблица
- INSERT
- LOAD FILE
Между именем функции и скобкой не должно быть пробела. Операндами могут быть константы, имена колонок и переменные. - группировка функций с помощью круглых скобок
- арифметические операции: +, -, *, /
- битовые функции: |, &, <<, >>, ~, BIT_COUNT()
- логические функции: !, ||, && (возвращают 1, 0, или NULL)
- сравнение:
- =, <>, !=, <=, <, >=, >
- <=> (сравнение, позволяющее сравнивать NULL)
- expr IS NULL, expr IS NOT NULL
- expr BETWEEN min AND max
- expr IN (значение1,...)
- expr NOT IN (значение1,...)
- ISNULL()
- COALESCE(список) - возвращает первый ненулевой элемент списка
- INTERVAL(N,N1,N2,N3,...) - возвращает номер интервала, т.е. 1, если N < N1; 2 если N < N2 и т.д.
- сравнение строк (если выражение чувствительно к регистру, то и сравнение будет чувствительным к регистру)
- expr LIKE шаблон [ESCAPE 'escape-символ'] (соответствие простому регулярному выражению SQL; "%" - любое количество любых символов; "_" - ровно один символ; escape-символ по умолчанию - ""; чтобы найти ' ' надо задать в шаблоне ' '; чтобы найти '' - '\')
- expr NOT LIKE шаблон [ESCA
|