Содержание
SELECT и WHERESELECTHANDLERINSERTINSERT DELAYEDUPDATEDELETETRUNCATEREPLACELOAD DATA INFILEDOCREATE, DROP, ALTERCREATE DATABASEDROP DATABASECREATE TABLEALTER TABLERENAME TABLEDROP TABLECREATE INDEXDROP INDEXMySQL имеет очень сложный, но интуитивно понятный и легкий в изучении интерфейс, основанный на SQL (структурированный язык запросов). В данном разделе описываются различные команды, типы данных и функции этого языка, которые необходимо знать, чтобы использовать MySQL рационально и эффективно. Данная глава служит также справочником по всем функциональным возможностям, реализованным в MySQL. Читатель найдет в этой главе ссылки на различные источники информации, которые, возможно, будут полезными для ее эффективного использования.
В этом разделе описываются различные способы представления строк и чисел в MySQL. Здесь затронуты также различные нюансы и особенности, с которыми могут столкнуться программисты при работе с этими базовыми типами данных в MySQL.
Строка представляет собой
последовательность символов,
заключенных либо в одинарные
кавычки (‘'’) -
апострофы, либо в двойные кавычки
(‘"’). При
использовании диалекта ANSI SQL
допустимы только одинарные
кавычки. Например:
'a string' "another string"
Внутри строки некоторые
последовательности символов
имеют специальное назначение.
Каждая из этих
последовательностей начинается
обратным слешем
(‘\’), известным
как escape-символ или символ
перехода. MySQL распознает
следующие
escape-последовательности:
\0
Символ 0 (NUL) в ASCII коде.
\'
Символ одиночной кавычки
(‘'’).
\"
Символ двойной кавычки
(‘"’).
\b
Возврат на один символ.
\n
Символ новой строки (перевода строки).
\r
Символ перевода каретки.
\t
Символ табуляции.
\z
Символ (Control-Z) таблицы ASCII(26).
Данный символ можно
закодировать, чтобы обойти
проблему, заключающуюся в том,
что под Windows ASCII(26) означает
конец файла (проблемы возникают
при использовании ASCII(26) в
выражении mysql database <
filename).
\\
Символ обратного слеша.
\%
Символ процентов
‘%’.
Используется для поиска копий
литерала ‘%’ в
контекстах, где выражение
‘%’ в противном
случае интерпретировалось бы
как групповой символ (see
Раздел 6.3.2.1, «Функции сравнения строк»).
\'_'
Символ подчеркивания
‘_’.
Используется для поиска копий
литерала ‘_’ в
контекстах, где выражение
‘_’ в противном
случае интерпретировалось бы
как групповой символ (see
Раздел 6.3.2.1, «Функции сравнения строк»).
Обратите внимание на то, что при
использовании '\%' или
'\_' в контекстах
некоторых строк будут
возвращаться значения строк
'\%' и '\_', а не
‘%’ и
‘_’.
Существует несколько способов включить кавычки в строку:
Одиночная кавычка (апостроф)
‘'’ внутри
строки, заключенной в кавычки
‘'’, может быть
записана как ''''.
Двойная кавычка
‘"’ внутри
строки, заключенной в двойные
кавычки ‘"’,
может быть записана как
'""'.
Можно предварить символ
кавычки символом экранирования
(‘\’).
Для символа ‘'’
внутри строки, заключенной в
двойные кавычки, не требуется
специальной обработки; его
также не требуется дублировать
или предварять обратным слешем.
Точно так же не требует
специальной обработки двойная
кавычка ‘"’
внутри строки, заключенной в
одиночные кавычки
‘'’.
Ниже показаны возможные варианты применения кавычек и escape-символа на примерах выполнения команды SELECT:
mysql>SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';+-------+---------+-----------+--------+--------+ | hello | "hello" | ""hello"" | hel'lo | 'hello | +-------+---------+-----------+--------+--------+ mysql>SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";+-------+---------+-----------+--------+--------+ | hello | 'hello' | ''hello'' | hel"lo | "hello | +-------+---------+-----------+--------+--------+ mysql>SELECT "This\nIs\nFour\nlines";+--------------------+ | This Is Four lines | +--------------------+
Если необходимо вставить в строку
двоичные данные (такие как
BLOB), следующие символы
должны быть представлены как
escape-последовательности:
NUL
ASCII 0. Необходимо представлять в
виде '\0' (обратный
слеш и символ ASCII
‘0’).
\
ASCII 92, обратный слеш.
Представляется как
'\\'.
'
ASCII 39, единичная кавычка.
Представляется как
'\''.
"
ASCII 34, двойная кавычка.
Представляется как
'\"'.
При написании программы на языке C
для добавления символов
экранирования в команде
INSERT можно использовать
функцию mysql_real_escape_string()
из C API (see Раздел 8.4.2, «Обзор функций интерфейса C»).
При программировании на Perl можно
использовать метод quote
из пакета DBI для превращения
специальных символов в
соответствующие
escape-последовательности (see
Раздел 8.2.2, «Интерфейс DBI»).
Не следует забывать, что указанное свойство escape-символа должно использоваться во всех строках, которые могут содержать любые специальные символы, перечисленные выше.
В качестве альтернативы многие интерфейсы прикладного программирования (API) для MySQL предоставляют определенную возможность использования символов-заменителей, что позволяет вносить специальные маркеры в строку запроса и затем связывать с ними значения данных при выдаче результатов запроса.
Целые числа представляются в виде
последовательности цифр. Для
чисел с плавающей точкой в
качестве разделителя десятичных
знаков используется символ
‘.’. Числа обоих
типов могут предваряться
символом ‘-’,
обозначающим отрицательную
величину.
Примеры допустимых целых чисел:
1221 0 -32
Примеры допустимых чисел с плавающей запятой:
294.42 -32032.6809e+10 148.00
Целое число можно использовать в контексте дробных чисел, при этом оно будет интерпретироваться как эквивалент числа с плавающей запятой.
MySQL поддерживает шестнадцатеричные величины. В числовом контексте такое число обладает всеми свойствами целого числа с 64-разрядной точностью. В строковом контексте шестнадцатеричная величина представляет собой двоичную строку, в которой каждая пара шестнадцатеричных разрядов конвертируется в символ:
mysql>SELECT x'4D7953514C';-> MySQL mysql>SELECT 0xa+0;-> 10 mysql>SELECT 0x5061756c;-> Paul
Синтаксис выражений вида
x'hexstring' (новшество в
версии 4.0) базируется на ANSI SQL, а
для обозначений вида 0x
используется синтаксис ODBC.
Шестнадцатеричные строки часто
применяются в ODBC для
представления двоичных типов
данных вида BLOB. Для
конвертирования строки или числа
в шестнадцатеричный вид можно
применять функцию HEX().
Значение NULL означает
``отсутствие данных''. Они является
отличным от значения 0 для
числовых типов данных или пустой
строки для строковых типов (see
Раздел A.5.3, «Проблемы со значением NULL»).
При использовании форматов
импорта или экспорта текстовых
файлов (LOAD DATA INFILE, SELECT ... INTO
OUTFILE) NULL можно
представить как \N (see
Раздел 6.4.9, «Синтаксис оператора LOAD DATA INFILE»).
Для всех имен баз данных, таблиц, столбцов, индексов и псевдонимов в MySQL приняты одни и те же правила.
Следует отметить, что эти правила
были изменены, начиная с версии MySQL
3.23.6, когда было разрешено брать в
одиночные скобки
‘`’ идентификаторы
(имена баз данных, таблиц и
столбцов). Двойные скобки
‘"’ тоже допустимы -
при работе в режиме ANSI SQL (see
Раздел 1.9.2, «Запуск MySQL в режиме ANSI»).
| Идентификатор | Максимальная длина строки | Допускаемые символы |
| База данных | 64 | Любой символ, допустимый в имени
каталога, за исключением
‘/’,
‘\’ или
‘.’ |
| Таблица | 64 | Любой символ, допустимый в имени файла,
за исключением
‘/’ или
‘.’ |
| Столбец | 64 | Все символы |
| Псевдоним | 255 | Все символы |
Необходимо также учитывать, что не
следует использовать символы
ASCII(0), ASCII(255)
или кавычки в самом
идентификаторе.
Кроме того, если имя
идентификатора относится к
служебным словам или содержит
специальные символы, необходимо
всегда заключать его в обратные
кавычки ` при
использовании в выражениях:
mysql> SELECT * FROM `select` WHERE `select`.id > 100;
See Раздел 6.1.7, «``Придирчив'' ли MySQL к зарезервированным словам?».
В предыдущих версиях MySQL (до 3.23.6) для имен существовали следующие правила:
Имя может состоять из
буквенно-цифровых символов
установленного в данное время
алфавита и символов
‘_’ and
‘$’. Тип
кодировки по умолчанию - ISO-8859-1
Latin1, он может быть изменен
указанием иного типа в аргументе
параметра --default-character-set
mysqld (see
Раздел 4.6.1, «Набор символов, применяющийся для записи данных и сортировки»).
Имя может начинаться с любого допустимого символа, в частности, с цифры (в этом состоит отличие от правил, принятых во многих других базах данных). Однако имя не может состоять только из цифр.
Не допускается использование в
именах символа
‘.’, так как он
применяется для расширения
формата имени (посредством чего
можно ссылаться на столбцы - см. в
этом же разделе ниже).
Не рекомендуется использовать
имена, подобные 1e, так
как выражение вида 1e+1
является неоднозначным. Оно может
интерпретироваться и как
выражение 1e + 1, и как
число 1e+1.
В MySQL разрешается делать ссылки на столбец, используя любую из следующих форм:
| Ссылка на столбец | Значение |
col_name | Столбец col_name из любой
используемой в запросе
таблицы содержит столбец с
данным именем. |
tbl_name.col_name | Столбец col_name из таблицы
tbl_name текущей базы
данных. |
db_name.tbl_name.col_name | Столбец col_name из таблицы
tbl_name базы данных
db_name. Эта форма
доступна в версии MySQL 3.22 или
более поздних. |
`column_name` | Имя столбца является ключевым словом или содержит специальные символы. |
Нет необходимости указывать
префикс tbl_name или
db_name.tbl_name в ссылке на
столбец в каком-либо утверждении,
если эта ссылка не будет
неоднозначной. Например,
предположим, что каждая из таблиц
t1 и t2 содержит
столбец c, по которому
производится выборка командой
SELECT, использующей обе
таблицы - и t1, и
t2. В этом случае имя
столбца c является
неоднозначным, так как оно не
уникально для таблиц, указанных в
команде, поэтому необходимо
уточнить, какая именно таблица
имеется в виду, конкретизировав -
t1.c или t2.c.
Аналогично, при выборке данных из
таблицы t в базе данных
db1 и из таблицы
t в базе данных
db2 необходимо ссылаться
на столбцы в этих таблицах как на
db1.t.col_name и
db2.t.col_name.
Выражение .tbl_name означает
таблицу tbl_name в текущей
базе данных. Данный синтаксис
принят для совместимости с ODBC, так
как некоторые программы ODBC ставят
в начале имен таблиц в качестве
префикса символ
‘.’.
В MySQL имена баз данных и таблиц соответствуют директориям и файлам внутри директорий. Следовательно, чувствительность к регистру операционной системы, под которой работает MySQL, определяет чувствительность к регистру имен баз данных и таблиц. Это означает, что имена баз данных и таблиц нечувствительны к регистру под Windows, а под большинством версий Unix проявляют чувствительность к регистру. Одно большое исключение здесь это Mac OS X, когда файловая система по умолчанию HFS+ используется. Однако Mac OS X также поддерживает тома UFS, которые чувствительны к регистру под Mac OS X также как и на Unix. See Раздел 1.9.3, «Расширения MySQL к ANSI SQL92».
Примечание: хотя имена баз данных и
таблиц нечувствительны к регистру
под Windows, не следует ссылаться на
конкретную базу данных или
таблицу, используя различные
регистры символов внутри одного и
того же запроса. Приведенный ниже
запрос не будет выполнен,
поскольку в нем одна и та же
таблица указана и как
my_table, и как
MY_TABLE:
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
Имена и псевдонимы столбцов нечувствительны к регистру во всех случаях.
Псевдонимы таблиц обладают
чувствительностью к регистру.
Приведенный ниже запрос не будет
выполнен, поскольку он ссылается
на псевдоним и как на a, и
как на A:
mysql>SELECT col_name FROM tbl_name AS a->WHERE a.col_name = 1 OR A.col_name = 2;
Если вы не хотите держать в памяти размер букв для имен базы данных и таблиц, при создании базы данных и таблиц придерживайтесь последовательного принципа, используя для имен только строчные буквы.
Одним из путей устранения этой
проблемы является запуск демона
mysqld с параметром -O
lower_case_table_names=1. По умолчанию
этот параметр имеет значение 1 для
Windows и 0 для Unix.
Если значение параметра
lower_case_table_names равно 1, MySQL
при сохранении и поиске будет
преобразовывать все имена таблиц к
нижнему регистру. С версии 4.0.2 это
также касается и имен баз данных.
Обратите внимание на то, что при
изменении этого параметра перед
запуском mysqld необходимо
прежде всего преобразовать имена
всех старых таблиц к нижнему
регистру.
При переносе MyISAM-файлов
с Windows на диск в Unix в некоторых
случаях будет полезна утилита
mysql_fix_extensions для
приведения в соответствие
регистров расширений файлов в
каждой указанной директории базы
данных (нижний регистр
.frm, верхний регистр
.MYI и .MYD).
Утилиту mysql_fix_extensions
можно найти в подкаталоге
scripts.
Для конкретного процесса
пользователь может определить
локальные переменные, которые в MySQL
обозначаются как
@variablename. Имя локальной
переменной может состоять из
буквенно-цифровых символов
установленного в данное время
алфавита и символов
‘_’,
‘$’, and
‘.’. Тип кодировки
по умолчанию - ISO-8859-1 Latin1, он может
быть изменен указанием иного типа
в аргументе параметра
--default-character-set
mysqld (see
Раздел 4.6.1, «Набор символов, применяющийся для записи данных и сортировки»).
Локальные переменные не требуют
инициализации. Они содержат
значение NULL по
умолчанию; в них могут храниться
целые числа, вещественные числа
или строковые величины. При
запуске конкретного процесса все
объявленные в нем локальные
переменные автоматически
активизируются.
Локальную переменную можно
объявить, используя синтаксис
команды SET:
SET @variable= { integer expression | real expression | string expression }
[,@variable= ...].
Можно также определить значение
переменной иным способом, без
команды SET. Однако в этом
случае в качестве оператора
присвоения более предпочтительно
использовать оператор
':=', чем оператор
‘=’, так как
последний зарезервирован для
сравнения выражений, не связанных
с установкой переменных:
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 |
+----------------------+------+------+------+
| 5 | 5 | 1 | 4 |
+----------------------+------+------+------+
Введенные пользователем
переменные могут применяться
только в составе выражений и там,
где выражения допустимы. Заметим,
что в область их применения в
данное время не включается
контекст, в котором явно требуется
число, например, условие
LIMIT в команде
SELECT или выражение
IGNORE number LINES в команде
LOAD DATA.
Примечание: в команде
SELECT каждое выражение
оценивается только при
отправлении клиенту. Это означает,
что в условиях HAVING,
GROUP BY, or ORDER BY не
следует ссылаться на выражение,
содержащее переменные, которые
введены в части SELECT этой
команды. Например, следующая
команда НЕ будет выполняться так,
как ожидалось:
mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM table_name HAVING b=5;
Причина в том, что переменная
@aa не будет содержать
значения текущей строки, в то время
как значение id в
предыдущем выражении является
строкой.
Действует правило никогда не
создавать и не
использовать одну и ту же
переменную в одном и том же
выражении SQL.
Начиная с MySQL 4.0.3 мы предоставляем лучший доступ к большинству системных переменных и переменных, относящихся к соединению. Можно менять теперь большую часть переменных без необходимости останавливать сервер.
Есть два типа системных переменных: специфичные для потока (или для соединения; мы их в дальнейшем называем потоковыми переменными для краткости), которые уникальны для данного соединения и глобальные перемененные, которые предназначаются для управления глобальными событиями. Глобальные переменные также используются для того, чтобы установить значения по умолчанию для соответствующих потоковых переменных для новых соединений.
Когда mysqld запускается,
все глобальные переменные
инициализируются из командной
строки и файлов опций. Вы можете
изменять значения с помощью SET
GLOBAL. Когда новый поток
создается, потоковые переменные
инициализируются из глобальных и
они не меняются даже если вы даете
новую команду SET GLOBAL.
Для установки глобальной
переменной, используйте один из
таких синтаксисов: (Здесь
используется sort_buffer_size в
качестве примера)
SET GLOBAL sort_buffer_size=value; SET @@global.sort_buffer_size=value;
Чтобы установить значение для потоковой переменной, используйте такие синтаксисы:
SET SESSION sort_buffer_size=value; SET @@session.sort_buffer_size=value; SET sort_buffer_size=value;
Если вы не указываете режим, то
тогда подразумевается
SESSION. See Раздел 5.5.6, «Синтаксис команды SET».
LOCAL - синоним для
SESSION.
Для получения значения глобальной переменной используйте одну из этих команд:
SELECT @@global.sort_buffer_size; SHOW GLOBAL VARIABLES like 'sort_buffer_size';
Для получения значения потоковой переменной используйте одну из этих команд:
SELECT @@session.sort_buffer_size; SHOW SESSION VARIABLES like 'sort_buffer_size';
Когда вы запрашиваете значение
переменной с помощью синтаксиса
@@variable_name и не укзываете
GLOBAL или SESSION,
то тогда MySQL вернет потоковое
значение этой переменное, если
таковое существует. Если нет, то MySQL
вернет глобальное значение.
Причина, по которой требуется
указывать GLOBAL для
установки только глобальных
переменных но не для получения их
значения, заключается в том, чтобы
удостовериться, что если мы в
будущем не будем иметь проблем,
если добавим потоковую переменную
с таким же именем или уберем некую
потоковую переменную. В этом
случае вы можете ненароком
изменить состояние сервера в
целом, а не исключительно вашего
соединения.
Далее идет полный список всех
переменных которые вы можете
изменять и значения которых можете
получать, а также информация о том,
можете ли вы использовать
SESSION или GLOBAL с
ними.
| Переменная | Тип значения | Тип |
| autocommit | булевое | SESSION |
| big_tables | булевое | SESSION |
| binlog_cache_size | число | GLOBAL |
| bulk_insert_buffer_size | число | GLOBAL | SESSION |
| concurrent_insert | булевое | GLOBAL |
| connect_timeout | число | GLOBAL |
| convert_character_set | строка | SESSION |
| delay_key_write | OFF | ON | ALL | GLOBAL |
| delayed_insert_limit | число | GLOBAL |
| delayed_insert_timeout | число | GLOBAL |
| delayed_queue_size | число | GLOBAL |
| error_count | число | LOCAL |
| flush | булевое | GLOBAL |
| flush_time | число | GLOBAL |
| foreign_key_checks | булевое | SESSION |
| identity | число | SESSION |
| insert_id | булевое | SESSION |
| interactive_timeout | число | GLOBAL | SESSION |
| join_buffer_size | число | GLOBAL | SESSION |
| key_buffer_size | число | GLOBAL |
| last_insert_id | булевое | SESSION |
| local_infile | булевое | GLOBAL |
| log_warnings | булевое | GLOBAL |
| long_query_time | число | GLOBAL | SESSION |
| low_priority_updates | булевое | GLOBAL | SESSION |
| max_allowed_packet | число | GLOBAL | SESSION |
| max_binlog_cache_size | число | GLOBAL |
| max_binlog_size | число | GLOBAL |
| max_connect_errors | число | GLOBAL |
| max_connections | число | GLOBAL |
| max_error_count | число | GLOBAL | SESSION |
| max_delayed_threads | число | GLOBAL |
| max_heap_table_size | число | GLOBAL | SESSION |
| max_join_size | число | GLOBAL | SESSION |
| max_sort_length | число | GLOBAL | SESSION |
| max_tmp_tables | число | GLOBAL |
| max_user_connections | число | GLOBAL |
| max_write_lock_count | число | GLOBAL |
| myisam_max_extra_sort_file_size | число | GLOBAL | SESSION |
| myisam_max_sort_file_size | число | GLOBAL | SESSION |
| myisam_sort_buffer_size | число | GLOBAL | SESSION |
| net_buffer_length | число | GLOBAL | SESSION |
| net_read_timeout | число | GLOBAL | SESSION |
| net_retry_count | число | GLOBAL | SESSION |
| net_write_timeout | число | GLOBAL | SESSION |
| query_cache_limit | число | GLOBAL |
| query_cache_size | число | GLOBAL |
| query_cache_type | enum | GLOBAL |
| read_buffer_size | число | GLOBAL | SESSION |
| read_rnd_buffer_size | число | GLOBAL | SESSION |
| rpl_recovery_rank | число | GLOBAL |
| safe_show_database | булевое | GLOBAL |
| server_id | число | GLOBAL |
| slave_compressed_protocol | булевое | GLOBAL |
| slave_net_timeout | число | GLOBAL |
| slow_launch_time | число | GLOBAL |
| sort_buffer_size | число | GLOBAL | SESSION |
| sql_auto_is_null | булевое | SESSION |
| sql_big_selects | булевое | SESSION |
| sql_big_tables | булевое | SESSION |
| sql_buffer_result | булевое | SESSION |
| sql_log_binlog | булевое | SESSION |
| sql_log_off | булевое | SESSION |
| sql_log_update | булевое | SESSION |
| sql_low_priority_updates | булевое | GLOBAL | SESSION |
| sql_max_join_size | число | GLOBAL | SESSION |
| sql_quote_show_create | булевое | SESSION |
| sql_safe_updates | булевое | SESSION |
| sql_select_limit | булевое | SESSION |
| sql_slave_skip_counter | число | GLOBAL |
| sql_warnings | булевое | SESSION |
| table_cache | число | GLOBAL |
| table_type | enum | GLOBAL | SESSION |
| thread_cache_size | число | GLOBAL |
| timestamp | булевое | SESSION |
| tmp_table_size | enum | GLOBAL | SESSION |
| tx_isolation | enum | GLOBAL | SESSION |
| version | строка | GLOBAL |
| wait_timeout | число | GLOBAL | SESSION |
| warning_count | число | LOCAL |
| unique_checks | булевое | SESSION |
Переменные, помеченные как
число могут иметь
числовое значение. Переменные,
помеченные как булевое
могут быть установлены в
0, 1,
ON или OFF.
Переменные типа enum
должны в общем случае быть
установлены в одно из возможных
значений для переменной, но также
могут быть установлены в значение
числа, соответствующего значению
выбора enum. Первый элемент списка enum
- номер 0.
Вот описание некоторых переменных:
| Переменная | Описание |
| identity | Синоним для last_insert_id (совместимость с Sybase) |
| sql_low_priority_updates | Синоним для low_priority_updates |
| sql_max_join_size | Синоним для max_join_size |
| delay_key_write_for_all_tables | Если это и delay_key_write установлены, то тогда все вновь открываемые таблицы MyISAM открываются с задержкой записи ключей. |
| version | Синоним для VERSION() (совместимость (?) с Sybase) |
Описания других переменных можно
найти в описании переменных
запуска mysql, в описании
команды SHOW VARIABLES и в
разделе SET. See
Раздел 4.1.1, «Параметры командной строки mysqld». See
Раздел 4.5.6.4, «SHOW VARIABLES». See
Раздел 5.5.6, «Синтаксис команды SET».
Сервер MySQL поддерживает следующие
способы задания комментариев: с
помощью символа
‘#’, за которым
следует текст комментария до конца
строки; с помощью двух символов
--, за которыми идет текст
комментария до конца строки; и (для
многострочных комментариев) с
помощью символов /*
(начало комментария) и */
(конец комментария):
mysql>SELECT 1+1; # Этот комментарий продолжается до конца строкиmysql>SELECT 1+1; -- Этот комментарий продолжается до конца строкиmysql>SELECT 1 /* Это комментарий в строке */ + 1;mysql>SELECT 1+/* Это многострочный комментарий */ 1;
Обратите внимание: при
использовании для комментирования
способа с -- (двойное тире)
требуется наличие хотя бы одного
пробела после второго тире!
Хотя сервер ``понимает'' все
описанные выше варианты
комментирования, существует ряд
ограничений на способ
синтаксического анализа
комментариев вида /* ... */
клиентом mysql:
Символы одинарной и двойной
кавычек, даже внутри
комментария, считаются началом
заключенной в кавычки строки.
Если внутри комментария не
встречается вторая такая же
кавычка, синтаксический
анализатор не считает
комментарий законченным. При
работе с mysql в
интерактивном режиме эта ошибка
проявится в том, что окно запроса
изменит свое состояние с
mysql> на '>
или ">.
Точка с запятой используется для обозначения окончания данной SQL-команды и что-либо, следующее за этим символом, указывает на начало следующего выражения.
Эти ограничения относятся как к
интерактивному режиму работы
mysql (из командной строки),
так и к вызову команд из файла,
читаемого с ввода командой mysql
< some-file.
MySQL поддерживает принятый в ANSI SQL
способ комментирования с помощью
двойного тире '--' только в
том случае, если после второго тире
следует пробел (see
Раздел 1.9.4.7, «Символы `--' как начало комментария»).
Это общая проблема, возникающая
при попытке создать таблицу с
именами столбцов, использующих
принятые в MySQL названия типов
данных или функций, такие как
TIMESTAMP или GROUP.
Иногда это возможно (например,
ABS является разрешенным
именем для столбца), но не
допускается пробел между именем
функции и сразу же следующей за ним
скобкой ‘(’ при
использовании имен функций,
совпадающих с именами столбцов.
Следующие слова являются
зарезервированными в MySQL.
Большинство из них не допускаются
в ANSI SQL92 как имена столбцов и/или
таблиц (например GROUP). Некоторые
зарезервированы для нужд MySQL и
используются (в настоящее время)
синтаксическим анализатором
yacc:
ADD | ALL | ALTER |
ANALYZE | AND | AS |
ASC | BEFORE | BETWEEN |
BIGINT | BINARY | BLOB |
BOTH | BY | CASCADE |
CASE | CHANGE | CHAR |
CHARACTER | CHECK | COLLATE |
COLUMN | COLUMNS | CONSTRAINT |
CONVERT | CREATE | CROSS |
CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP |
CURRENT_USER | DATABASE | DATABASES |
DAY_HOUR | DAY_MICROSECOND | DAY_MINUTE |
DAY_SECOND | DEC | DECIMAL |
DEFAULT | DELAYED | DELETE |
DESC | DESCRIBE | DISTINCT |
DISTINCTROW | DIV | DOUBLE |
DROP | DUAL | ELSE |
ENCLOSED | ESCAPED | EXISTS |
EXPLAIN | FALSE | FIELDS |
FLOAT | FLOAT4 | FLOAT8 |
FOR | FORCE | FOREIGN |
FROM | FULLTEXT | GRANT |
GROUP | HAVING | HIGH_PRIORITY |
HOUR_MICROSECOND | HOUR_MINUTE | HOUR_SECOND |
IF | IGNORE | IN |
INDEX | INFILE | INNER |
INSERT | INT | INT1 |
INT2 | INT3 | INT4 |
INT8 | INTEGER | INTERVAL |
INTO | IS | JOIN |
KEY | KEYS | KILL |
LEADING | LEFT | LIKE |
LIMIT | LINES | LOAD |
LOCALTIME | LOCALTIMESTAMP | LOCK |
LONG | LONGBLOB | LONGTEXT |
LOW_PRIORITY | MATCH | MEDIUMBLOB |
MEDIUMINT | MEDIUMTEXT | MIDDLEINT |
MINUTE_MICROSECOND | MINUTE_SECOND | MOD |
NATURAL | NOT | NO_WRITE_TO_BINLOG |
NULL | NUMERIC | ON |
OPTIMIZE | OPTION | OPTIONALLY |
OR | ORDER | OUTER |
OUTFILE | PRECISION | PRIMARY |
PRIVILEGES | PROCEDURE | PURGE |
RAID0 | READ | REAL |
REFERENCES | REGEXP | RENAME |
REPLACE | REQUIRE | RESTRICT |
REVOKE | RIGHT | RLIKE |
SECOND_MICROSECOND | SELECT | SEPARATOR |
SET | SHOW | SMALLINT |
SONAME | SPATIAL | SQL_BIG_RESULT |
SQL_CALC_FOUND_ROWS | SQL_SMALL_RESULT | SSL |
STARTING | STRAIGHT_JOIN | TABLE |
TABLES | TERMINATED | THEN |
TINYBLOB | TINYINT | TINYTEXT |
TO | TRAILING | TRUE |
UNION | UNIQUE | UNLOCK |
UNSIGNED | UPDATE | USAGE |
USE | USING | UTC_DATE |
UTC_TIME | UTC_TIMESTAMP | VALUES |
VARBINARY | VARCHAR | VARCHARACTER |
VARYING | WHEN | WHERE |
WITH | WRITE | X509 |
XOR | YEAR_MONTH | ZEROFILL |
Следующие слова являются новыми зарезервированными словами в MySQL 4.0:
CHECK | FORCE | LOCALTIME |
LOCALTIMESTAMP | REQUIRE | SQL_CALC_FOUND_ROWS |
SSL | X509 | XOR |
Следующие символы (из приведенной выше таблицы таблицы) не разрешены в ANSI SQL, но допускаются в MySQL как имена столбцов/таблиц. Это объясняется тем, что некоторые из этих имен являются словами естественного языка и уже использованы многими потребителями.
ACTION
BIT
DATE
ENUM
NO
TEXT
TIME
TIMESTAMP
MySQL поддерживает несколько типов столбцов, которые можно разделить на три категории: числовые типы данных, типы данных для хранения даты и времени и символьные (строковые) типы данных. В данном разделе вначале дается обзор всех возможных типов и приводятся требования по хранению для каждого типа столбца, затем свойства типов описываются более подробно по каждой категории. Мы намеренно сделали обзор кратким, поскольку более детальные описания требуют дополнительной информации о конкретных типах столбцов, например, о допустимых форматах представления величин.
Ниже перечислены типы столбцов, поддерживаемые MySQL. В описаниях используются следующие обозначения:
M
Указывает максимальный размер вывода. Максимально допустимый размер вывода составляет 255 символов.
D
Употребляется для типов данных с
плавающей точкой и указывает
количество разрядов, следующих за
десятичной точкой. Максимально
возможная величина составляет 30
разрядов, но не может быть больше,
чем M-2.
Квадратные скобки
(‘[’ и
‘]’) указывают для
типа данных группы необязательных
признаков.
Заметьте, что если для столбца
указать параметр ZEROFILL, то
MySQL будет автоматически добавлять в
этот столбец атрибут
UNSIGNED.
Предупреждение:
следует помнить, что при выполнении
вычитания между числовыми
величинами, одна из которых
относится к типу UNSIGNED,
результат будет беззнаковым! See
Раздел 6.3.5, «Функции приведения типов».
TINYINT[(M)] [UNSIGNED] [ZEROFILL]
Очень малое целое число. Диапазон
со знаком от -128 до
127. Диапазон без знака
от 0 до 255.
BIT, BOOL
Являются синонимами для
TINYINT(1).
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
Малое целое число. Диапазон со
знаком от -32768 до
32767. Диапазон без знака
от 0 до 65535.
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
Целое число среднего размера.
Диапазон со знаком от
-8388608 до 8388607.
Диапазон без знака от 0
до 16777215.
INT[(M)] [UNSIGNED] [ZEROFILL]
Целое число нормального размера.
Диапазон со знаком от
-2147483648 до
2147483647. Диапазон без
знака от 0 до
4294967295.
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
Синоним для INT.
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
Большое целое число. Диапазон со
знаком от -9223372036854775808 до
9223372036854775807. Диапазон
без знака от 0 до
18446744073709551615. Для
столбцов типа BIGINT
необходимо учитывать некоторые
особенности:
Все арифметические операции
выполняются с использованием
значений BIGINT или
DOUBLE со знаком, так
что не следует использовать
беззнаковые целые числа
больше чем
9223372036854775807 (63 бита),
кроме операций, выполняемых
логическими функциями. В
противном случае несколько
последних разрядов результата
могут оказаться ошибочными
из-за ошибок округления при
преобразовании BIGINT
в DOUBLE. MySQL 4.0 может
обрабатывать данные типа
BIGINT в следующих
случаях:
Использование целых чисел
для хранения больших
беззнаковых величин в
столбце с типом
BIGINT.
В случаях
MIN(big_int_column) и
MAX(big_int_column).
При использовании
операторов
(‘+’,
‘-’,
‘*’ и т.д.),
когда оба операнда являются
целыми числами.
Точное значение целого числа
всегда можно хранить в столбце
с типом BIGINT в виде
строки. В этом случае MySQL
выполнит преобразование
строки в число без
промежуточного
преобразования.
Если оба аргумента являются
целочисленными величинами, то
при выполнении над ними
операций ‘-’,
‘+’, и
‘*’ будут
использоваться правила
BIGINT-арифметики. Это
означает, что при умножении
двух больших целых чисел (или
результатов вычислений
функций, возвращающих целые
числа) результат операции
может оказаться
непредсказуемым, если он
превосходит значение
9223372036854775807.
FLOAT(точность) [UNSIGNED]
[ZEROFILL]
Число с плавающей точкой. Атрибут
точности может иметь значение
<=24 для числа с
плавающей точкой обычной
(одинарной) точности и между
25 и 53 - для
числа с плавающей точкой
удвоенной точности. Эти типы
данных сходны с типами
FLOAT и DOUBLE,
описанными ниже. FLOAT(X)
относится к тому же интервалу, что
и соответствующие типы
FLOAT и DOUBLE, но
диапазон значений и количество
десятичных знаков не определены.
В версии MySQL 3.23 это истинная
величина числа с плавающей
точкой. В более ранних версиях MySQL
тип данных FLOAT(точность)
всегда имеет два десятичных
знака.
Следует отметить, что
использование типа данных
FLOAT может привести к
неожиданным проблемам, так как
все вычисления в MySQL выполняются с
удвоенной точностью. See
Раздел A.5.6, «Решение проблем с отсутствием строк, удовлетворяющих условиям поиска». Данный
синтаксис обеспечивает
совместимость с ODBC.
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
Малое число с плавающей точкой
обычной точности. Допустимые
значения: от -3,402823466E+38
до -1,175494351E-38,
0, и от
1,175494351E-38 до
3,402823466E+38. Если указан
атрибут UNSIGNED,
отрицательные значения
недопустимы. Атрибут M
указывает количество выводимых
пользователю знаков, а атрибут
D - количество разрядов,
следующих за десятичной точкой.
Обозначение FLOAT без
указания аргументов или запись
вида FLOAT(X), где
X <=24
справедливы для числа с плавающей
точкой обычной точности.
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
Число с плавающей точкой
удвоенной точности нормального
размера. Допустимые значения: от
-1,7976931348623157E+308 до
-2,2250738585072014E-308,
0, и от
2,2250738585072014E-308 до
1,7976931348623157E+308. Если
указан атрибут UNSIGNED,
отрицательные значения
недопустимы. Атрибут M
указывает количество выводимых
пользователю знаков, а атрибут
D - количество разрядов,
следующих за десятичной точкой.
Обозначение DOUBLE без
указания аргументов или запись
вида FLOAT(X), где 25 <=
X <= 53 справедливы для числа
с плавающей точкой двойной
точности.
DOUBLE PRECISION[(M,D)] [UNSIGNED]
[ZEROFILL], REAL[(M,D)] [UNSIGNED]
[ZEROFILL]
Данные обозначения являются
синонимами для DOUBLE.
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
``Неупакованное'' число с
плавающей точкой. Ведет себя
подобно столбцу CHAR,
содержащему цифровое значение.
Термин ``неупакованное'' означает,
что число хранится в виде строки и
при этом для каждого десятичного
знака используется один символ.
Разделительный знак десятичных
разрядов, а также знак
‘-’ для
отрицательных чисел не
учитываются в M (но
место для них зарезервировано).
Если атрибут D равен
0, величины будут
представлены без десятичного
знака, т.е. без дробной части.
Максимальный интервал значений
типа DECIMAL тот же, что и
для типа DOUBLE, но
действительный интервал для
конкретного столбца
DECIMAL может быть
ограничен выбором значений
атрибутов M и
D. Если указан атрибут
UNSIGNED, отрицательные
значения недопустимы. Если
атрибут D не указан, его
значение по умолчанию равно
0. Если не указан
M, его значение по
умолчанию равно 10. В
более ранних, чем MySQL 3.23, версиях
аргумент M должен
содержать в себе место для знака
числа и десятичного знака.
DEC[(M[,D])] [UNSIGNED] [ZEROFILL],
NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL]
Данные обозначения являются
синонимами для DECIMAL.
DATE
Дата. Поддерживается интервал от
'1000-01-01' до
'9999-12-31'. MySQL выводит
значения DATE в формате
'YYYY-MM-DD', но можно
установить значения в столбец
DATE, используя как
строки, так и числа. See
Раздел 6.2.2.2, «Типы данных DATETIME, DATE и TIMESTAMP».
DATETIME
Комбинация даты и времени.
Поддерживается интервал от
'1000-01-01 00:00:00' до
'9999-12-31 23:59:59'. MySQL выводит
значения DATETIME в формате
'YYYY-MM-DD HH:MM:SS', но можно
устанавливать значения в столбце
DATETIME, используя как
строки, так и числа. See
Раздел 6.2.2.2, «Типы данных DATETIME, DATE и TIMESTAMP».
TIMESTAMP[(M)]
Временная метка. Интервал от
'1970-01-01 00:00:00' до
некоторого значения времени в 2037
году. MySQL выводит значения
TIMESTAMP в форматах
YYYYMMDDHHMMSS,
YYMMDDHHMMSS, YYYYMMDD
или YYMMDD в зависимости
от значений M:
14 (или отсутствующее),
12, 8, или
6; но можно также
устанавливать значения в столбце
TIMESTAMP, используя как
строки, так и числа. Столбец
TIMESTAMP полезен для
записи даты и времени при
выполнении операций
INSERT или UPDATE,
так как при этом автоматически
вносятся значения даты и времени
самой последней операции, если
эти величины не введены
программой. Можно также
устанавливать текущее значение
даты и времени, задавая значение
NULL. See
Раздел 6.2.2, «Типы данных даты и времени». Аргумент
M влияет только на
способ вывода столбца
TIMESTAMP; для хранения его
значений всегда используется 4
байта. Следует учитывать, что
столбцы TIMESTAMP(M), где
M равно 8 или
14, представляют собой
числа, в то время, как столбцы
TIMESTAMP(M) с иным значением
аргумента M являются
строками. Это убеждает, что можно
надежно сделать дамп и
восстановить таблицу с этими
типами столбцов! See Раздел 6.2.2.2, «Типы данных DATETIME, DATE и TIMESTAMP».
TIME
Время. Интервал от
'-838:59:59' до
'838:59:59'. MySQL выводит
значения TIME в формате
'HH:MM:SS', но можно
устанавливать значения в столбце
TIME, используя как
строки, так и числа. See
Раздел 6.2.2.3, «Тип данных TIME».
YEAR[(2|4)]
Год в двухзначном или
четырехзначном форматах (по
умолчанию формат четырехзначный).
Допустимы следующие значения: с
1901 по 2155,
0000 для четырехзначного
формата года и 1970-2069 при
использовании двухзначного
формата (70-69). MySQL
выводит значения YEAR в
формате YYYY, но можно
задавать значения в столбце
YEAR, используя как
строки, так и числа (тип данных
YEAR недоступен в
версиях, предшествующих MySQL 3.22). See
Раздел 6.2.2.4, «Тип данных YEAR».
[NATIONAL] CHAR(M) [BINARY]
Строка фиксированной длины, при
хранении всегда дополняется
пробелами в конце строки до
заданного размера. Диапазон
аргумента M составляет
от 0 до 255
символов (от 1 до
255 в версиях,
предшествующих MySQL 3.23). Концевые
пробелы удаляются при выводе
значения. Если не задан атрибут
чувствительности к регистру
BINARY, то величины
CHAR сортируются и
сравниваются как независимые от
регистра в соответствии с
установленным по умолчанию
алфавитом.
Атрибут NATIONAL CHAR (или его
эквивалентная краткая форма
NCHAR) представляет собой
принятый в ANSI SQL способ указания,
что в столбце CHAR должен
использоваться установленный по
умолчанию набор символов
(CHARACTER). В MySQL это принято
по умолчанию. CHAR
является сокращением от
CHARACTER. MySQL позволяет
создавать столбец типа
CHAR(0).
В основном это полезно, если
необходимо обеспечить
совместимость с некоторыми
старыми приложениями, которые
зависят от наличия столбца, но
реально эту величину не
используют. Кроме того, такая
возможность может очень
пригодиться в случае, если
необходим столбец, который может
содержать только 2 значения, а
именно CHAR(0) (т.е.
столбец, который не определен как
NOT NULL, занимает только
один бит и принимает только 2
значения: NULL или
""). See Раздел 6.2.3.1, «Типы данных CHAR и VARCHAR».
CHAR
Это синоним для CHAR(1).
[NATIONAL] VARCHAR(M) [BINARY]
Строка переменной длины.
Примечание:
концевые пробелы удаляются при
сохранении значения (в этом
заключается отличие от
спецификации ANSI SQL). Диапазон
аргумента M составляет
от 0 до 255
символов (от 1 до
255 в версиях,
предшествующих MySQL Version 4.0.2). Если
не задан атрибут
чувствительности к регистру
BINARY, то величины
VARCHAR сортируются и
сравниваются как независимые от
регистра. See Раздел 6.5.3.1, «Молчаливые изменения определений столбцов».
Термин VARCHAR является
сокращением от CHARACTER
VARYING. See Раздел 6.2.3.1, «Типы данных CHAR и VARCHAR».
TINYBLOB, TINYTEXT
Столбец типа BLOB или
TEXT с максимальной
длиной 255 (2^8 -
1) символов. See
Раздел 6.5.3.1, «Молчаливые изменения определений столбцов». See
Раздел 6.2.3.2, «Типы данных BLOB и TEXT».
BLOB, TEXT
Столбец типа BLOB или
TEXT с максимальной
длиной 65535 (2^16 -
1) символов. See
Раздел 6.5.3.1, «Молчаливые изменения определений столбцов». See
Раздел 6.2.3.2, «Типы данных BLOB и TEXT».
MEDIUMBLOB, MEDIUMTEXT
Столбец типа BLOB или
TEXT с максимальной
длиной 16777215 (2^24 -
1) символов. See
Раздел 6.5.3.1, «Молчаливые изменения определений столбцов». See
Раздел 6.2.3.2, «Типы данных BLOB и TEXT».
LONGBLOB, LONGTEXT
Столбец типа BLOB или
TEXT с максимальной
длиной 4294967295 (2^32 -
1) символов. See
Раздел 6.5.3.1, «Молчаливые изменения определений столбцов». Следует
учитывать, что в настоящее время
протокол передачи данных
сервер/клиент и таблицы
MyISAM имеют ограничение 16
Мб на передаваемый пакет/строку
таблицы, поэтому пока нельзя
использовать этот тип данных в
его полном диапазоне. See
Раздел 6.2.3.2, «Типы данных BLOB и TEXT».
ENUM('значение1','значение2',...)
Перечисление. Перечисляемый тип
данных. Объект строки может иметь
только одно значение, выбранное
из заданного списка величин
'значение1',
'значение2',
..., NULL или
специальная величина ошибки
"". Список ENUM
может содержать максимум
65535 различных величин.
See Раздел 6.2.3.3, «Тип перечисления ENUM ».
SET('значение1','значение2',...)
Набор. Объект строки может иметь
ноль или более значений, каждое из
которых должно быть выбрано из
заданного списка величин
'значение1',
'значение2', ...
Список SET может
содержать максимум 64 элемента. See
Раздел 6.2.3.4, «Тип множества SET ».
MySQL поддерживает все числовые типы
данных языка SQL92 по стандартам
ANSI/ISO. Они включают в себя типы
точных числовых данных
(NUMERIC, DECIMAL,
INTEGER и SMALLINT) и
типы приближенных числовых данных
(FLOAT, REAL и
DOUBLE PRECISION). Ключевое
слово INT является
синонимом для INTEGER, а
ключевое слово DEC -
синонимом для DECIMAL.
Типы данных NUMERIC и
DECIMAL реализованы в MySQL
как один и тот же тип - это
разрешается стандартом SQL92. Они
используются для величин, для
которых важно сохранить
повышенную точность, например для
денежных данных. Требуемая
точность данных и масштаб могут
задаваться (и обычно задаются) при
объявлении столбца данных одного
из этих типов, например:
salary DECIMAL(5,2)
В этом примере - 5
(точность) представляет собой
общее количество значащих
десятичных знаков, с которыми
будет храниться данная величина, а
цифра 2 (масштаб) задает
количество десятичных знаков
после запятой. Следовательно, в
этом случае интервал величин,
которые могут храниться в столбце
salary, составляет от
-99,99 до 99,99 (в
действительности для данного
столбца MySQL обеспечивает
возможность хранения чисел вплоть
до 999,99, поскольку можно
не хранить знак для положительных
чисел).
В SQL92 по стандарту ANSI/ISO выражение
DECIMAL(p) эквивалентно
DECIMAL(p,0). Аналогично,
выражение DECIMAL также
эквивалентно DECIMAL(p,0), при
этом предполагается, что величина
p определяется
конкретной реализацией. В
настоящее время MySQL не
поддерживает ни одну из
рассматриваемых двух различных
форм типов данных
DECIMAL/NUMERIC. В общем случае
это не является серьезной
проблемой, так как основные
преимущества данных типов состоят
в возможности явно управлять как
точностью, так и масштабом
представления данных.
Величины типов DECIMAL и
NUMERIC хранятся как строки,
а не как двоичные числа с плавающей
точкой, чтобы сохранить точность
представления этих величин в
десятичном виде. При этом
используется по одному символу
строки для каждого разряда
хранимой величины, для десятичного
знака (если масштаб > 0)
и для знака ‘-’ (для
отрицательных чисел). Если
параметр масштаба равен
0, то величины
DECIMAL и NUMERIC не
содержат десятичного знака или
дробной части.
Максимальный интервал величин
DECIMAL и NUMERIC тот
же, что и для типа DOUBLE, но
реальный интервал может быть
ограничен выбором значений
параметров точности или
масштаба для данного
столбца с типом данных
DECIMAL или NUMERIC.
Если конкретному столбцу
присваивается значение, имеющее
большее количество разрядов после
десятичного знака, чем разрешено
параметром масштаба, то
данное значение округляется до
количества разрядов, разрешенного
масштаба. Если столбцу с
типом DECIMAL или
NUMERIC присваивается
значение, выходящее за границы
интервала, заданного значениями
точности и
масштаба (или принятого
по умолчанию), то MySQL сохранит
данную величину со значением
соответствующей граничной точки
данного интервала.
В качестве расширения стандарта
ANSI/ISO SQL92 MySQL также поддерживает
числовые типы представления
данных TINYINT,
MEDIUMINT и BIGINT,
кратко описанные в таблице выше.
Еще одно расширение указанного
стандарта, поддерживаемое MySQL,
позволяет при необходимости
указывать количество показываемых
пользователю символов целого
числа в круглых скобках, следующих
за базовым ключевым словом данного
типа (например INT(4)). Это
необязательное указание
количества выводимых символов
используется для дополнения слева
выводимых значений, которые
содержат символов меньше, чем
заданная ширина столбца, однако не
накладывает ограничений ни на
диапазон величин, которые могут
храниться в столбце, ни на
количество разрядов, которые могут
выводиться для величин, у которых
количество символов превосходит
ширину данного столбца. Если
дополнительно указан
необязательный атрибут
ZEROFILL, свободные позиции
по умолчанию заполняются нолями.
Например, для столбца,
объявленного как INT(5)
ZEROFILL, величина
4 извлекается как
00004. Следует учитывать,
что если в столбце для целых чисел
хранится величина с количеством
символов, превышающим заданную
ширину столбца, могут возникнуть
проблемы, когда MySQL будет
генерировать временные таблицы
для некоторых сложных связей, так
как в подобных случаях MySQL
полагает, что данные действительно
поместились в столбец имеющейся
ширины.
Все типы целочисленных данных
могут иметь необязательный и не
оговоренный в стандарте атрибут
UNSIGNED. Беззнаковые
величины можно использовать для
разрешения записи в столбец только
положительных чисел, если
необходимо немного увеличить
числовой интервал в столбце.
В версии MySQL 4.0.2 числовые типы
данных с плавающей точкой также
могут иметь параметр
UNSIGNED. Как и в
целочисленных типах, этот атрибут
предотвращает хранение в
отмеченном столбце отрицательных
величин. Но, в отличие от
целочисленных типов, максимальный
интервал для величин столбца
остается прежним.
Тип FLOAT обычно
используется для представления
приблизительных числовых типов
данных. Стандарт ANSI/ISO SQL92 допускает
факультативное указание точности
(но не интервала порядка числа) в
битах в круглых скобках, следующих
за ключевым словом FLOAT.
Реализация MySQL также поддерживает
это факультативное указание
точности. При этом если ключевое
слово FLOAT в обозначении
типа столбца используется без
указания точности, MySQL выделяет 4
байта для хранения величин в этом
столбце. Возможно также иное
обозначение, с двумя числами в
круглых скобках за ключевым словом
FLOAT. В этом варианте
первое число по-прежнему
определяет требования к хранению
величины в байтах, а второе число
указывает количество разрядов
после десятичной запятой, которые
будут храниться и показываться
(как для типов DECIMAL и
NUMERIC). Если в столбец
подобного типа попытаться
записать число, содержащее больше
десятичных знаков после запятой,
чем указано для данного столбца, то
значение величины при ее хранении
в MySQL округляется для устранения
излишних разрядов.
Для типов REAL и DOUBLE
PRECISION не предусмотрены
установки точности. MySQL
воспринимает DOUBLE как
синоним типа DOUBLE PRECISION -
это еще одно расширение стандарта
ANSI/ISO SQL92. Но, вопреки требованию
стандарта, указывающему, что
точность для REAL меньше,
чем для DOUBLE PRECISION, в MySQL
оба типа реализуются как 8-байтовые
числа с плавающей точкой удвоенной
точности (если не установлен
``ANSI-режим''). Чтобы обеспечить
максимальную совместимость, в
коде, требующем хранения
приблизительных числовых величин,
должны использоваться типы
FLOAT или DOUBLE
PRECISION без указаний точности
или количества десятичных знаков.
Если в числовой столбец попытаться записать величину, выходящую за границы допустимого интервала для столбца данного типа, то MySQL ограничит величину до соответствующей граничной точки данного интервала и сохранит результат вместо исходной величины.
Например, интервал столбца
INT составляет от
-2147483648 до
2147483647. Если попытаться
записать в столбец INT
число -9999999999, то оно
будет усечено до нижней конечной
точки интервала и вместо
записываемого значения в столбце
будет храниться величина
-2147483648. Аналогично, если
попытаться записать число
9999999999, то взамен
запишется число 2147483647.
Если для столбца INT
указан параметр UNSIGNED, то
величина допустимого интервала
для столбца останется той же, но
его граничные точки сдвинутся к
0 и 4294967295. Если
попытаться записать числа
-9999999999 и 9999999999,
то в столбце окажутся величины
0 и 4294967296.
Для команд ALTER TABLE,
LOAD DATA INFILE, UPDATE
и многострочной INSERT
выводится предупреждение, если
могут возникнуть преобразования
данных вследствие вышеописанных
усечений.
| Тип | Байт | От | До |
TINYINT | 1 | -128 | 127 |
SMALLINT | 2 | -32768 | 32767 |
MEDIUMINT | 3 | -8388608 | 8388607 |
INT | 4 | -2147483648 | 2147483647 |
BIGINT | 8 | -9223372036854775808 | 9223372036854775807 |
Существуют следующие типы данных
даты и времени: DATETIME,
DATE, TIMESTAMP,
TIME и YEAR. Каждый
из них имеет интервал допустимых
значений, а также значение ``ноль'',
которое используется, когда
пользователь вводит действительно
недопустимое значение. Отметим,
что MySQL позволяет хранить
некоторые не вполне достоверные
значения даты, например
1999-11-31. Причина в том, что,
по нашему мнению, управление
проверкой даты входит в
обязанности конкретного
приложения, а не SQL-серверов. Для
ускорения проверки правильности
даты MySQL только проверяет,
находится ли месяц в интервале
0-12 и день в интервале
0-31. Данные интервалы
начинаются с 0, это
сделано для того, чтобы обеспечить
для MySQL возможность хранить в
столбцах DATE или
DATETIME даты, в которых день
или месяц равен нулю. Эта
возможность особенно полезна для
приложений, которые предполагают
хранение даты рождения - здесь не
всегда известен день или месяц
рождения. В таких случаях дата
хранится просто в виде
1999-00-00 или
1999-01-00 (при этом не
следует рассчитывать на то, что для
подобных дат функции
DATE_SUB() или DATE_ADD
дадут правильные значения).
Ниже приведены некоторые общие соображения, полезные при работе с типами данных даты и времени:
MySQL извлекает значения для данного типа даты или времени только в стандартном формате, но в то же время пытается интерпретировать разнообразные форматы, которые могут поступать от пользователей (например, когда задается величина, которой следует присвоить тип даты или времени или сравнить со значением, имеющим один из этих типов). Тем не менее, поддерживаются только форматы, описанные в следующих разделах. Предполагается, что пользователь будет вводить допустимые значения величин, так как использование величин в других форматах может дать непредсказуемые результаты.
Хотя MySQL пытается
интерпретировать значения в
нескольких форматах, во всех
случаях ожидается, что крайним
слева будет раздел значения
даты, содержащий год. Даты должны
задаваться в порядке
год-месяц-день
(например, '98-09-04'), а не
в порядке
месяц-день-год или
день-месяц-год, т.е. не
так, как мы их обычно записываем
(например '09-04-98',
'04-09-98').
MySQL автоматически преобразует значение, имеющее тип даты или времени, в число, если данная величина используется в числовом контексте, и наоборот.
Значение, имеющее тип даты или
времени, которое выходит за
границы установленного
интервала или является
недопустимым для этого типа
данных (см. начало раздела),
преобразуется в значение ``ноль''
для данного типа. (Исключение
составляют выходящие за границы
установленного интервала
величины типа TIME,
которые усекаются до
соответствующей граничной точки
заданного интервала
TIME). В следующей
таблице представлены форматы
значения ``ноль'' для каждого из
типов столбцов:
| Тип столбца | Значение ``Ноль'' |
DATETIME | '0000-00-00 00:00:00' |
DATE | '0000-00-00' |
TIMESTAMP | 00000000000000 (длина зависит от
количества выводимых
символов) |
TIME | '00:00:00' |
YEAR | 0000 |
Значения ``ноль'' - особые. Для их
хранения или ссылок на них можно
явно применять представленные в
таблице значения, а можно
использовать ‘0’
или ‘0’, что легче
в написании.
Значения ``ноль'' даты или времени
при использовании MyODBC
автоматически конвертируются в
NULL в версии MyODBC 2.50.12 и
выше, так как ODBC не оперирует с
подобными величинами.
Ядро MySQL само по себе устойчиво к ``проблеме 2000 года'' (see Раздел 1.4.5, «Вопросы, связанные с Проблемой-2000»), но некоторые представленные в MySQL входные величины могут являться источниками ошибок. Так, любое вводимое значение, содержащее двухразрядное значение года, является неоднозначным, поскольку неизвестно столетие. Подобные величины должны быть переведены в четырехразрядную форму, так как для внутреннего представления года в MySQL используется 4 разряда.
Для типов DATETIME,
DATE, TIMESTAMP и
YEAR даты с неоднозначным
годом интерпретируются в MySQL по
следующим правилам:
Величина года в интервале
00-69 конвертируется в
2000-2069.
Величина года в интервале
70-99 конвертируется в
1970-1999.
Следует помнить, что эти правила дают только правдоподобные предположения о том, что ваши данные в действительности означают. Если применяемая MySQL эвристика не дает правильных величин, необходимо обеспечить недвусмысленные входные данные, содержащие четырехразрядные величины года.
ORDER BY отсортирует
двухразрядные
YEAR/DATE/DATETIME типы
корректно.
Необходимо также отметить, что
некоторые функции, такие как
MIN() и MAX()
будут преобразовывать
TIMESTAMP/DATE в число. Это
означает, что столбец с данными
типа TIMESTAMP, содержащими
год в виде двух разрядов, не будет
правильно работать с указанными
функциями. Выход из этого
положения состоит в
преобразовании TIMESTAMP/DATE
к четырехразрядному формату или
использовании чего-нибудь вроде
MIN(DATE_ADD(timestamp,INTERVAL 0 DAYS)).
Типы DATETIME, DATE
и TIMESTAMP являются
родственными типами данных. В
данном разделе описаны их
свойства, общие черты и различия.
Тип данных DATETIME
используется для величин,
содержащих информацию как о дате,
так и о времени. MySQL извлекает и
выводит величины DATETIME в
формате 'YYYY-MM-DD HH:MM:SS'.
Поддерживается диапазон величин
от '1000-01-01 00:00:00' до
'9999-12-31 23:59:59'.
(''поддерживается'' означает, что
хотя величины с более ранними
временными значениями, возможно,
тоже будут работать, но нет
гарантии того, что они будут
правильно храниться и
отображаться).
Тип DATE используется для
величин с информацией только о
дате, без части, содержащей время.
MySQL извлекает и выводит величины
DATE в формате
'YYYY-MM-DD'. Поддерживается
диапазон величин от
'1000-01-01' до
'9999-12-31'.
Тип столбца TIMESTAMP
обеспечивает тип представления
данных, который можно
использовать для автоматической
записи текущих даты и времени при
выполнении операций
INSERT или UPDATE.
При наличии нескольких столбцов
типа TIMESTAMP только
первый из них обновляется
автоматически.
Автоматическое обновление
первого столбца с типом
TIMESTAMP происходит при
выполнении любого из следующих
условий:
Столбец не указан явно в
команде INSERT или
LOAD DATA INFILE.
Столбец не указан явно в
команде UPDATE, и при
этом изменяется величина в
некотором другом столбце
(следует отметить, что команда
UPDATE, устанавливающая
столбец в то же самое значение,
которое было до выполнения
команды, не вызовет обновления
столбца TIMESTAMP,
поскольку в целях повышения
производительности MySQL
игнорирует подобные обновления
при установке столбца в его
текущее значение).
Величина в столбце
TIMESTAMP явно
установлена в NULL.
Для остальных (кроме первого)
столбцов типа TIMESTAMP
также можно задать установку в
значение текущих даты и времени.
Для этого необходимо просто
установить столбец в NULL
или в NOW().
Любой столбец типа
TIMESTAMP (даже первый
столбец данного типа) можно
установить в значение, отличное
от текущих даты и времени. Это
делается путем явной установки
его в желаемое значение. Данное
свойство можно использовать,
например, если необходимо
установить столбец
TIMESTAMP в значение
текущих даты и времени при
создании строки, а при
последующем обновлении этой
строки значение столбца не должно
изменяться:
Пусть MySQL автоматически
установит значение столбца с
типом TIMESTAMP при
создании данной строки. Столбец
будет установлен в исходное
состояние со значением текущих
даты и времени.
При выполнении последующих
обновлений других столбцов в
данной строке необходимо явно
установить столбец
TIMESTAMP в его текущее
значение.
Однако, с другой стороны, для этих
целей, возможно, будет проще
использовать столбец
DATETIME. При создании
строки его следует
инициализировать функцией
NOW() и оставить в покое
при последующих обновлениях.
Величины типа TIMESTAMP
могут принимать значения от
начала 1970 года до
некоторого значения в
2037 году с разрешением в
одну секунду. Эти величины
выводятся в виде числовых
значений.
Формат данных, в котором MySQL
извлекает и показывает величины
TIMESTAMP, зависит от
количества показываемых
символов. Это проиллюстрировано в
приведенной ниже таблице. Полный
формат TIMESTAMP составляет
14 десятичных разрядов, но можно
создавать столбцы типа
TIMESTAMP и с более короткой
строкой вывода:
| Тип столбца | Формат вывода |
TIMESTAMP(14) | YYYYMMDDHHMMSS |
TIMESTAMP(12) | YYMMDDHHMMSS |
TIMESTAMP(10) | YYMMDDHHMM |
TIMESTAMP(8) | YYYYMMDD |
TIMESTAMP(6) | YYMMDD |
TIMESTAMP(4) | YYMM |
TIMESTAMP(2) | YY |
Независимо от размера выводимого
значения размер данных,
хранящихся в столбцах типа
TIMESTAMP, всегда один и тот
же. Чаще всего используется
формат вывода с 6, 8, 12 или 14
десятичными знаками. При создании
таблицы можно указать
произвольный размер выводимых
значений, однако если этот размер
задать равным 0 или превышающим 14,
то будет использоваться значение
14. Нечетные значения размеров в
интервале от 1 до 13 будут
приведены к ближайшему большему
четному числу.
Величины DATETIME,
DATE и TIMESTAMP
могут быть заданы любым
стандартным набором форматов:
Как строка в формате 'YYYY-MM-DD
HH:MM:SS' или в формате
'YY-MM-DD HH:MM:SS'.
Допускается ``облегченный''
синтаксис - можно использовать
любой знак пунктуации в
качестве разделительного между
частями разделов даты или
времени. Например, величины
'98-12-31 11:30:45', '98.12.31
11+30+45', '98/12/31
11*30*45' и '98@12@31
11^30^45' являются
эквивалентными.
Как строка в формате
'YYYY-MM-DD' или в формате
'YY-MM-DD'. Здесь также
допустим ``облегченный''
синтаксис. Например, величины
'98-12-31',
'98.12.31',
'98/12/31' и
'98@12@31' являются
эквивалентными.
Как строка без разделительных
знаков в формате
'YYYYMMDDHHMMSS' или в
формате 'YYMMDDHHMMSS', при
условии, что строка понимается
как дата. Например, величины
'19970523091528' и
'970523091528' можно
интерпретировать как
'1997-05-23 09:15:28', но
величина '971122129015'
является недопустимой
(значение раздела минут
является абсурдным) и
преобразуется в '0000-00-00
00:00:00'.
Как строка без разделительных
знаков в формате
'YYYYMMDD' или в формате
'YYMMDD', при условии, что
строка интерпретируется как
дата. Например, величины
'19970523' и
'970523' можно
интерпретировать как
'1997-05-23', но величина
'971332' является
недопустимой (значения
разделов месяца и дня не имеют
смысла) и преобразуется в
'0000-00-00'.
Как число в формате
YYYYMMDDHHMMSS или в формате
YYMMDDHHMMSS, при условии,
что число интерпретируется как
дата. Например, величины
19830905132800 и
830905132800
интерпретируются как
'1983-09-05 13:28:00'.
Как число в формате
YYYYMMDD или в формате
YYMMDD, при условии, что
число интерпретируется как
дата. Например, величины
19830905 и 830905
интерпретируются как
'1983-09-05'.
Как результат выполнения
функции, возвращающей величину,
приемлемую в контекстах типов
данных DATETIME,
DATE или
TIMESTAMP (например,
функции NOW() или
CURRENT_DATE().
Недопустимые значения величин
DATETIME, DATE или
TIMESTAMP преобразуются в
значение ``ноль'' соответствующего
типа величин ('0000-00-00
00:00:00', '0000-00-00', или
00000000000000).
Для величин, представленных как
строки, содержащие
разделительные знаки между
частями даты, нет необходимости
указывать два разряда для
значений месяца или дня, меньших,
чем 10. Так, величина
'1979-6-9' эквивалентна
величине '1979-06-09'.
Аналогично, для величин,
представленных как строки,
содержащие разделительные знаки
внутри обозначения времени, нет
необходимости указывать два
разряда для значений часов, минут
или секунд, меньших, чем
10. Так,
Величины, определенные как числа,
должны иметь 6,
8, 12, или
14 десятичных разрядов.
Предполагается, что число,
имеющее 8 или
14 разрядов,
представлено в форматах
YYYYMMDD или
YYYYMMDDHHMMSS
соответственно, причем год указан
в первых четырех разрядах. Если же
длина числа 6 или
12 разрядов, то
предполагаются соответственно
форматы YYMMDD или
YYMMDDHHMMSS, где год указан в
первых двух разрядах. Числа, длина
которых не соответствует ни
одному из описанных вариантов,
интерпретируются как дополненные
спереди нулями до ближайшей
вышеуказанной длины.
Величины, представленные
строками без разделительных
знаков, интерпретируются с учетом
их длины согласно приведенным
далее правилам. Если длина строки
равна 8 или 14
символам, то предполагается, что
год задан первыми четырьмя
символами. В противном случае
предполагается, что год задан
двумя первыми символами. Строка
интерпретируется слева направо,
при этом определяются значения
для года, месяца, дня, часов, минут
и секунд для всех представленных
в строке разделов. Это означает,
что строка с длиной меньше, чем
6 символов, не может
быть использована. Например, если
задать строку вида '9903',
полагая, что это будет означать
март 1999 года, то MySQL внесет в
таблицу ``нулевую'' дату. Год и
месяц в данной записи равны
99 и 03
соответственно, но раздел,
представляющий день, пропущен
(значение равно нулю), поэтому в
целом данная величина не является
достоверным значением даты.
При хранении допустимых величин в
столбцах типа TIMESTAMP
используется полная точность,
указанная при их задании,
независимо от количества
выводимых символов. Это свойство
имеет несколько следствий:
Необходимо всегда указывать
год, месяц и день даже для типов
TIMESTAMP(4) или
TIMESTAMP(2). В противном
случае задаваемая величина не
будет допустимым значением
даты и будет храниться как
0.
При увеличении ширины узкого
столбца TIMESTAMP путем
использования команды ALTER
TABLE будет выводиться ранее
``скрытая'' информация.
И аналогично, при сужении
столбца TIMESTAMP
хранимая информация не будет
потеряна, если не принимать во
внимание, что при выводе
информации будет выдаваться
меньше.
Хотя величины TIMESTAMP
хранятся с полной точностью,
непосредственно может работать
с этим исходным хранимым
значением величины только
функция UNIX_TIMESTAMP().
Остальные функции оперируют
форматированными значениями
извлеченной величины. Это
означает, что нельзя
использовать такие функции, как
HOUR() или
SECOND(), пока
соответствующая часть величины
TIMESTAMP не будет
включена в ее форматированное
значение. Например, раздел
HH столбца
TIMESTAMP не будет
выводиться, пока количество
выводимых символов не станет по
меньшей мере равным
10, так что попытки
использовать HOUR() для
более коротких величин
TIMESTAMP приведут к
бессмысленным результатам.
Величины одного типа даты можно в ряде случаев присвоить объекту другого типа даты. Однако при этом возможны некоторое изменение величины или потеря информации:
Если присвоить значение типа
DATE объекту
DATETIME или
TIMESTAMP, то в
результирующей величине
``временная'' часть будет
установлена в '00:00:00',
так как величина DATE
не содержит информации о
времени.
Если присвоить значение типа
DATE, DATETIME
или TIMESTAMP объекту
DATE, то ``временная''
часть в результирующей
величине будет удалена, так как
тип DATE не включает
информацию о времени.
Несмотря на то что все величины
DATETIME, DATE и
TIMESTAMP могут быть
указаны с использованием
одного и того же набора
форматов, следует помнить, что
указанные типы имеют разные
интервалы допустимых значений.
Например, величины типа
TIMESTAMP не могут иметь
значения даты более ранние, чем
относящиеся к 1970 году
или более поздние, чем
относящиеся к 2037
году. Это означает, что такая
дата, как '1968-01-01',
будучи разрешенной для
величины типа DATETIME
или DATE, недопустима
для величины типа
TIMESTAMP и будет
преобразована в 0 при
присвоении этому объекту.
Задавая величины даты, следует иметь в виду некоторые ``подводные камни'':
Упрощенный формат, который
допускается для величин,
заданных строками, может ввести
в заблуждение. Например, такая
величина, как '10:11:12',
благодаря разделителю
‘:’ могла бы
оказаться величиной времени,
но, используемая в контексте
даты, она будет
интерпретирована как год
'2010-11-12'. В то же время
величина '10:45:15' будет
преобразована в
'0000-00-00', так как для
месяца значение '45'
недопустимо.
Сервер MySQL выполняет только
первичную проверку истинности
даты: дни 00-31, месяцы
00-12, года
1000-9999. Любая дата вне
этого диапазона преобразуется
в 0000-00-00. Следует
отметить, что, тем не менее, при
этом не запрещается хранить
неверные даты, такие как
2002-04-31. Это позволяет
веб-приложениям сохранять
данные форм без дополнительной
проверки. Чтобы убедиться в
достоверности даты,
выполняется проверка в самом
приложении.
Величины года, представленные двумя разрядами, допускают неоднозначное толкование, так как неизвестно столетие. MySQL интерпретирует двухразрядные величины года по следующим правилам:
Величины года в интервале
00-69 преобразуются в
2000-2069.
Величины года в интервале
70-99 преобразуются в
1970-1999.
MySQL извлекает и выводит величины
типа TIME в формате
'HH:MM:SS' (или в формате
'HHH:MM:SS' для больших
значений часов). Величины
TIME могут изменяться в
пределах от '-838:59:59' до
'838:59:59'. Причина того,
что ``часовая'' часть величины
может быть настолько большой,
заключается в том, что тип
TIME может
использоваться не только для
представления времени дня
(которое должно быть меньше 24
часов), но также для представления
общего истекшего времени или
временного интервала между двумя
событиями (который может быть
значительно больше 24 часов или
даже отрицательным).
Величины TIME могут быть
заданы в различных форматах:
Как строка в формате 'D
HH:MM:SS.дробная часть'
(следует учитывать, что MySQL пока
не обеспечивает хранения
дробной части величины в столбце
рассматриваемого типа). Можно
также использовать одно из
следующих ``облегченных''
представлений: HH:MM:SS.дробная
часть, HH:MM:SS,
HH:MM, D HH:MM:SS,
D HH:MM, D HH или
SS. Здесь D -
это дни из интервала значений
0-33.
Как строка без разделителей в
формате 'HHMMSS', при
условии, что строка
интерпретируется как дата.
Например, величина
'101112' понимается как
'10:11:12', но величина
'109712' будет
недопустимой (значение раздела
минут является абсурдным) и
преобразуется в
'00:00:00'.
Как число в формате
HHMMSS, при условии, что
строка интерпретируется как
дата. Например, величина
101112 понимается как
'10:11:12'. MySQL понимает и
следующие альтернативные
форматы: SS,
MMSS, HHMMSS,
HHMMSS.дробная часть.
При этом следует учитывать, что
хранения дробной части MySQL пока
не обеспечивает.
Как результат выполнения
функции, возвращающей величину,
приемлемую в контексте типа
данных типа TIME
(например, такой функции, как
CURRENT_TIME).
Для величин типа TIME,
представленных как строки,
содержащие разделительные знаки
между частями значения времени,
нет необходимости указывать два
разряда для значений часов, минут
или секунд, меньших 10.
Так, величина '8:3:2'
эквивалентна величине
'08:03:02'.
Будьте внимательны в отношении
использования ``укороченных''
величин TIME в столбце
типа TIME. MySQL
интерпретирует выражения без
разделительных двоеточий исходя
из предположения, что крайние
справа разряды представляют
секунды (MySQL интерпретирует
величины TIME как общее
истекшее время, а не как время
дня). Например, можно
подразумевать, что величины
'1112' и 1112
обозначают '11:12:00' (11
часов и 12 минут дня по показаниям
часов), но MySQL понимает их как
'00:11:12' (11 минут, 12
секунд). Подобно этому,
'12' и 12
интерпретируются как
'00:00:12'. Величины
TIME с разделительными
двоеточиями, наоборот, всегда
трактуются как время дня. Т.е.
выражение '11:12' будет
пониматься как '11:12:00', а
не '00:11:12'.
Величины, лежащие вне
разрешенного интервала
TIME, но во всем остальном
представляющие собой допустимые
значения, усекаются до
соответствующей граничной точки
данного интервала. Например,
величины '-850:00:00' и
'850:00:00' преобразуются
соответственно в
'-838:59:59' и
'838:59:59'.
Недопустимые значения величин
TIME преобразуются в
значение '00:00:00'.
Отметим, что поскольку выражение
'00:00:00' само по себе
представляет разрешенное
значение величины TIME,
то по хранящейся в таблице
величине '00:00:00'
невозможно определить, была ли
эта величина изначально задана
как '00:00:00' или является
преобразованным значением
недопустимой величины.
Тип YEAR - это однобайтный
тип данных для представления
значений года.
MySQL извлекает и выводит величины
YEAR в формате
YYYY. Диапазон возможных
значений - от 1901 до
2155.
Величины типа YEAR могут
быть заданы в различных форматах:
Как четырехзначная строка в
интервале значений от
'1901' до '2155'.
Как четырехзначное число в
интервале значений от
1901 до 2155.
Как двухзначная строка в
интервале значений от
'00' до '99'.
Величины в интервалах от
'00' до '69' и
от '70' до '99'
при этом преобразуются в
величины YEAR в
интервалах от 2000 до
2069 и от 1970
до 1999 соответственно.
Как двухзначное число в
интервале значений от
1 до 99.
Величины в интервалах от
1 до 69 и от
70 до 99 при
этом преобразуются в величины
YEAR в интервалах от
2001 до 2069 и
от 1970 до 1999
соответственно. Необходимо
принять во внимание, что
интервалы для двухзначных
чисел и двухзначных строк
несколько различаются, так как
нельзя указать ``ноль''
непосредственно как число и
интерпретировать его как
2000. Необходимо задать
его как строку '0' или
'00', или же оно будет
интерпретировано как
0000.
Как результат выполнения
функции, возвращающей величину,
приемлемую в контексте типа
данных YEAR (такой как
NOW()).
Недопустимые величины
YEAR преобразуются в
0000.
Существуют следующие символьные
типы данных: CHAR,
VARCHAR, BLOB,
TEXT, ENUM и
SET. В данном разделе
дается описание их работы,
требований к их хранению и
использования их в запросах.
| Тип | Макс.размер | Байт |
TINYTEXT или TINYBLOB | 2^8-1 | 255 |
TEXT или BLOB | 2^16-1 (64K-1) | 65535 |
MEDIUMTEXT или MEDIUMBLOB | 2^24-1 (16M-1) | 16777215 |
LONGBLOB | 2^32-1 (4G-1) | 4294967295 |
Типы данных CHAR и
VARCHAR очень схожи между
собой, но различаются по способам
их хранения и извлечения.
В столбце типа CHAR длина
поля постоянна и задается при
создании таблицы. Эта длина может
принимать любое значение между
1 и 255 (что же
касается версии MySQL 3.23, то в ней
длина столбца CHAR может
быть от 0 до
255). Величины типа
CHAR при хранении
дополняются справа пробелами до
заданной длины. Эти концевые
пробелы удаляются при извлечении
хранимых величин.
Величины в столбцах
VARCHAR представляют собой
строки переменной длины. Так же
как и для столбцов CHAR,
можно задать столбец
VARCHAR любой длины между
1 и 255. Однако,
в противоположность CHAR,
при хранении величин типа
VARCHAR используется
только то количество символов,
которое необходимо, плюс один
байт для записи длины. Хранимые
величины пробелами не
дополняются, наоборот, концевые
пробелы при хранении удаляются
(описанный процесс удаления
пробелов отличается от
предусмотренного спецификацией
ANSI SQL).
Если задаваемая в столбце
CHAR или VARCHAR
величина превосходит максимально
допустимую длину столбца, то эта
величина соответствующим образом
усекается.
Различие между этими двумя типами
столбцов в представлении
результата хранения величин с
разной длиной строки в столбцах
CHAR(4) и VARCHAR(4)
проиллюстрировано следующей
таблицей:
| Величина | CHAR(4) | Требуемая память | VARCHAR(4) | Требуемая память |
'' | ' ' | 4 байта | '' | 1 байт |
'ab' | 'ab ' | 4 байта | 'ab' | 3 байта |
'abcd' | 'abcd' | 4 байта | 'abcd' | 5 байтов |
'abcdefgh' | 'abcd' | 4 байта | 'abcd' | 5 байтов |
Извлеченные из столбцов
CHAR(4) и VARCHAR(4)
величины в каждом случае будут
одними и теми же, поскольку при
извлечении концевые пробелы из
столбца CHAR удаляются.
Если при создании таблицы не был
задан атрибут BINARY для
столбцов, то величины в столбцах
типа CHAR и VARCHAR
сортируются и сравниваются без
учета регистра. При задании
атрибута BINARY величины в
столбце сортируются и
сравниваются с учетом регистра в
соответствии с порядком таблицы
ASCII на том компьютере, где
работает сервер MySQL. Атрибут
BINARY не влияет на
процессы хранения или извлечения
данных из столбца.
Атрибут BINARY является
``прилипчивым''. Это значит, что,
если в каком-либо выражении
использовать столбец, помеченный
как BINARY, то сравнение
всего выражения будет
выполняться как сравнение
величины типа BINARY.
MySQL может без предупреждения
изменить тип столбца CHAR
или VARCHAR во время
создания таблицы. See
Раздел 6.5.3.1, «Молчаливые изменения определений столбцов».
Тип данных BLOB
представляет собой двоичный
объект большого размера, который
может содержать переменное
количество данных. Существуют 4
модификации этого типа -
TINYBLOB, BLOB,
MEDIUMBLOB и LONGBLOB,
отличающиеся только максимальной
длиной хранимых величин. See
Раздел 6.2.6, «Требования к памяти для различных типов столбцов».
Тип данных TEXT также
имеет 4 модификации -
TINYTEXT, TEXT,
MEDIUMTEXT и LONGTEXT,
соответствующие упомянутым
четырем типам BLOB и
имеющие те же максимальную длину
и требования к объему памяти.
Единственное различие между
типами BLOB и
TEXT состоит в том, что
сортировка и сравнение данных
выполняются с учетом регистра для
величин BLOB и без учета
регистра для величин
TEXT. Другими словами,
TEXT - это независимый от
регистра BLOB.
Если размер задаваемого в столбце
BLOB или TEXT
значения превосходит максимально
допустимую длину столбца, то это
значение соответствующим образом
усекается.
В большинстве случаев столбец
TEXT может
рассматриваться как столбец
VARCHAR неограниченного
размера. И, аналогично,
BLOB - как столбец типа
VARCHAR BINARY. Различия при
этом следующие:
Столбцы типов BLOB и
TEXT могут
индексироваться в версии MySQL
3.23.2 и более новых. Более старые
версии MySQL не поддерживают
индексацию этих столбцов.
В столбцах типов BLOB и
TEXT не производится
удаление концевых символов, как
это делается для столбцов типа
VARCHAR.
Для столбцов BLOB и
TEXT не может быть
задан атрибут DEFAULT -
значения величин по умолчанию.
В MyODBC величины типа BLOB
определяются как
LONGVARBINARY и величины типа
TEXT - как LONGVARCHAR.
Так как величины типов
BLOB и TEXT могут
быть чрезмерно большими, при их
использовании целесообразно
предусмотреть некоторые
ограничения:
Чтобы обеспечить возможность
использования команд GROUP
BY или ORDER BY в
столбце типа BLOB или
TEXT, необходимо
преобразовать значение столбца
в объект с фиксированной длиной.
Обычно это делается с помощью
функции SUBSTRING.
Например:
mysql>SELECT comment FROM tbl_name,SUBSTRING(comment,20) AS substr->ORDER BY substr;
Если этого не сделать, то
операция сортировки в столбце
будет выполнена только для
первых байтов, количество
которых задается параметром
max_sort_length. Значение по
умолчанию величины
max_sort_length равно
1024; это значение можно
изменить, используя параметр
-O сервера
mysqld при его запуске.
Группировка выражения,
включающего в себя величины
BLOB или TEXT,
возможна при указании позиции
столбца или использовании
псевдонима:
mysql>SELECT id,SUBSTRING(blob_col,1,100) FROM tbl_name GROUP BY 2;mysql>SELECT id,SUBSTRING(blob_col,1,100) AS b FROM tbl_name GROUP BY b;
Максимальный размер объекта
типа BLOB или
TEXT определяется его
типом, но наибольшее значение,
которое фактически может быть
передано между клиентом и
сервером, ограничено величиной
доступной памяти и размером
буферов связи. Можно изменить
размер буфера блока передачи,
но сделать это необходимо как
на стороне сервера, так и на
стороне клиента. See
Раздел 5.5.2, «Настройка параметров сервера».
Следует учитывать, что внутренним
представлением любой величины
типа BLOB или
TEXT является отдельно
размещенный объект - в
противоположность всем остальным
типам столбцов, для которых
память выделяется единовременно
для столбца при открытии таблицы.
ENUM (перечисление) - это столбец, который может принимать значение из списка допустимых значений, явно перечисленных в спецификации столбца в момент создания таблицы.
Этим значением также может быть пустая строка ("") или NULL при определенных условиях:
Если делается всавка некорректного значения в столбец ENUM (т.е. вставка строки, не перечисленной в списке допустимых), то вставляется пустая строка, что является указанием на ошибочное значение. Эта строка отличается от "обычной" пустой строки по тому признаку, что она имеет цифровое значение, равное 0. Об этом чуть ниже.
Если ENUM определяется как NULL, то тогда NULL тоже является допустимым значением столбца и значение по умолчанию - NULL. Если ENUM определяется как NOT NULL, то значением по умолчанию является первый элемент из списка допустимых значений.
Каждая величина из допустимы имеет индекс:
Значение из списка допустимых величин, определенных при создании таблицы нумеруются, начиная с 1.
Индекс пустой ошибочной строки - 0. Это означает что вы можете использовать следующий SELECT для того, чтобы найти записи, в которые были вставлены некорректные значения ENUM:
mysql> SELECT * FROM tbl_name WHERE enum_col=0;
Индекс значения NULL - NULL.
Например, столбец, определенный как ENUM("один", "два", "три") может иметь любую из перечисленных величин. Индекс каждой величины также известен:
| Величина | Индекс |
NULL | NULL |
"" | 0 |
"один" | 1 |
"два" | 2 |
"три" | 3 |
Перечисление может иметь максимум 65535 элементов.
Начиная с 3.23.51, оконечные пробелы автоматически удаляются из величин этого столбца в момент создания таблицы.
Регистр не играет роли, когда вы делаете вставку в столбец ENUM. Однако регистр значений, получаемых из этого столбца, совпадает с регистром в написании соответствующего значения, заданного во время создания таблицы.
Если вы делаете выборку столбца ENUM в числовом контексте, возвращается индекс значения. Например, вы можете получить численное значение ENUM таким образом:
mysql> SELECT enum_col+0 FROM tbl_name;
Если вы вставляете число в столбец ENUM, это число воспринимается как индекс, и в таблицу записывается соответствующее этому индексу значение перечисления. (Однако, это не будет работать с LOAD DATA, который воспринимает все входящие данные как строки.) Не рекомендуется сохранять числа в перечислении, т.к. это может привести к излишней путаннице.
Значения перечисления
сортируются в соответствии с
порядком, в котором допустимые
значения были заданы при создании
таблицы. (Другими словами,
значения ENUM сортируются в
соответствии с ихними индексами.)
Например, "a" в
отсортированном выводе будет
присутствовать раньше чем
"b" для ENUM("a",
"b"), но "b" появится
раньше "a" для
ENUM("b","a"). Пустые строки
возвращаются перед непустыми
строками, и NULL-значения будут
выведены в самую первую очередь.
Для предотвращения
неожиданностей, указывайте
список ENUM в алфавитном
порядке. Вы также можете
использовать GROUP BY
CONCAT(col) чтобы удостовериться,
что столбец отсортирован в
алфавитном порядке, а не по
индексу.
Если вам нужно получить список
возможных значения для столбца
ENUM, вы должны вызвать SHOW COLUMNS
FROM имя_таблицы LIKE
имя_столбца_enum и
проанализировать определение ENUM
во втором столбце.
SET - это строковый тип, который может принимать ноль или более значений, каждое из которых должно быть выбрано из списка допустимых значений, определенных при создании таблицы. Элементы множества SET разделяются запятыми. Как следствие, сами элементы множества не могут содержать запятых.
Например, столбец, определенный
как SET("один", "два") NOT NULL
может принимать такие значения:
"" "один" "два" "один,два"
Множество SET может иметь максимум 64 различных элемента.
Начиная с 3.23.51, оконечные пробелы удаляются из значений множества SET в момент создания таблицы.
MySQL сохраняет значения SET в численном виде, где младший бит сохраненной величины соответствует первому элементу множества. Если вы делаете выборку столбца SET в числовом контексте, полученное значение содержит соответствующим образом установленные биты, создающие значение столбца. Например, вы можете сделать выборку численного значения SET-столбца таким образом:
mysql> SELECT set_col+0 FROM tbl_name;
Если делается вставка в столбец
SET, биты, установленные в двоичном
представлении числа определяют
элементы множества. Допустим,
столбец определен как
SET("a","b","c","d"). Тогда
элементы имеют такие биты
установленными:
SET элемент | числовое значение | двоичное значение |
a | 1 | 0001 |
b | 2 | 0010 |
c | 4 | 0100 |
d | 8 | 1000 |
Если вы вставляет значение
9 в этот столбец, это
соответствует 1001 в
двоичном представлении, так что
первый ("a") и четвертый
("d") элементы множества
выбираются, что в результате дает
"a,d".
Для значения, содержащего более
чем один элемент множестве, не
играет никакой роли, в каком
порядке эти элементы
перечисляются в момент вставки
значения. Также не играет роли,
как много раз то или иное значение
перечислено. Когда позже это
значение выбирается, каждый
элемент будет присутствовать
только единожды, и элементы будут
перечислены в том порядке, в
котором они перечисляются в
определении таблицы. Например,
если столбец определен как
SET("a","b","c","d"), тогда
"a,d", "d,a", и
"d,a,a,d,d" будут
представлены как "a,d".
Если вы вставляете в столбец SET некорректую величины, это значение будет проигнорировано.
SET-значения сортируются в соответствии с числовым представлением. NULL-значения идут в первую очередь.
Обычно, следует выполнять
SELECT для SET-столбца,
используя оператор LIKE
или функцию FIND_IN_SET():
mysql>SELECT * FROM tbl_name WHERE set_col LIKE '%value%';mysql>SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;
Но и такая форма также работает:
mysql>SELECT * FROM tbl_name WHERE set_col = 'val1,val2';mysql>SELECT * FROM tbl_name WHERE set_col & 1;
Первый оператор в каждом примере делает выборку точного значения. Второй оператор делает выборку значений, содержащих первого элемента множества.
Если вам нужно получить все
возможные значения для столбца SET,
вам следует вызвать SHOW COLUMNS
FROM table_name LIKE set_column_name и
проанализировать SET-определение
во втором столбце.
Для того чтобы память
использовалась наиболее
эффективно, всегда следует
стараться применять тип данных,
обеспечивающий максимальную
точность. Например, для величин в
диапазоне между 1 и
99999 в целочисленном
столбце наилучшим типом будет
MEDIUMINT UNSIGNED.
Часто приходится сталкиваться с
такой проблемой, как точное
представление денежных величин. В
MySQL для представления таких
величин необходимо использовать
тип данных DECIMAL.
Поскольку данные этого типа
хранятся в виде строки, потерь в
точности не происходит. А в
случаях, когда точность не имеет
слишком большого значения, вполне
подойдет и тип данных
DOUBLE.
Если же требуется высокая
точность, всегда можно выполнить
конвертирование в тип данных с
фиксированной точкой. Такие данные
хранятся в виде BIGINT. Это
позволяет выполнять все
вычисления с ними как с целыми
числами, а впоследствии при
необходимости результаты можно
преобразовать обратно в величины с
плавающей точкой.
Чтобы облегчить использование SQL-кода, написанного для баз данных других поставщиков, в MySQL установлено соответствие типов столбцов, как показано в следующей таблице. Это соответствие упрощает применение описаний таблиц баз данных других поставщиков в MySQL:
| Тип иного поставщика | Тип MySQL |
BINARY(NUM) | CHAR(NUM) BINARY |
CHAR VARYING(NUM) | VARCHAR(NUM) |
FLOAT4 | FLOAT |
FLOAT8 | DOUBLE |
INT1 | TINYINT |
INT2 | SMALLINT |
INT3 | MEDIUMINT |
INT4 | INT |
INT8 | BIGINT |
LONG VARBINARY | MEDIUMBLOB |
LONG VARCHAR | MEDIUMTEXT |
MIDDLEINT | MEDIUMINT |
VARBINARY(NUM) | VARCHAR(NUM) BINARY |
Соотнесение типов столбцов
происходит во время создания
таблицы. При создании таблицы с
типами столбцов, которые
используются другими
поставщиками, после запуска
команды DESCRIBE имя_таблицы
выдается структура данной таблицы
с применением принятых в MySQL
эквивалентных типов.
Требования к объему памяти для столбцов каждого типа, поддерживаемого MySQL, перечислены ниже по категориям.
Требования к памяти для числовых типов
| Тип столбца | Требуемая память |
TINYINT | 1 byte |
SMALLINT | 2 байта |
MEDIUMINT | 3 байта |
INT | 4 байта |
INTEGER | 4 байта |
BIGINT | 8 байтов |
FLOAT(X) | 4, если X <= 24 или 8, если 25 <= X <= 53 |
FLOAT | 4 байта |
DOUBLE | 8 байтов |
DOUBLE PRECISION | 8 байтов |
REAL | 8 байтов |
DECIMAL(M,D) | M+2 байт, если D > 0,
M+1 байт, если D = 0
(D+2, если M <
D) |
NUMERIC(M,D) | M+2 байт, если D > 0,
M+1 байт, если D = 0
(D+2, если M <
D) |
Требования к памяти для типов даты и времени
| Тип столбца | Требуемая память |
DATE | 3 байта |
DATETIME | 8 байтов |
TIMESTAMP | 4 байта |
TIME | 3 байта |
YEAR | 1 байт |
Требования к памяти для символьных типов
| Тип столбца | Требуемая память |
CHAR(M) | M байт, 1 <= M <= 255 |
VARCHAR(M) | L+1 байт, где L <= M и
1 <= M <= 255 |
TINYBLOB, TINYTEXT | L+1 байт, где L < 2^8 |
BLOB, TEXT | L+2 байт, где L < 2^16 |
MEDIUMBLOB, MEDIUMTEXT | L+3 байт, где L < 2^24 |
LONGBLOB, LONGTEXT | L+4 байт, где L < 2^32 |
ENUM('value1','value2',...) | 1 или 2 байт, в зависимости от количества перечисляемых величин (максимум 65535) |
SET('value1','value2',...) | 1, 2, 3, 4 или 8 байт, в зависимости от количества элементов множества (максимум 64) |
VARCHAR, BLOB и
TEXT являются типами
данных с переменной длиной строки,
для таких типов требования к
памяти в общем случае определяются
реальным размером величин в
столбце (представлен символом
L в приведенной выше
таблице), а не максимально
возможным для данного типа
размером. Например, столбец
VARCHAR(10) может содержать
строку с максимальной длиной
10 символов. Реально
требуемый объем памяти равен длине
строки (L) плюс 1 байт для
записи длины строки. Для строки
'abcd' L равно 4 и
требуемый объем памяти равен 5
байтов.
В случае типов данных BLOB
и TEXT требуется 1, 2, 3 или 4
байта для записи длины значения
данного столбца в зависимости от
максимально возможной длины для
данного типа. See Раздел 6.2.3.2, «Типы данных BLOB и TEXT».
Если таблица включает в себя столбец какого-либо типа с переменной длиной строки, то формат записи также будет переменной длины. Следует учитывать, что при создании таблицы MySQL может при определенных условиях преобразовать тип столбца с переменной длиной в тип с постоянной длиной строки или наоборот. See Раздел 6.5.3.1, «Молчаливые изменения определений столбцов».
Размер объекта ENUM
определяется количеством
различных перечисляемых величин.
Один байт используется для
перечисления до 255
возможных величин. Используя два
байта, можно перечислить до
65535 величин. See
Раздел 6.2.3.3, «Тип перечисления ENUM ».
Размер объекта SET
определяется количеством
различных элементов множества.
Если это количество равно
N, то размер объекта
вычисляется по формуле
(N+7)/8 и полученное число
округляется до 1,
2, 3, 4
или 8 байтов. Множество
SET может иметь максимум
64 элемента. See
Раздел 6.2.3.4, «Тип множества SET ».
Максимальный размер записи в MyISAM
составляет 65534 байтов. Каждый
BLOB или
TEXT-столбец
засчитывается здесь как 5-9 байтов.
В команде SQL выражение SELECT
или определение WHERE могут
включать в себя любое выражение, в
котором используются описанные
ниже функции.
Выражение, содержащее NULL,
всегда будет давать в результате
величину NULL, если иное не
оговорено в документации для
операторов и функций,
задействованных в данном выражении.
Примечание: между именем функции и следующими за ним скобками не должно быть пробелов. Это поможет синтаксическому анализатору MySQL отличать вызовы функций от ссылок на таблицы или столбцы, имена которых случайно окажутся теми же, что и у функций. Однако допускаются пробелы до или после аргументов.
Если нужно, чтобы в MySQL допускались
пробелы после имени функции,
следует запустить mysqld с
параметром --ansi или
использовать CLIENT_IGNORE_SPACE в
mysql_connect(), но в этом случае
все имена функций станут
зарезервированными словами. See
Раздел 1.9.2, «Запуск MySQL в режиме ANSI».
В целях упрощения в данной
документации результат выполнения
программы mysql в примерах
представлен в сокращенной форме.
Таким образом вывод:
mysql> SELECT MOD(29,9);
1 rows in set (0.00 sec)
+-----------+
| mod(29,9) |
+-----------+
| 2 |
+-----------+
будет представлен следующим образом:
mysql> SELECT MOD(29,9);
-> 2
( ... )
Круглые скобки используются для задания порядка вычислений в выражении. Например:
mysql>SELECT 1+2*3;-> 7 mysql>SELECT (1+2)*3;-> 9
Операторы сравнения дают в
результате величину 1
(истина, TRUE), 0 (ложь, FALSE)
или NULL. Эти функции
работают как с числами, так и со
строками. Строки при
необходимости автоматически
преобразуются в числа, а числа - в
строки (как в Perl).
Операции сравнения в MySQL выполняются по следующим правилам:
Если один или оба аргумента -
NULL, то и результат
сравнения будет NULL.
Справедливо для всех
операторов кроме
<=>.
Если оба аргумента в операторе сравнения являются строками, то они сравниваются как строки.
Если оба аргумента - целые числа, то они сравниваются как целые числа.
Шестнадцатеричные величины, если они не сравниваются с числом, трактуются как строки с двоичными данными.
Если один из аргументов
представляет собой столбец
типа TIMESTAMP или
DATETIME, а второй
аргумент - константа, то
константа перед выполнением
сравнения преобразуется к типу
TIMESTAMP. Это сделано для
лучшей совместимости с ODBC.
Во всех других случаях аргументы сравниваются как действительные числа с плавающей точкой.
По умолчанию сравнение строк производится без учета регистра символов с использованием текущего набора символов (по умолчанию ISO-8859-1 Latin1, который, к тому же, прекрасно подходит для английского языка).
Ниже приведены примеры, иллюстрирующие преобразование строк в числа для операторов сравнения:
mysql>SELECT 1 > '6x';-> 0 mysql>SELECT 7 > '6x';-> 1 mysql>SELECT 0 > 'x6';-> 0 mysql>SELECT 0 = 'x6';-> 1
=
Равно:
mysql>SELECT 1 = 0;-> 0 mysql>SELECT '0' = 0;-> 1 mysql>SELECT '0.0' = 0;-> 1 mysql>SELECT '0.01' = 0;-> 0 mysql>SELECT '.01' = 0.01;-> 1
<>, !=
Не равно:
mysql>SELECT '.01' <> '0.01';-> 1 mysql>SELECT .01 <> '0.01';-> 0 mysql>SELECT 'zapp' <> 'zappp';-> 1
<=
Меньше или равно:
mysql> SELECT 0.1 <= 2;
-> 1
<
Меньше чем:
mysql> SELECT 2 < 2;
-> 0
>=
Больше или равно:
mysql> SELECT 2 >= 2;
-> 1
>
Больше чем:
mysql> SELECT 2 > 2;
-> 0
<=>
NULL-безопасное сравнение (равно):
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1 1 0
IS NULL, IS NOT
NULL
Тест для определения, является
величина равной NULL
или нет:
mysql>SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;-> 0 0 1 mysql>SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;-> 1 1 0
Для того, чтобы MySQL хорошо
работал с другими программами,
обеспечивается поддержка
следующих дополнительных
возможностей для функции IS
NULL:
Можно найти последнюю вставленную строку, используя выражение:
SELECT * FROM tbl_name WHERE auto_col IS NULL
Это свойство можно
блокировать установкой
SQL_AUTO_IS_NULL=0. See
Раздел 5.5.6, «Синтаксис команды SET».
Для данных типа NOT NULL
DATE и столбцов
DATETIME можно найти
особую дату 0000-00-00,
используя выражение:
SELECT * FROM tbl_name WHERE date_column IS NULL
Это необходимо для работы
некоторых приложений ODBC (так
как ODBC не поддерживает
значение даты
0000-00-00).
expr BETWEEN min AND max
Если величина выражения expr
больше или равна заданному
значению min и меньше
или равна заданному значению
max, то функция
BETWEEN возвращает
1, в противном случае -
0. Это эквивалентно
выражению (min <= expr AND expr <=
max), в котором все
аргументы представлены одним и
тем же типом данных. В противном
случае имеет место быть
преобразование типов так, как
сказано выше, но применительно
ко всем трем аргументами.
Внимание: до
4.0.5 аргументы приводились к
типу expr.
mysql>SELECT 1 BETWEEN 2 AND 3;-> 0 mysql>SELECT 'b' BETWEEN 'a' AND 'c';-> 1 mysql>SELECT 2 BETWEEN 2 AND '3';-> 1 mysql>SELECT 2 BETWEEN 2 AND 'x-3';-> 0
expr NOT BETWEEN min AND max
То же справедливо и для функции
NOT (expr BETWEEN min AND max).
expr IN (value,...)
Возвращает 1, если
выражение expr равно любой
величине из списка IN,
иначе - 0. Если все
величины - константы, то они
оцениваются в соответствии с
типом выражения expr и
сортируются. Поиск элемента в
этом случае производится
методом логического поиска. Это
означает, что функция
IN является очень
быстрой, если список значений
IN состоит полностью
из констант. Если expr является
зависимым от регистра
строковым выражением, то
сравнение строк производится с
учетом регистра:
mysql>SELECT 2 IN (0,3,5,'wefwf');-> 0 mysql>SELECT 'wefwf' IN (0,3,5,'wefwf');-> 1
Начиная с 4.1 (в соответствии со
стандартом SQL-99), IN
возвращает NULL не
только если выражение в левой
части является NULL, но
также если не найдено
соответствия в списке и одно из
выражений в списке является
величиной NULL.
expr NOT IN (value,...)
То же справедливо и для функции
NOT (expr IN (value,...)).
ISNULL(expr)
Если expr равно
NULL, то ISNULL()
возвращает 1, в
противном случае - 0:
mysql>SELECT ISNULL(1+1);-> 0 mysql>SELECT ISNULL(1/0);-> 1
Обратите внимание: при
сравнении величин NULL
с использованием оператора
= всегда будет
возвращаться значение
FALSE!
COALESCE(list)
Возвращает первый в списке
элемент со значением, не равным
NULL:
mysql>SELECT COALESCE(NULL,1);-> 1 mysql>SELECT COALESCE(NULL,NULL,NULL);-> NULL
INTERVAL(N,N1,N2,N3,...)
Возвращает 0, если
N < N1, и 1,
если N < N2, и так
далее. Все аргументы трактуются
как целые числа. Для корректной
работы этой функции необходимо
условие N1 < N2 < N3 < ... <
Nn. Это обусловлено тем, что
используется логический поиск
(очень быстрый):
mysql>SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);-> 3 mysql>SELECT INTERVAL(10, 1, 10, 100, 1000);-> 2 mysql>SELECT INTERVAL(22, 23, 30, 44, 200);-> 0
Если регистронезависимая строка
сравнивается с помощью любого
стандартного оператора
(=, <>, ..., но
не LIKE), то конечные
пустые символы (т.е. пробелы,
табуляторы и переводы строк)
игнорируются: игнорируется.
mysql> SELECT "a" ="A \n";
-> 1
В SQL, все логические операторы
возвращают TRUE (ИСТИНА), FALSE (ЛОЖЬ)
или NULL (UNKNOWN, неизвестно). В MySQL это
реализовано как 1 (TRUE,
ИСТИНА), 0 (FALSE, ЛОЖЬ) или
NULL. Это справедливо для
большинства SQL СУБД, однако
некоторые возвращают любое
положительное значение как
значение TRUE.
NOT, !
Логическое НЕ. Возвращает
1, если операнд равен
0, 0 если
операнд - ненулевая величина, и
NOT NULL возвращает
NULL.
mysql>SELECT NOT 10;-> 0 mysql>SELECT NOT 0;-> 1 mysql>SELECT NOT NULL;-> NULL mysql>SELECT ! (1+1);-> 0 mysql>SELECT ! 1+1;-> 1
Последний пример дает
1, поскольку данное
выражение вычисляется тем же
способом, что и (!1)+1.
AND, &&
Логическое И. Дает 1
если все операнды ненулевые и
не NULL, 0
если один или более операндов
равны 0, или
NULL в остальных
случаях.
mysql>SELECT 1 && 1;-> 1 mysql>SELECT 1 && 0;-> 0 mysql>SELECT 1 && NULL;-> NULL mysql>SELECT 0 && NULL;-> 0 mysql>SELECT NULL && 0;-> 0
Обратите внимание, что версии
MySQL до 4.0.5 прекращали
вычисление, встретив первый
NULL, вместо того, чтобы
продолжать вычисление
выражений с целью нахождения
возможных значений 0.
Это означает, что в этих версиях
выражение SELECT (NULL AND 0)
возвращает NULL вместо
0. В 4.0.5 код был
переписан так, чтобы
оптимизация сохранилась, но
результат всегда был таков, как
требует того ANSI.
OR, ||
Логическое ИЛИ. Возвращает
1, если любой из
операндов не 0,
NULL если один из
операндов NULL, в
остальных случаях возвращает
0.
mysql>SELECT 1 || 1;-> 1 mysql>SELECT 1 || 0;-> 1 mysql>SELECT 0 || 0;-> 0 mysql>SELECT 0 || NULL;-> NULL mysql>SELECT 1 || NULL;-> 1
XOR
Логический XOR (побитовое
сложение по модулю 2) Возвращает
NULL если любой из
операндов - NULL. Для
не-NULL операндов,
возвращает 1 если
нечетное количество операндов -
не 0.
mysql>SELECT 1 XOR 1;-> 0 mysql>SELECT 1 XOR 0;-> 1 mysql>SELECT 1 XOR NULL;-> NULL mysql>SELECT 1 XOR 1 XOR 1;-> 1
a XOR b математически
эквалиентно (a AND (NOT b)) OR ((NOT
a) and b).
XOR был реализован в
4.0.2.
IFNULL(expr1,expr2)
Если expr1 не равно
NULL, то функция
IFNULL() возвращает
значение expr1, в
противном случае -
expr2. В зависимости от
контекста функция
IFNULL() может
возвращать либо числовое, либо
строковое значение:
mysql>SELECT IFNULL(1,0);-> 1 mysql>SELECT IFNULL(NULL,10);-> 10 mysql>SELECT IFNULL(1/0,10);-> 10 mysql>SELECT IFNULL(1/0,'yes');-> 'yes'
В 4.0.6 и раньше по умолчанию
возвращал для
IFNULL(expr1,expr2) более
"общее" из двух выражений в
порядке STRING,
REAL или INTEGER.
Разница с более ранними
версиями MySQL больше всего
заметна тогда, когда вы
создаете таблицу, основанную на
выражении или MySQL внутренне
сохраняет величину, основанную
на выражении IFNULL() во
временной таблице.
CREATE TABLE foo SELECT IFNULL(1,"test") as test;
В 4.0.6 тип для столбца "test" -
CHAR(4) в то время как на
более ранних типом был бы
BIGINT.
NULLIF(expr1,expr2)
Если выражение expr1 =
expr2 истинно, то возвращает
NULL, в противном
случае - expr1.
Эквивалентна оператору CASE
WHEN x = y THEN NULL ELSE x END:
mysql>SELECT NULLIF(1,1);-> NULL mysql>SELECT NULLIF(1,2);-> 1
Отметим, что если аргументы не
равны, то величина expr1
вычисляется в MySQL дважды.
IF(expr1,expr2,expr3)
Если expr1 равно
значению ИСТИНА (expr1 <>
0 и expr1 <> NULL),
то функция IF()
возвращает expr2, в
противном случае -
expr3. В зависимости от
контекста функция IF()
может возвращать либо числовое,
либо строковое значение:
mysql>SELECT IF(1>2,2,3);-> 3 mysql>SELECT IF(1<2,'yes','no');-> 'yes' mysql>SELECT IF(STRCMP('test','test1'),'no','yes');-> 'no'
Если expr2 или
expr3 являются
NULL тогда
результирующим типом
IF() будет тип, который
не есть NULL. Это
нововведение в MySQL 4.0.3.
expr1 вычисляется как
целое число; это означает, что
при исследовании чисел с
плавающей точкой или строковых
величин в этой функции
необходимо использовать
операцию сравнения:
mysql>SELECT IF(0.1,1,0);-> 0 mysql>SELECT IF(0.1<>0,1,0);-> 1
В первом случае из приведенных
выше функция IF(0.1)
возвращает 0, так как
0.1 преобразуется в
целое число и в результате
выполняется функция
IF(0). Но это вовсе не
то, что должно было бы
получиться. Во втором случае
исходная величина с плавающей
точкой исследуется при помощи
оператора сравнения, чтобы
определить, является ли она
ненулевой, и в качестве
аргумента функции используется
результат сравнения - целое
число. В версии MySQL 3.23
возвращаемый по умолчанию тип
функции IF() (это может
иметь значение при сохранении
его во временной таблице)
вычисляется, как показано ниже:
| Выражение | Возвращаемая величина |
| expr2 или expr3 возвращает строку | строка |
| expr2 or expr3 возвращает величину с плавающей точкой | с плавающей точкой |
| expr2 or expr3 возвращает целое число | целое число |
Если expr2 и
expr3 являются
строками, и обе
регистро-независимы, то и
результат является
регистро-независимым (начиная с
3.23.51).
CASE value WHEN [compare-value] THEN result [WHEN
[compare-value] THEN result ...] [ELSE result]
END, CASE WHEN [condition] THEN result
[WHEN [condition] THEN result ...] [ELSE result]
END
В первом варианте возвращается
значение result, если
value=compare-value. Во втором
- результат для первого
указанного условия
condition, если оно
истинно. Если соответствующая
величина результата не
определена, то возвращается
значение result,
указанное после оператора
ELSE. Если часть
ELSE в выражении
отсутствует, возвращается
NULL:
mysql>SELECT CASE 1 WHEN 1 THEN "one"WHEN 2 THEN "two" ELSE "more" END; -> "one" mysql>SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END;-> "true" mysql>SELECT CASE BINARY "B" WHEN "a" THEN 1 WHEN "b" THEN 2 END;-> NULL
Тип возвращаемой величины будет
такой же (INTEGER,
DOUBLE или STRING),
как и у первой возвращаемой
величины (выражение после первого
оператора THEN).
Строковые функции возвращают
NULL, если длина
результата оказывается больше, чем
указано в значении серверного
параметра max_allowed_packet. See
Раздел 5.5.2, «Настройка параметров сервера».
Для функций, работающих с позициями в строке, нумерация позиций начинается с 1.
Возвращает значение ASCII-кода
крайнего слева символа строки
str; 0 если
str является пустой
строкой; NULL, если
str равна NULL:
mysql>SELECT ASCII('2');-> 50 mysql>SELECT ASCII(2);-> 50 mysql>SELECT ASCII('dx');-> 100
См. также функцию ORD().
ORD(str)
Если крайний слева символ строки
str представляет собой
многобайтный символ, то данная
функция возвращает его код,
который вычисляется на основе
ASCII-кодов составляющих его
символов по формуле: ((первый
байт ASCII-кода)*256+(второй байт
ASCII-кода))[*256+третий байт
ASCII-кода...]. Если крайний слева
символ не является многобайтным,
то данная функция возвращает то
же значение, что и ASCII():
mysql> SELECT ORD('2');
-> 50
CONV(N,from_base,to_base)
Преобразует числа из одной
системы счисления в другую.
Возвращает строковое
представление числа N,
преобразованного из системы
счисления с основой
from_base в систему
счисления с основой
to_base. Если хотя бы один
из аргументов равен
NULL, то возвращается
NULL. Аргумент
N интерпретируется как
целое число, но может быть задан
как целое число или строка.
Минимальное значение основы
системы счисления равно
2, а максимальное -
36. Если аргумент
to_base представлен
отрицательным числом, то
принимается, что N -
число со знаком. В противном
случае N трактуется
как беззнаковое число. Функция
CONV работает с
64-битовой точностью:
mysql>SELECT CONV("a",16,2);-> '1010' mysql>SELECT CONV("6E",18,8);-> '172' mysql>SELECT CONV(-17,10,-18);-> '-H' mysql>SELECT CONV(10+"10"+'10'+0xa,10,10);-> '40'
BIN(N)
Возвращает строку,
представляющую двоичную
величину N, где
N - целое число
большого размера (BIGINT).
Эквивалентна функции
CONV(N,10,2). Если
N равно NULL,
возвращается NULL:
mysql> SELECT BIN(12);
-> '1100'
OCT(N)
Возвращает строковое
представление восьмеричного
значения числа N, где
N - целое число
большого размера. Эквивалентно
функции CONV(N,10,8). Если
N равно NULL,
возвращается NULL:
mysql> SELECT OCT(12);
-> '14'
HEX(N_or_S)
Если N_OR_S - число, то
возвращается строковое
представление
шестнадцатеричного числа
N, где N -
целое число большого размера
(BIGINT). Эквивалентна
функции CONV(N,10,16). Если
N_OR_S - строка, то
функция возвращает
шестнадцатеричную строку
N_OR_S, где каждый символ
в N_OR_S конвертируется в
2 шестнадцатеричных числа.
Является обратной по отношению к
строкам 0xff.
mysql>SELECT HEX(255);-> 'FF' mysql>SELECT HEX("abc");-> 616263 mysql>SELECT 0x616263;-> "abc"
CHAR(N,...)
CHAR() интерпретирует
аргументы как целые числа и
возвращает строку, состоящую из
символов, соответствующих
ASCII-коду этих чисел. Величины
NULL пропускаются:
mysql>SELECT CHAR(77,121,83,81,'76');-> 'MySQL' mysql>SELECT CHAR(77,77.3,'77.3');-> 'MMM'
CONCAT(str1,str2,...)
Возвращает строку, являющуюся
результатом конкатенации
аргументов. Если хотя бы один из
аргументов равен NULL,
возвращается NULL. Может
принимать более 2 аргументов.
Числовой аргумент преобразуется
в эквивалентную строковую форму:
mysql>SELECT CONCAT('My', 'S', 'QL');-> 'MySQL' mysql>SELECT CONCAT('My', NULL, 'QL');-> NULL mysql>SELECT CONCAT(14.3);-> '14.3'
CONCAT_WS(separator, str1, str2,...)
Функция CONCAT_WS()
обозначает CONCAT With
Separator (конкатенация с
разделителем) и представляет
собой специальную форму функции
CONCAT(). Первый аргумент
является разделителем для
остальных аргументов.
Разделитель, так же как и
остальные аргументы, может быть
строкой. Если разделитель равен
NULL, то результат будет
NULL. Данная функция
будет пропускать все величины
NULL и пустые строки,
расположенные после
аргумента-разделителя.
Разделитель будет добавляться
между строками, подлежащими
конкатенации:
mysql>SELECT CONCAT_WS(",","First name","Second name","Last Name");-> 'First name,Second name,Last Name' mysql>SELECT CONCAT_WS(",","First name",NULL,"Last Name");-> 'First name,Last Name'
LENGTH(str),
OCTET_LENGTH(str),
CHAR_LENGTH(str),
CHARACTER_LENGTH(str)
Возвращает длину строки str:
mysql>SELECT LENGTH('text');-> 4 mysql>SELECT OCTET_LENGTH('text');-> 4
Обратите внимание: для
CHAR_LENGTH() и
CHARACTER_LENGTH()
многобайтные символы
учитываются только однажды.
BIT_LENGTH(str)
Возвращает длину строки
str в битах:
mysql> SELECT BIT_LENGTH('text');
-> 32
LOCATE(substr,str),
POSITION(substr IN str)
Возвращает позицию первого
вхождения подстроки
substr в строку
str. Если подстрока substr
в строке str
отсутствует, возвращается
0:
mysql>SELECT LOCATE('bar', 'foobarbar');-> 4 mysql>SELECT LOCATE('xbar', 'foobar');-> 0
Данная функция поддерживает многобайтные величины. В MySQL 3.23 эта функция чувствительна к регистру, а в 4.0 она чувствительна к регистру только в случае, если хотя бы один из аргументов является строкой с двоичными данными.
LOCATE(substr,str,pos)
Возвращает позицию первого
вхождения подстроки
substr в строку
str, начиная с позиции
pos. Если подстрока
substr в строке
str отсутствует,
возвращается 0:
mysql> SELECT LOCATE('bar', 'foobarbar',5);
-> 7
Данная функция поддерживает многобайтные величины. В MySQL 3.23 эта функция чувствительна к регистру, а в 4.0 она чувствительна к регистру, только в случае, если хотя бы один из аргументов является строкой с двоичными данными.
INSTR(str,substr)
Возвращает позицию первого
вхождения подстроки
substr в строку
str. То же, что и
двухаргументная форма функции
LOCATE(), за исключением
перемены мест аргументов:
mysql>SELECT INSTR('foobarbar', 'bar');-> 4 mysql>SELECT INSTR('xbar', 'foobar');-> 0
Данная функция поддерживает многобайтные величины. В MySQL 3.23 эта функция чувствительна к регистру, а в 4.0 она чувствительна к регистру только в случае, если хотя бы один из аргументов является строкой с двоичными данными.
LPAD(str,len,padstr)
Возвращает строку str,
которая дополняется слева
строкой padstr, пока
строка str не достигнет
длины len символов. Если
строка str длиннее, чем
len, то она будет
укорочена до len
символов.
mysql> SELECT LPAD('hi',4,'??');
-> '??hi'
RPAD(str,len,padstr)
Возвращает строку str,
которая дополняется справа
строкой padstr, пока
строка str не достигнет
длины len символов. Если
строка str длиннее, чем
len, то она будет
укорочена до len
символов.
mysql> SELECT RPAD('hi',5,'?');
-> 'hi???'
LEFT(str,len)
Возвращает крайние слева
len символов из строки
str:
mysql> SELECT LEFT('foobarbar', 5);
-> 'fooba'
Данная функция поддерживает многобайтные величины.
RIGHT(str,len)
Возвращает крайние справа
len символов из строки
str:
mysql> SELECT RIGHT('foobarbar', 4);
-> 'rbar'
Данная функция поддерживает многобайтные величины.
SUBSTRING(str,pos,len),
SUBSTRING(str FROM pos FOR len),
MID(str,pos,len)
Возвращает подстроку длиной
len символов из строки
str, начиная от позиции
pos. Существует форма с
оператором FROM, для
которой используется синтаксис
ANSI SQL92:
mysql> SELECT SUBSTRING('Quadratically',5,6);
-> 'ratica'
Данная функция поддерживает многобайтные величины.
SUBSTRING(str,pos),
SUBSTRING(str FROM pos)
Возвращает подстроку из строки
str, начиная с позиции
pos:
mysql>SELECT SUBSTRING('Quadratically',5);-> 'ratically' mysql>SELECT SUBSTRING('foobarbar' FROM 4);-> 'barbar'
Данная функция поддерживает многобайтные величины.
SUBSTRING_INDEX(str,delim,count)
Возвращает подстроку из строки
str перед появлениям
count вхождений
разделителя delim. Если
count положителен, то
возвращается все, что находится
слева от последнего разделителя
(считая слева). Если count
отрицателен, то возвращается
все, что находится справа от
последнего разделителя (считая
справа):
mysql>SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);-> 'www.mysql' mysql>SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);-> 'mysql.com'
Данная функция поддерживает многобайтные величины.
LTRIM(str)
Возвращает строку str с
удаленными начальными
пробелами:
mysql> SELECT LTRIM(' barbar');
-> 'barbar'
Данная функция поддерживает многобайтные величины.
RTRIM(str)
Возвращает строку str с
удаленными конечными пробелами:
mysql> SELECT RTRIM('barbar ');
-> 'barbar'
Данная функция поддерживает многобайтные величины.
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM]
str)
Возвращает строку str с
удаленными всеми префиксами
и/или суффиксами, указанными в
remstr. Если не указан ни
один из спецификаторов
BOTH, LEADING или
TRAILING, то
подразумевается BOTH.
Если аргумент remstr не
задан, то удаляются пробелы:
mysql>SELECT TRIM(' bar ');-> 'bar' mysql>SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');-> 'barxxx' mysql>SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');-> 'bar' mysql>SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');-> 'barx'
Данная функция поддерживает многобайтные величины.
SOUNDEX(str)
Возвращает саундекс от str.
Soundex - ``идентификатор звучания строки''. Словосочетания ``К скалам бурым'' и ``С каламбуроми'' должны давать одинаковый саундекс, т.к. на слух они звучат одинаково. Заметим, однако, что этой функции для русского языка не существует. MySQL нуждается в ней, и если кто-то может предоставить алгоритм саундекса на русском языке - свяжитесь с нами. - Прим. переводчика.
Две созвучные строки, создающие
впечатление почти одинаковых,
могут иметь идентичные
саундексы. Обычно стандартная
саундекс-строка имеет длину 4
символа, но функция
SOUNDEX() возвращает
строку произвольной длины. Можно
использовать функцию
SUBSTRING() для извлечения
стандартного саундекса строки
из результата функции
SOUNDEX(). В строке
str игнорируются все
символы, не являющиеся буквами
или цифрами. Все международные
буквенные символы, не входящие в
диапазон A-Z,
трактуются как гласные:
mysql>SELECT SOUNDEX('Hello');-> 'H400' mysql>SELECT SOUNDEX('Quadratically');-> 'Q36324'
SPACE(N)
Возвращает строку, состоящую из
N пробелов:
mysql> SELECT SPACE(6);
-> ' '
REPLACE(str,from_str,to_str)
Возвращает строку str, в
которой все вхождения строки
from_str заменены на
to_str:
mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
-> 'WwWwWw.mysql.com'
Данная функция поддерживает многобайтные величины.
REPEAT(str,count)
Возвращает строку, состоящую из
строки str, повторенной
count раз. Если значение
count <= 0, возвращает
пустую строку. Возвращает
NULL, если str
или count равны
NULL:
mysql> SELECT REPEAT('MySQL', 3);
-> 'MySQLMySQLMySQL'
REVERSE(str)
Возвращает строку str с
обратным порядком символов:
mysql> SELECT REVERSE('abc');
-> 'cba'
Данная функция поддерживает многобайтные величины.
INSERT(str,pos,len,newstr)
Возвращает строку str, в
которой подстрока начиная с
позиции pos, имеющая
длину len замещена на
newstr:
mysql> SELECT INSERT('Quadratic', 3, 4, 'What');
-> 'QuWhattic'
Данная функция поддерживает многобайтные величины.
ELT(N,str1,str2,str3,...)
Возвращает str1, если
N = 1, str2, если
N = 2, и так далее. Если
N меньше, чем
1 или больше, чем число
аргументов, возвращается
NULL. Функция
ELT() является
дополненительной по отношению к
функции FIELD():
mysql>SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo');-> 'ej' mysql>SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo');-> 'foo'
FIELD(str,str1,str2,str3,...)
Возвращает индекс строки
str в списке str1, str2,
str3, .... Если строка
str не найдена,
возвращается 0.
Функция FIELD() является
дополнительной по отношению к
функции ELT():
mysql>SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');-> 2 mysql>SELECT FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');-> 0
FIND_IN_SET(str,strlist)
Возвращает значение от
1 до N, если
строка str присутствует
в списке strlist,
состоящем из N
подстрок. Список строк
представляет собой строку,
состоящую из подстрок,
разделенных символами
‘,’. Если первый
аргумент представляет собой
строку констант, а второй
является столбцом типа
SET, функция
FIND_IN_SET()
оптимизируется для
использования двоичной
арифметики! Возвращает
0, если str
отсутствует в списке
strlist или если
strlist является пустой
строкой. Если один из аргументов
равен NULL, возвращается
0. Данная функция не
будет корректно работать, если
первый аргумент содержит символ
‘,’:
mysql> SELECT FIND_IN_SET('b','a,b,c,d');
-> 2
MAKE_SET(bits,str1,str2,...)
Возвращает множество (строку,
содержащую подстроки,
разделенные символами
‘,’), состоящее из
строк, имеющих соответствующий
бит в наборе bits.
Аргумент str1
соответствует биту 0,
str2 - биту 1, и
так далее. Нулевые строки в
наборах str1,
str2, ... не
прибавляются к результату:
mysql>SELECT MAKE_SET(1,'a','b','c');-> 'a' mysql>SELECT MAKE_SET(1 | 4,'hello','nice','world');-> 'hello,world' mysql>SELECT MAKE_SET(0,'a','b','c');-> ''
EXPORT_SET(bits,on,off,[separator,[number_of_bits]])
Возвращает строку, где для
каждому установленному биту в
аргументе bits
соответствует строка
on, а каждому
сброшенному биту - off.
Каждая строка отделена
разделителем, указанным в
параметре separator (по
умолчанию - ‘,’),
причем используется только
количество битов, заданное
аргументом number_of_bits (по
умолчанию 64), из всего
количества, указанного в
bits:
mysql> SELECT EXPORT_SET(5,'Y','N',',',4)
-> Y,N,Y,N
LCASE(str),
LOWER(str)
Возвращает строку str, в
которой все символы переведены в
нижний регистр в соответствии с
текущей установкой набора
символов (по умолчанию - ISO-8859-1
Latin1):
mysql> SELECT LCASE('QUADRATICALLY');
-> 'quadratically'
Данная функция поддерживает многобайтные величины.
UCASE(str),
UPPER(str)
Возвращает строку str, в
которой все символы переведены в
верхний регистр в соответствии с
текущей установкой набора
символов (по умолчанию - ISO-8859-1
Latin1):
mysql> SELECT UCASE('Hej');
-> 'HEJ'
Данная функция поддерживает многобайтные величины.
LOAD_FILE(file_name)
Читает заданный файл и
возвращает его содержимое в виде
строки. Данный файл должен
находится на сервере, должен
быть указан полный путь к этому
файлу и пользователь должен
обладать привилегией
FILE. Размер данного
файла должен быть меньше
указанного в
max_allowed_packet и файл
должен быть открыт для чтения
для всех. Если файл не существует
или не может быть прочитан по
одной из вышеупомянутых причин,
то функция возвращает
NULL:
mysql> UPDATE tbl_name
SET blob_column=LOAD_FILE("/tmp/picture")
WHERE id=1;
При использовании версии MySQL,
отличной от 3.23, чтение файла
необходимо выполнять внутри
вашего приложения и
использовать команду
INSERT для внесения в
базу данных информации,
содержащейся в файле. Один из
путей реализации этого с
использованием библиотеки
MySQL++ можно найти на
http://www.mysql.com/documentation/mysql++/mysql++-examples.html.
QUOTE(str)
Экранирует строку с тем, чтобы
получить корректное значение
для SQL-выражения. Строка
заключается в одинарные кавычки,
и каждое вхождение одинарной
кавычки (‘'’),
обратного слеша
(‘\’), значения ASCII
NUL и Control-Z экранируются обратным
слешом. Если аргумент -
NULL, то тогда
результатом будет слово "NULL" без
окружающих кавычек.
mysql>SELECT QUOTE("Don't");-> 'Don\'t!' mysql>SELECT QUOTE(NULL);-> NULL
MySQL при необходимости автоматически конвертирует числа в строки и наоборот:
mysql>SELECT 1+"1";-> 2 mysql>SELECT CONCAT(2,' test');-> '2 test'
Для преобразования числа в строку
явным образом, необходимо передать
его в качестве аргумента функции
CONCAT().
Если строковая функция содержит в качестве аргумента строку с двоичными данными, то и результирующая строка также будет строкой с двоичными данными. При этом число, конвертированное в строку, воспринимается как строка с двоичными данными. Это имеет значение только при выполнении операций сравнения.
Обычно если при выполнении сравнения строк одно из выражений является зависимым от регистра, то сравнение выполняется также с учетом регистра.
expr LIKE pat [ESCAPE 'escape-char']
Функция производит сравнение с
шаблоном, используя операции
сравнения простых регулярных
выражений в SQL. Возвращает
1 (ИСТИНА) или
0 (ЛОЖЬ). Выражение
LIKE предусматривает
использование следующих двух
шаблонных символов в
pat:
| Символ | Описание |
% | Соответствует любому количеству символов, даже нулевых |
_ | Соответствует ровно одному символу |
mysql>SELECT 'David!' LIKE 'David_';-> 1 mysql>SELECT 'David!' LIKE '%D%v%';-> 1 mysql>select TRUNCATE(-1.999,1);-> -1.9
Начиная с MySQL 3.23.51 все числа округляются к нулю.
Если D является
негативным, то тогда вся часть
числа округляется к нулю.
mysql> select truncate(122,-2);
-> 100
Если требуется исследовать
литералы при помощи шаблонного
символа, следует предварить
шаблонный символ экранирующим
символом. Если экранирующий
символ конкретно не
указывается, то
подразумевается применение
символа ‘\’:
| Строка | Описание |
\% | Соответствует одному символу
‘%’ |
\_ | Соответствует одному символу
‘_’ |
mysql>SELECT 'David!' LIKE 'David\_';-> 0 mysql>SELECT 'David_' LIKE 'David\_';-> 1
Для указания конкретного
экранирующего символа
используется выражение
ESCAPE:
mysql> SELECT 'David_' LIKE 'David|_' ESCAPE '|';
-> 1
В следующих двух примерах показано, что сравнение строк производится с учетом регистра, если ни один из операндов не является строкой с двоичными данными:
mysql>SELECT 'abc' LIKE 'ABC';-> 1 mysql>SELECT 'abc' LIKE BINARY 'ABC';-> 0
В функции LIKE
допускаются даже числовые
выражения! (Это расширение MySQL
по сравнению с ANSI SQL LIKE.)
mysql> SELECT 10 LIKE '1%';
-> 1
Примечание: поскольку в MySQL
применяются правила
экранирования в строках,
применяемые в языке C (например,
'\n'), необходимо
дублировать все символы
‘\’,
используемые в строках функции
LIKE. Например, для
поиска сочетания символов
'\n' его необходимо
указать как '\\n'. Чтобы
выполнить поиск символа
‘\’, он должен
быть указан как '\\\\'
(обратные слеши удаляются
дважды: сначала синтаксическим
анализатором, а потом - при
выполнении сравнения с
шаблоном, таким образом
остается только один обратный
слеш, который и будет
обрабатываться).
expr NOT LIKE pat [ESCAPE
'escape-char']
То же, что и NOT (expr LIKE pat [ESCAPE
'escape-char']).
expr SOUNDS LIKE expr
Тоже самое что и
SOUNDEX(expr)=SOUNDEX(expr)
(доступно в версии 4.1 или новее).
expr REGEXP pat, expr RLIKE
pat
Выполняет сравнение строкового
выражения expr с
шаблоном pat. Шаблон
может представлять собой
расширенное регулярное
выражение. See Приложение G, Регулярные выражения в MySQL.
Возвращает 1, если
expr соответствует
pat, в противном случае
- 0. Функция
RLIKE является
синонимом для REGEXP,
она предусмотрена для
совместимости с mSQL. Примечание:
поскольку в MySQL используются
правила экранирования в
строках, применяемые в языке C
(например, '\n'),
необходимо дублировать все
символы ‘\’,
используемые в строках функции
REGEXP. Что касается
версии MySQL 3.23.4, функция
REGEXP является
независимой от регистра для
нормальных строк (т.е. строк не с
двоичными данными):
mysql>SELECT 'Monty!' REGEXP 'm%y%%';-> 0 mysql>SELECT 'Monty!' REGEXP '.*';-> 1 mysql>SELECT 'new*\n*line' REGEXP 'new\\*.\\*line';-> 1 mysql>SELECT "a" REGEXP "A", "a" REGEXP BINARY "A";-> 1 0 mysql>SELECT "a" REGEXP "^[a-d]";-> 1
В REGEXP и RLIKE
используется текущий набор
символов (ISO-8859-1 Latin1 по
умолчанию),
expr NOT REGEXP pat, expr NOT
RLIKE pat
То же, что и NOT (expr REGEXP
pat).
STRCMP(expr1,expr2)
Функция STRCMP()
возвращает: 0, если
строки идентичны, -1 -
если первый аргумент меньше
второго (в соответствии с
имеющимся порядком сортировки),
и 1 - в остальных
случаях:
mysql>SELECT STRCMP('text', 'text2');-> -1 mysql>SELECT STRCMP('text2', 'text');-> 1 mysql>SELECT STRCMP('text', 'text');-> 0
MATCH (col1,col2,...) AGAINST (expr),
MATCH (col1,col2,...) AGAINST (expr IN BOOLEAN
MODE)
Функция MATCH ... AGAINST()
используется для
полнотекстового поиска и
возвращает величину
релевантности - степень
сходства между текстом в
столбцах (col1,col2,...) и
запросом expr. Величина
релевантности представляет
собой положительное число с
плавающей точкой. Нулевая
релевантность означает
отсутствие сходства. Функция
MATCH ... AGAINST() работает в
версиях MySQL 3.23.23 или более
поздних. Расширение IN BOOLEAN
MODE было добавлено в версии
4.0.1. Более подробное описание и
примеры использования
приведены в разделе
Раздел 6.8, «Полнотекстовый поиск в MySQL».
BINARY
Оператор BINARY
преобразует следующую за ним
строку в строку с двоичными
данными. Это простой способ
обеспечить сравнение в столбце
с учетом регистра, даже если
данный столбец не определен как
BINARY или BLOB:
mysql>SELECT "a" = "A";-> 1 mysql>SELECT BINARY "a" = "A";-> 0
BINARY string является
сокращением для CAST(string AS
BINARY). See Раздел 6.3.5, «Функции приведения типов».
Оператор BINARY был
введен в версии MySQL 3.23.0. Следует
учитывать, что при приведении
индексированного столбца к
типу BINARY MySQL в
некоторых случаях не сможет
эффективно использовать
индексы.
Для сравнения двоичных данных
типа BLOB без учета
регистра данные с типом
BLOB перед выполнением
сравнения всегда можно
конвертировать в верхний
регистр:
SELECT 'A' LIKE UPPER(blob_col) FROM table_name;
В скором времени мы планируем ввести преобразование между различными кодировками, чтобы сделать сравнение строк еще более гибким.
В MySQL можно применять обычные
арифметические операторы.
Следует иметь в виду, что если оба
аргумента являются целыми
числами, то при использовании
операторов ‘-’,
‘+’ и
‘*’ результат
вычисляется с точностью
BIGINT (64 бита). Если один
из аргументов - беззнаковое целое
число, а второй аргумент - также
целое число, то результат будет
беззнаковым целым числом. See
Раздел 6.3.5, «Функции приведения типов».
+
Сложение:
mysql> SELECT 3+5;
-> 8
-
Вычитание:
mysql> SELECT 3-5;
-> -2
*
Умножение:
mysql>SELECT 3*5;-> 15 mysql>SELECT 18014398509481984*18014398509481984.0;-> 324518553658426726783156020576256.0 mysql>SELECT 18014398509481984*18014398509481984;-> 0
В последнем выражении мы
получим неверный результат, так
как произведение умножения
целых чисел выходит за границы
64-битового диапазона для
вычислений с точностью
BIGINT.
/
Деление:
mysql> SELECT 3/5;
-> 0.60
Деление на ноль приводит к
результату NULL:
mysql> SELECT 102/(1-1);
-> NULL
Деление будет выполняться по
правилам
BIGINT-арифметики
только в случае, если эта
операция представлена в
контексте, где ее результат
преобразуется в INTEGER!
Все математические функции в
случае ошибки возвращают
NULL.
-
Унарный минус. Изменяет знак аргумента:
mysql> SELECT - 2;
-> -2
Необходимо учитывать, что если
этот оператор используется с
данными типа BIGINT,
возвращаемое значение также
будет иметь тип BIGINT!
Это означает, что следует
избегать использования
оператора для целых чисел,
которые могут иметь величину
-2^63!
ABS(X)
Возвращает абсолютное значение
величины X:
mysql>SELECT ABS(2);-> 2 mysql>SELECT ABS(-32);-> 32
Эту функцию можно уверенно
применять для величин типа
BIGINT.
SIGN(X)
Возвращает знак аргумента в
виде -1, 0
или 1, в зависимости
от того, является ли X
отрицательным, нулем или
положительным:
mysql>SELECT SIGN(-32);-> -1 mysql>SELECT SIGN(0);-> 0 mysql>SELECT SIGN(234);-> 1
MOD(N,M), %
Значение по модулю (подобно
оператору % в C).
Возвращает остаток от деления
N на M:
mysql>SELECT MOD(234, 10);-> 4 mysql>SELECT 253 % 7;-> 1 mysql>SELECT MOD(29,9);-> 2
Эту функцию можно уверенно
применять для величин типа
BIGINT.
FLOOR(X)
Возвращает наибольшее целое
число, не превышающее
X:
mysql>SELECT FLOOR(1.23);-> 1 mysql>SELECT FLOOR(-1.23);-> -2
Следует учитывать, что
возвращаемая величина
преобразуется в BIGINT!
CEILING(X)
Возвращает наименьшее целое
число, не меньшее, чем
X:
mysql>SELECT CEILING(1.23);-> 2 mysql>SELECT CEILING(-1.23);-> -1
Следует учитывать, что
возвращаемая величина
преобразуется в BIGINT!
ROUND(X)
Возвращает аргумент
X, округленный до
ближайшего целого числа:
mysql>SELECT ROUND(-1.23);-> -1 mysql>SELECT ROUND(-1.58);-> -2 mysql>SELECT ROUND(1.58);-> 2
Следует учитывать, что
поведение функции
ROUND() при значении
аргумента, равном середине
между двумя целыми числами,
зависит от конкретной
реализации библиотеки C.
Округление может выполняться: к
ближайшему четному числу,
всегда к ближайшему большему,
всегда к ближайшему меньшему,
всегда быть направленным к
нулю. Чтобы округление всегда
происходило только в одном
направлении, необходимо
использовать вместо данной
хорошо определенные функции,
такие как TRUNCATE() или
FLOOR().
ROUND(X,D)
Возвращает аргумент
X, округленный до
числа с D десятичными
знаками. Если D равно
0, результат будет
представлен без десятичного
знака или дробной части:
mysql>SELECT ROUND(1.298, 1);-> 1.3 mysql>SELECT ROUND(1.298, 0);-> 1
EXP(X)
Возвращает значение e
(основа натуральных
логарифмов), возведенное в
степень X:
mysql>SELECT EXP(2);-> 7.389056 mysql>SELECT EXP(-2);-> 0.135335
LN(X)
Возвращает натуральный
логарифм числа X:
mysql>SELECT LN(2);-> 0.693147 mysql>SELECT LN(-2);-> NULL
Эта функция появилась в MySQL 4.0.3.
Это синоним LOG(X).
LOG(B, X)
Если вызывается с одним
параметром, возвращает
натуральный логарифм числа
X:
mysql>SELECT LOG(2);-> 0.693147 mysql>SELECT LOG(-2);-> NULL
Если вызывается с двумя
параметрами, функция
возвращает логарифм числа
X по базе B:
mysql>SELECT LOG(2,65536);-> 16.000000 mysql>SELECT LOG(1,100);-> NULL
Опция указания базы логарифма
появилась в MySQL 4.0.3.
LOG(B,X) эквалиентно
LOG(X)/LOG(B).
LOG2(X)
Возвращает логарифм числа
X по базе 2:
mysql>SELECT LOG2(65536);-> 16.000000 mysql>SELECT LOG2(-100);-> NULL
Функция LOG2() полезна с
тем, чтобы узнать, сколько бит
число потребует для хранения.
Эта функция добавлена в MySQL 4.0.3.
В более старых версиях
вызывайте вместо нее:
LOG(X)/LOG(2)
LOG10(X)
Возвращает десятичный логарифм
числа X:
mysql>SELECT LOG10(2);-> 0.301030 mysql>SELECT LOG10(100);-> 2.000000 mysql>SELECT LOG10(-100);-> NULL
POW(X,Y),
POWER(X,Y)
Возвращает значение аргумента
X, возведенное в
степень Y:
mysql>SELECT POW(2,2);-> 4.000000 mysql>SELECT POW(2,-2);-> 0.250000
SQRT(X)
Возвращает неотрицательный
квадратный корень числа
X:
mysql>SELECT SQRT(4);-> 2.000000 mysql>SELECT SQRT(20);-> 4.472136
PI()
Возвращает значение числа "пи". По умолчанию представлено 5 десятичных знаков, но в MySQL для представления числа "пи" при внутренних вычислениях используется полная двойная точность.
mysql>SELECT PI();-> 3.141593 mysql>SELECT PI()+0.000000000000000000;-> 3.141592653589793116
COS(X)
Возвращает косинус числа
X, где X
задается в радианах:
mysql> SELECT COS(PI());
-> -1.000000
SIN(X)
Возвращает синус числа
X, где X
задается в радианах:
mysql> SELECT SIN(PI());
-> 0.000000
TAN(X)
Возвращает тангенс числа
X, где X
задается в радианах:
mysql> SELECT TAN(PI()+1);
-> 1.557408
ACOS(X)
Возвращает арккосинус числа
X, т.е. величину,
косинус которой равен
X. Если X не
находится в диапазоне от
-1 до 1,
возвращает NULL:
mysql>SELECT ACOS(1);-> 0.000000 mysql>SELECT ACOS(1.0001);-> NULL mysql>SELECT ACOS(0);-> 1.570796
ASIN(X)
Возвращает арксинус числа
X, т.е. величину, синус
которой равен X. Если
X не находится в
диапазоне от -1 до
1, возвращает
NULL:
mysql>SELECT ASIN(0.2);-> 0.201358 mysql>SELECT ASIN('foo');-> 0.000000
ATAN(X)
Возвращает арктангенс числа
X, т.е. величину,
тангенс которой равен
X:
mysql>SELECT ATAN(2);-> 1.107149 mysql>SELECT ATAN(-2);-> -1.107149
ATAN(Y,X),
ATAN2(Y,X)
Возвращает арктангенс двух
переменных X и
Y. Вычисление
производится так же, как и
вычисление арктангенса Y /
X, за исключением того, что
знаки обоих аргументов
используются для определения
квадранта результата:
mysql>SELECT ATAN(-2,2);-> -0.785398 mysql>SELECT ATAN2(PI(),0);-> 1.570796
COT(X)
Возвращает котангенс числа
X:
mysql>SELECT COT(12);-> -1.57267341 mysql>SELECT COT(0);-> NULL
RAND(), RAND(N)
Возвращает случайную величину
с плавающей точкой в диапазоне
от 0 до 1,0.
Если целочисленный аргумент
N указан, то он
используется как начальное
значение этой величины:
mysql>SELECT RAND();-> 0.9233482386203 mysql>SELECT RAND(20);-> 0.15888261251047 mysql>SELECT RAND(20);-> 0.15888261251047 mysql>SELECT RAND();-> 0.63553050033332 mysql>SELECT RAND();-> 0.70100469486881
В выражениях вида ORDER
BY не следует использовать
столбец с величинами
RAND(), поскольку
применение оператора ORDER
BY приведет к многократным
вычислениям в этом столбце. В
версии MySQL 3.23 можно, однако,
выполнить следующий оператор:
SELECT * FROM table_name ORDER BY
RAND(): он полезен для
получения случайного
экземпляра из множества
SELECT * FROM table1,table2 WHERE a=b AND c<d
ORDER BY RAND() LIMIT 1000. Следует
учитывать, что оператор
RAND() в выражении
WHERE при выполнении
выражения WHERE будет
вычисляться каждый раз заново.
Оператор RAND() не
следует воспринимать как
полноценный генератор
случайных чисел: это просто
быстрый способ динамической
генерации случайных чисел,
переносимых между платформами
для одной и той же версии MySQL.
LEAST(X,Y,...)
Если задано два или более аргументов, возвращает наименьший (с минимальным значением) аргумент. Сравнение аргументов происходит по следующим правилам:
Если возвращаемая величина
используется в
целочисленном контексте
(INTEGER), или все
аргументы являются
целочисленными, то они
сравниваются как целые
числа.
Если возвращаемая величина
используется в контексте
действительных чисел
(REAL) или все
аргументы являются
действительными числами, то
они сравниваются как числа
типа REAL.
Если один из аргументов является зависимой от регистра строкой, то данные аргументы сравниваются с учетом регистра.
В остальных случаях аргументы сравниваются как строки, независимые от регистра.
mysql>SELECT LEAST(2,0);-> 0 mysql>SELECT LEAST(34.0,3.0,5.0,767.0);-> 3.0 mysql>SELECT LEAST("B","A","C");-> "A"
В версиях MySQL до 3.22.5 можно использовать MIN() вместо LEAST.
GREATEST(X,Y,...)
Возвращает наибольший (с
максимальным значением)
аргумент. Сравнение аргументов
происходит по тем же правилам,
что и для LEAST:
mysql>SELECT GREATEST(2,0);-> 2 mysql>SELECT GREATEST(34.0,3.0,5.0,767.0);-> 767.0 mysql>SELECT GREATEST("B","A","C");-> "C"
В версиях MySQL до 3.22.5 можно
использовать MAX()
вместо GREATEST.
DEGREES(X)
Возвращает аргумент
X, преобразованный из
радианов в градусы:
mysql> SELECT DEGREES(PI());
-> 180.000000
RADIANS(X)
Возвращает аргумент
X, преобразованный из
градусов в радианы:
mysql> SELECT RADIANS(90);
-> 1.570796
TRUNCATE(X,D)
Возвращает число X,
усеченное до D
десятичных знаков. Если
D равно 0,
результат будет представлен
без десятичного знака или
дробной части:
mysql>SELECT TRUNCATE(1.223,1);-> 1.2 mysql>SELECT TRUNCATE(1.999,1);-> 1.9 mysql>SELECT TRUNCATE(1.999,0);-> 1 mysql>SELECT TRUNCATE(-1.999,1);-> -1.9
Начиная с MySQL 3.23.51 все числа округляются к нулю.
Если D - негативное, то
тогда вся часть числа
обнуляется:
mysql> SELECT TRUNCATE(122,-2);
-> 100
Следует учитывать, что обычно в
компьютерах десятичные числа
хранятся не так, как целые, а как
числа двойной точности с
плавающим десятичным знаком
(DOUBLE). Поэтому иногда
результат может вводить в
заблуждение, как в следующем
примере:
mysql> SELECT TRUNCATE(10.28*100,0);
-> 1027
Это происходит потому, что в
действительности 10,28
хранится как нечто вроде
10,2799999999999999.
Описание диапазона величин для каждого типа и возможные форматы представления даты и времени приведены в разделе Раздел 6.2.2, «Типы данных даты и времени».
Ниже представлен пример, в котором
используются функции даты.
Приведенный запрос выбирает все
записи с величиной date_col
в течение последних 30 дней:
mysql> SELECT something FROM tbl_name
WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;
DAYOFWEEK(date)
Возвращает индекс дня недели для
аргумента date (1 =
воскресенье, 2 = понедельник, ... 7 =
суббота). Эти индексные величины
соответствуют стандарту ODBC.
mysql> SELECT DAYOFWEEK('1998-02-03');
-> 3
WEEKDAY(date)
Возвращает индекс дня недели для аргумента date (0 =понедельник, 1 = вторник, ... 6 = воскресенье):
mysql>SELECT WEEKDAY('1998-02-03 22:23:00');-> 1 mysql>SELECT WEEKDAY('1997-11-05');-> 2
DAYOFMONTH(date)
Возвращает порядковый номер дня
месяца для аргумента
date в диапазоне от 1 до
31:
mysql> SELECT DAYOFMONTH('1998-02-03');
-> 3
DAYOFYEAR(date)
Возвращает порядковый номер дня
года для аргумента date
в диапазоне от 1 до 366:
mysql> SELECT DAYOFYEAR('1998-02-03');
-> 34
MONTH(date)
Возвращает порядковый номер
месяца в году для аргумента
date в диапазоне от 1 до
12:
mysql> SELECT MONTH('1998-02-03');
-> 2
DAYNAME(date)
Возвращает название дня недели
для аргумента date:
mysql> SELECT DAYNAME("1998-02-05");
-> 'Thursday'
MONTHNAME(date)
Возвращает название месяца для
аргумента date:
mysql> SELECT MONTHNAME("1998-02-05");
-> 'February'
QUARTER(date)
Возвращает номер квартала года
для аргумента date в
диапазоне от 1 до 4:
mysql> SELECT QUARTER('98-04-01');
-> 2
WEEK(date),
WEEK(date,first)
При наличии одного аргумента
возвращает порядковый номер
недели в году для date в
диапазоне от 0 до 53 (да, возможно
начало 53-й недели) для регионов,
где воскресенье считается
первым днем недели. Форма
WEEK() с двумя
аргументами позволяет уточнить,
с какого дня начинается неделя -
с воскресенья или с
понедельника. Результат будет в
пределах 0-53 или
1-52.
Вот как работает второй аргумент:
| Величина | Означает |
| 0 | Неделя начинается с воскресенья; возвращаемое значение - в промежутке 0-53 |
| 1 | Неделя начинается с понедельника; возвращаемое значение - в промежутке 0-53 |
| 2 | Неделя начинается с воскресенья; возвращаемое значение - в промежутке 1-53 |
| 3 | Неделя начинается с понедельника; возвращаемое значение - в промежутке 1-53 (ISO 8601) |
mysql>SELECT WEEK('1998-02-20');-> 7 mysql>SELECT WEEK('1998-02-20',0);-> 7 mysql>SELECT WEEK('1998-02-20',1);-> 8 mysql>SELECT WEEK('1998-12-31',1);-> 53
Примечание: в версии 4.0 функция
WEEK(#,0) была изменена с
целью соответствия календарю
США.
Заметьте, если неделя является
последней неделей прошлого года,
MySQL вернет 0 если вы не
указали 2 или
3 как опциональный
аргумент:
mysql>SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);-> 2000, 0 mysql>SELECT WEEK('2000-01-01',2);-> 52
Можно считать, что MySQL должен
вернуть 52, так как
данная дата и является 52-ой
неделей года 1999. Мы решили
возвращать 0, так как
мы хотим, чтобы функция давала
"номер недели в указанном году".
Это делает функцию WEEK()
более надежной при
использовании совместно с
другими функциями, которые
вычисляют части дат.
Если вам все же важно уточнить
корректную неделю в году, тогда
вы можете использовать
2 или 3 как
опциональный аргумент или
использовать YEARWEEK()
mysql>SELECT YEARWEEK('2000-01-01');-> 199952 mysql>SELECT MID(YEARWEEK('2000-01-01'),5,2);-> 52
YEAR(date)
Возвращает год для аргумента
date в диапазоне от 1000 до
9999:
mysql> SELECT YEAR('98-02-03');
-> 1998
YEARWEEK(date),
YEARWEEK(date,first)
Возвращает год и неделю для
аргумента date. Второй
аргумент в данной функции
работает подобно второму
аргументу в функции
WEEK(). Следует
учитывать, что год может
отличаться от указанного в
аргументе date для
первой и последней недель года:
mysql> SELECT YEARWEEK('1987-01-01');
-> 198653
Обратите внимание, что номер
недели отличается от того,
который возвращает функция
WEEK() (0),
будучи вызванной с опциональным
аргументом 0 или
1. Это потому, что
WEEK() возвращает номер
недели именно в указанном году.
HOUR(time)
Возвращает час для аргумента
time в диапазоне от 0 до
23:
mysql> SELECT HOUR('10:05:03');
-> 10
MINUTE(time)
Возвращает количество минут для
аргумента time в
диапазоне от 0 до 59:
mysql> SELECT MINUTE('98-02-03 10:05:03');
-> 5
SECOND(time)
Возвращает количество секунд
для аргумента time в
диапазоне от 0 до 59:
mysql> SELECT SECOND('10:05:03');
-> 3
PERIOD_ADD(P,N)
Добавляет N месяцев к
периоду P (в формате
YYMM или YYYYMM).
Возвращает величину в формате
YYYYMM. Следует
учитывать, что аргумент периода
P не является
значением даты:
mysql> SELECT PERIOD_ADD(9801,2);
-> 199803
PERIOD_DIFF(P1,P2)
Возвращает количество месяцев
между периодами P1 и
P2. P1 и
P2 должны быть в
формате YYMM или
YYYYMM. Следует
учитывать, что аргументы периода
P1 и P2 не
являются значениями даты:
mysql> SELECT PERIOD_DIFF(9802,199703);
-> 11
DATE_ADD(date,INTERVAL expr type),
DATE_SUB(date,INTERVAL expr type),
ADDDATE(date,INTERVAL expr type),
SUBDATE(date,INTERVAL expr type)
Данные функции производят
арифметические действия над
датами. Обе являются
нововведением версии MySQL 3.22.
Функции ADDDATE() и
SUBDATE() - синонимы для
DATE_ADD() и
DATE_SUB(). В версии MySQL 3.23
вместо функций DATE_ADD() и
DATE_SUB() можно
использовать операторы
+ и -, если
выражение с правой стороны
представляет собой столбец типа
DATE или DATETIME
(см. пример ниже). Аргумент
date является величиной
типа DATETIME или
DATE, задающей начальную
дату.
Выражение expr задает
величину интервала, который
следует добавить к начальной
дате или вычесть из начальной
даты. Выражение expr
представляет собой строку,
которая может начинаться с
- для отрицательных
значений интервалов. Ключевое
слово type показывает,
каким образом необходимо
интерпретировать данное
выражение. Вспомогательная
функция EXTRACT(type FROM date)
возвращает интервал указанного
типа (type) из значения
даты. В следующей таблице
показана взаимосвязь аргументов
type и expr:
Значение
Type | Ожидаемый формат
expr |
SECOND | SECONDS |
MINUTE | MINUTES |
HOUR | HOURS |
DAY | DAYS |
MONTH | MONTHS |
YEAR | YEARS |
MINUTE_SECOND | "MINUTES:SECONDS" |
HOUR_MINUTE | "HOURS:MINUTES" |
DAY_HOUR | "DAYS HOURS" |
YEAR_MONTH | "YEARS-MONTHS" |
HOUR_SECOND | "HOURS:MINUTES:SECONDS" |
DAY_MINUTE | "DAYS HOURS:MINUTES" |
DAY_SECOND | "DAYS HOURS:MINUTES:SECONDS" |
В MySQL формат выражения
expr допускает любые
разделительные знаки.
Разделители, представленные в
данной таблице, приведены в
качестве примеров. Если аргумент
date является величиной
типа DATE и
предполагаемые вычисления
включают в себя только части
YEAR, MONTH, и
DAY (т.е. не содержат
временной части TIME), то
результат представляется
величиной типа DATE. В
других случаях результат
представляет собой величину
DATETIME:
mysql>SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND;-> 1998-01-01 00:00:00 mysql>SELECT INTERVAL 1 DAY + "1997-12-31";-> 1998-01-01 mysql>SELECT "1998-01-01" - INTERVAL 1 SECOND;-> 1997-12-31 23:59:59 mysql>SELECT DATE_ADD("1997-12-31 23:59:59", INTERVAL 1 SECOND);-> 1998-01-01 00:00:00 mysql>SELECT DATE_ADD("1997-12-31 23:59:59", INTERVAL 1 DAY);-> 1998-01-01 23:59:59 mysql>SELECT DATE_ADD("1997-12-31 23:59:59", INTERVAL "1:1" MINUTE_SECOND);-> 1998-01-01 00:01:00 mysql>SELECT DATE_SUB("1998-01-01 00:00:00", INTERVAL "1 1:1:1" DAY_SECOND);-> 1997-12-30 22:58:59 mysql>SELECT DATE_ADD("1998-01-01 00:00:00", INTERVAL "-1 10" DAY_HOUR);-> 1997-12-30 14:00:00 mysql>SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY);-> 1997-12-02
Если указанный интервал слишком
короткий (т.е. не включает все
части интервала, ожидаемые при
заданном ключевом слове
type), то MySQL
предполагает, что опущены
крайние слева части интервала.
Например, если указан аргумент
type в виде
DAY_SECOND, то ожидаемое
выражение expr должно
иметь следующие части: дни, часы,
минуты и секунды. Если в этом
случае указать значение
интервала в виде "1:10",
то MySQL предполагает, что опущены
дни и часы, а данная величина
включает только минуты и
секунды. Другими словами,
сочетание "1:10"
DAY_SECOND
интерпретируется как эквивалент
"1:10" MINUTE_SECOND.
Аналогичным образом в MySQL
интерпретируются и значения
TIME - скорее как
представляющие прошедшее время,
чем как время дня. Следует
учитывать, что при операциях
сложения или вычитания с
участием величины DATE и
выражения, содержащего
временную часть, данная величина
DATE будет
автоматически конвертироваться
в величину типа DATETIME:
mysql>SELECT DATE_ADD("1999-01-01", INTERVAL 1 DAY);-> 1999-01-02 mysql>SELECT DATE_ADD("1999-01-01", INTERVAL 1 HOUR);-> 1999-01-01 01:00:00
При использовании некорректных
значений дат результат будет
равен NULL. Если при
суммировании MONTH,
YEAR_MONTH или YEAR
номер дня в результирующей дате
превышает максимальное
количество дней в новом месяце,
то номер дня результирующей даты
принимается равным последнему
дню нового месяца:
mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH);
-> 1998-02-28
Из предыдущего примера видно,
что слово INTERVAL и
ключевое слово type не
являются регистро-зависимыми.
EXTRACT(type FROM date)
Типы интервалов для функции
EXTRACT() используются те
же, что и для функций
DATE_ADD() или
DATE_SUB(), но
EXTRACT() производит
скорее извлечение части из
значения даты, чем выполнение
арифметических действий.
mysql>SELECT EXTRACT(YEAR FROM "1999-07-02");-> 1999 mysql>SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");-> 199907 mysql>SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");-> 20102
TO_DAYS(date)
функция возвращает номер дня для
даты, указанной в аргументе
date, (количество дней,
прошедших с года 0):
mysql>SELECT TO_DAYS(950501);-> 728779 mysql>SELECT TO_DAYS('1997-10-07');-> 729669
Функция TO_DAYS() не
предназначена для использования
с величинами, предшествующими
введению григорианского
календаря (1582), поскольку не
учитывает дни, утерянные при
изменении календаря.
FROM_DAYS(N)
Возвращает величину
DATE для заданного
номера дня N:
mysql> SELECT FROM_DAYS(729669);
-> '1997-10-07'
Функция FROM_DAYS() не
предназначена для использования
с величинами, предшествующими
введению григорианского
календаря (1582), поскольку она не
учитывает дни, утерянные при
изменении календаря.
DATE_FORMAT(date,format)
Форматирует величину
date в соответствии со
строкой format. В строке
format могут
использоваться следующие
определители:
| Определитель | Описание |
%M | Название месяца (январь...декабрь) |
%W | Название дня недели (воскресенье...суббота) |
%D | День месяца с английским суффиксом (0st, 1st, 2nd, 3rd и т.д.) |
%Y | Год, число, 4 разряда |
%y | Год, число, 2 разряда |
%X | Год для недели, где воскресенье считается первым днем недели, число, 4 разряда, используется с '%V' |
%x | Год для недели, где воскресенье считается первым днем недели, число, 4 разряда, используется с '%v' |
%a | Сокращенное наименование дня недели (Вс...Сб) |
%d | День месяца, число (00..31) |
%e | День месяца, число (0..31) |
%m | Месяц, число (00..12) |
%c | Месяц, число (0..12) |
%b | Сокращенное наименование месяца (Янв...Дек) |
%j | День года (001..366) |
%H | Час (00..23) |
%k | Час (0..23) |
%h | Час (01..12) |
%I | Час (01..12) |
%l | Час (1..12) |
%i | Минуты, число (00..59) |
%r | Время, 12-часовой формат (hh:mm:ss [AP]M) |
%T | Время, 24-часовой формат (hh:mm:ss) |
%S | Секунды (00..59) |
%s | Секунды (00..59) |
%p | AM или PM |
%w | День недели (0=воскресенье..6=суббота) |
%U | Неделя (00..53), где воскресенье считается первым днем недели |
%u | Неделя (00..53), где понедельник считается первым днем недели |
%V | Неделя (01..53), где воскресенье считается
первым днем недели.
Используется с '%X' |
%v | Неделя (01..53), где понедельник считается
первым днем недели.
Используется с '%x' |
%% | Литерал ‘%’. |
Все другие символы просто копируются в результирующее выражение без интерпретации:
mysql>SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');-> 'Saturday October 1997' mysql>SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');-> '22:23:00' mysql>SELECT DATE_FORMAT('1997-10-04 22:23:00', '%D %y %a %d %m %b %j');-> '4th 97 Sat 04 10 Oct 277' mysql>SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H %k %I %r %T %S %w');-> '22 22 10 10:23:00 PM 22:23:00 00 6' mysql>SELECT DATE_FORMAT('1999-01-01', '%X %V');-> '1998 52'
В MySQL 3.23 символ
‘%’ должен
предшествовать символам
определителя формата. В более
ранних версиях MySQL символ
‘%’ необязателен.
Причина того, что промежутки для
месяца и дня начинаются с нуля
заключается в том, что MySQL
позволяет использовать неполные
даты, такие как '2004-00-00',
начиная с MySQL 3.23.
TIME_FORMAT(time,format)
Данная функция используется
аналогично описанной выше
функции DATE_FORMAT(), но
строка format может
содержать только те
определители формата, которые
относятся к часам, минутам и
секундам. При указании других
определителей будет выдана
величина NULL или
0.
CURDATE(),
CURRENT_DATE
Возвращает сегодняшнюю дату как
величину в формате
YYYY-MM-DD или
YYYYMMDD, в зависимости от
того, в каком контексте
используется функция - в
строковом или числовом:
mysql>SELECT CURDATE();-> '1997-12-15' mysql>SELECT CURDATE() + 0;-> 19971215
CURTIME(),
CURRENT_TIME
Возвращает текущее время как
величину в формате
HH:MM:SS или HHMMS,
в зависимости от того, в каком
контексте используется функция -
в строковом или числовом:
mysql>SELECT CURTIME();-> '23:50:26' mysql>SELECT CURTIME() + 0;-> 235026
NOW(), SYSDATE(),
CURRENT_TIMESTAMP
Возвращает текущую дату и время
как величину в формате
YYYY-MM-DD HH:MM:SS или
YYYYMMDDHHMMSS, в зависимости
от того, в каком контексте
используется функция - в
строковом или числовом:
mysql>SELECT NOW();-> '1997-12-15 23:50:26' mysql>SELECT NOW() + 0;-> 19971215235026
Заметьте, что NOW()
вычисляется только единожды для
каждого запроса, а именно - в
начале его выполнения. Это
позволяет быть уверенным в том,
что множественные ссылки на
NOW() в рамках одного
запроса дадут одно и то же
значение.
UNIX_TIMESTAMP(),
UNIX_TIMESTAMP(date)
При вызове данной функции без
аргумента она возвращает
временную метку
UNIX_TIMESTAMP (секунды с
1970-01-01 00:00:00 GMT) как беззнаковое
целое число. Если функция
UNIX_TIMESTAMP() вызывается с
аргументом date, она
возвращает величину аргумента
как количество секунд с 1970-01-01
00:00:00 GMT. Аргумент date может
представлять собой строку типа
DATE, строку
DATETIME, величину типа
TIMESTAMP или число в
формате YYMMDD или
YYYYMMDD местного времени:
mysql>SELECT UNIX_TIMESTAMP();-> 882226357 mysql>SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00');-> 875996580
При использовании функции
UNIX_TIMESTAMP в столбце
TIMESTAMP эта функция
будет возвращать величину
внутренней временной метки
непосредственно, без
подразумеваемого
преобразования строки во
временную метку (``string-to-unix-timestamp''
). Если заданная дата выходит за
пределы допустимого диапазона,
то функция UNIX_TIMESTAMP()
возвратит 0, но следует
учитывать, что выполняется
только базовая проверка (год
1970-2037, месяц 01-12, день 01-31). Если
необходимо выполнить вычитание
столбцов UNIX_TIMESTAMP(),
результат можно преобразовать к
целым числам со знаком. See
Раздел 6.3.5, «Функции приведения типов».
FROM_UNIXTIME(unix_timestamp)
Возвращает представление
аргумента unix_timestamp как
величину в формате YYYY-MM-DD
HH:MM:SS или YYYYMMDDHHMMSS,
в зависимости от того, в каком
контексте используется функция -
в строковом или числовом:
mysql>SELECT FROM_UNIXTIME(875996580);-> '1997-10-04 22:23:00' mysql>SELECT FROM_UNIXTIME(875996580) + 0;-> 19971004222300
FROM_UNIXTIME(unix_timestamp,format)
Возвращает строковое
представление аргумента
unix_timestamp,
отформатированное в
соответствии со строкой
format. Строка
format может содержать те
же определители, которые
перечислены в описании для
функции DATE_FORMAT():
mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y %D %M %h:%i:%s %x');
-> '1997 23rd December 03:43:30 1997'
SEC_TO_TIME(seconds)
Возвращает аргумент seconds,
преобразованный в часы, минуты и
секунды, как величину в формате
HH:MM:SS или
HHMMSS, в зависимости от
того, в каком контексте
используется функция - в
строковом или числовом:
mysql>SELECT SEC_TO_TIME(2378);-> '00:39:38' mysql>SELECT SEC_TO_TIME(2378) + 0;-> 3938
TIME_TO_SEC(time)
Возвращает аргумент
time, преобразованный в
секунды:
mysql>SELECT TIME_TO_SEC('22:23:00');-> 80580 mysql>SELECT TIME_TO_SEC('00:39:38');-> 2378
Функция CAST имеет
следующий синтаксис:
CAST(expression AS type)
или
CONVERT(expression,type)
где аргумент type
представляет один из типов:
BINARY
CHAR (Новшество в 4.0.6)
DATE
DATETIME
SIGNED {INTEGER}
TIME
UNSIGNED {INTEGER}
Функция CAST()
соответствует синтаксису ANSI SQL99, а
функция CONVERT() -
синтаксису ODBC.
Данная функция приведения типов
используется главным образом для
создания столбца конкретного типа
с помощью команды CREATE ...
SELECT:
CREATE TABLE new_table SELECT CAST('2000-01-01' AS DATE);
Выражение CAST string AS BINARY
эквивалентно BINARY string.
CAST(expr AS CHAR считает что
данное выражение есть строка в
кодировке по умолчанию.
Для преобразования строки в числовую величину обычно не нужно ничего делать: просто используйте строку так, как будто это число:
mysql> SELECT 1+'1';
-> 2
Если вы указываете номер в
строковом контексте, номер будет
автоматически преобразован к
строке типа BINARY.
mysql> SELECT concat("hello you ",2);
-> "hello you 2"
MySQL поддерживает арифметические
операции с 64-битовыми величинами -
как со знаковыми, так и с
беззнаковыми. Если используются
числовые операции (такие как +) и
один из операндов представлен в
виде unsigned integer, то
результат будет беззнаковым. Его
можно переопределить, используя
операторы приведения
SIGNED и UNSIGNED,
чтобы получить 64-битовое целое
число со знаком или без знака
соответственно.
mysql>SELECT CAST(1-2 AS UNSIGNED)-> 18446744073709551615 mysql>SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED);-> -1
Следует учитывать, что если один из
операндов представлен величиной с
плавающей точкой (в данном
контексте DECIMAL()
рассматривается как величина с
плавающей точкой), результат также
является величиной с плавающей
точкой и не подчиняется
вышеприведенному правилу
приведения.
mysql> SELECT CAST(1 AS UNSIGNED) -2.0
-> -1.0
Если в арифметической операции используется строка, то результат преобразуется в число с плавающей точкой.
Функции CAST() и
CONVERT() были добавлены в
MySQL 4.0.2.
В MySQL 4.0 была изменены правила
обработки беззнаковых величин,
чтобы обеспечить более полную
поддержку величин типа
BIGINT. Если код необходимо
использовать и для MySQL 4.0, и для
версии 3.23 (в которой функция
CAST, скорее всего, не
будет работать), то можно, применив
следующий трюк, получить при
вычитании двух беззнаковых
целочисленных столбцов результат
со знаком:
SELECT (unsigned_column_1+0.0)-(unsigned_column_2+0.0);
Идея состоит в том, что перед выполнением вычитания данные столбцы приводятся к типу с плавающей точкой.
Если возникнут проблемы со
столбцами типа UNSIGNED в
старых приложениях MySQL при
переносе их на MySQL 4.0, можно
использовать параметр
--sql-mode=NO_UNSIGNED_SUBTRACTION при
запуске mysqld. Однако
следует учитывать, что при этом
теряется возможность эффективного
использования столбцов типа
UNSIGNED BIGINT.
MySQL использует для двоичных
операций 64-битовые величины
BIGINT, следовательно, для
двоичных операторов максимальный
диапазон составляет 64 бита.
|
Побитовое ИЛИ
mysql> SELECT 29 | 15;
-> 31
Результат является беззнаковым 64-битовым целым числом.
&
Побитовое И
mysql> SELECT 29 & 15;
-> 13
Результат является беззнаковым 64-битовым целым числом.
^
Побитовый XOR (побитовое сложение по модулю 2)
mysql>SELECT 1 ^ 1;-> 0 mysql>SELECT 1 ^ 0;-> 1 mysql>SELECT 11 ^ 3;-> 8
Результат - беззнаковое 64-битное целое число.
XOR был реализован в
MySQL 4.0.2.
<<
Сдвиг числа двойной длины
(BIGINT) влево:
mysql> SELECT 1 << 2;
-> 4
Результат является беззнаковым 64-битовым целым числом.
>>
Сдвиг числа двойной длины
(BIGINT) вправо:
mysql> SELECT 4 >> 2;
-> 1
Результат является беззнаковым 64-битовым целым числом.
~
Инвертировать все биты:
mysql> SELECT 5 & ~1;
-> 4
Результат является беззнаковым 64-битовым целым числом.
BIT_COUNT(N)
Возвращает число битов,
указанное в аргументе
N:
mysql> SELECT BIT_COUNT(29);
-> 4
DATABASE()
Возвращает имя текущей базы данных:
mysql> SELECT DATABASE();
-> 'test'
Если в данное время нет
активной базы данных, то
функция DATABASE()
возвращает пустую строку.
USER(),
SYSTEM_USER(),
SESSION_USER()
Возвращает имя текущего активного пользователя MySQL:
mysql> SELECT USER();
-> 'davida@localhost'
В версии MySQL 3.22.11 или более поздней данная функция включает в себя имя хоста клиента, а также имя пользователя. Можно извлечь часть, касающуюся только имени пользователя, приведенным ниже способом (проверяется, включает ли данная величина имя хоста):
mysql> SELECT SUBSTRING_INDEX(USER(),"@",1);
-> 'davida'
CURRENT_USER()
Возвращает текущее имя пользователя, под которым пользователь аутентифицировался в текущей сессии:
mysql>SELECT USER();-> 'davida@localhost' mysql>SELECT * FROM mysql.user;-> ERROR 1044: Access denied for user: '@localhost' to database 'mysql' mysql>SELECT CURRENT_USER();-> '@localhost'
PASSWORD(str),
OLD_PASSWORD(str)
Создает строку "пароля" из
простого текста в аргументе
str. Именно эта функция
используется в целях
шифрования паролей MySQL для
хранения в столбце
Password в таблице
привилегий user:
mysql> SELECT PASSWORD('badpwd');
-> '7f84554057dd964b'
Шифрование, которое выполняет
функция PASSWORD(),
необратимо. Способ шифрования
пароля, который используется
функцией PASSWORD(),
отличается от применяемого для
шифрования паролей в Unix.
Функция PASSWORD()
используется в системе
аутентификации в сервер MySQL, вам
не следует использовать ее для
ваших собственных приложений. С
этой целью, лучше используйте
функции MD5() и
SHA1().
ENCRYPT(str[,salt])
Шифрует аргумент str,
используя вызов системной
функции кодирования
crypt() из Unix. Аргумент
salt должен быть
строкой из двух символов (в
версии MySQL 3.22.16 аргумент
salt может содержать
более двух символов):
mysql> SELECT ENCRYPT("hello");
-> 'VxuFAJXVARROc'
Если функция crypt() в
данной операционной системе
недоступна, функция
ENCRYPT() всегда
возвращает NULL.
Функция ENCRYPT()
игнорирует все символы в
аргументе str, за
исключением первых восьми, по
крайней мере в некоторых
операционных системах - это
определяется тем, как
реализован системный вызов
базовой функции crypt().
ENCODE(str,pass_str)
Шифрует str, используя
аргумент pass_str как
пароль. Для расшифровки
результата следует
использовать функцию
DECODE(). Результат
представляет собой двоичную
строку той же длины, что и
string. Для хранения
результата в столбце следует
использовать столбец типа
BLOB.
DECODE(crypt_str,pass_str)
Расшифровывает зашифрованную
строку crypt_str,
используя аргумент
pass_str как пароль.
Аргумент crypt_str должен
быть строкой, возвращаемой
функцией ENCODE().
MD5(string)
Вычисляет 128-битовую
контрольную сумму MD5
для аргумента string.
Возвращаемая величина
представляет собой 32-разрядное
шестнадцатеричное число,
которое может быть
использовано, например, в
качестве хеш-ключа:
mysql> SELECT MD5("testing");
-> 'ae2b1fca515949e5d54fb22b8ed95575'
Это "RSA Data Security, Inc. MD5
Message-Digest Algorithm".
SHA1(string),
SHA(string)
Вычисляет 160-битовую
контрольную сумму SHA1
для аргумента string,
как описано в RFC 3174 (Secure Hash Algorithm).
Возвращаемая величина
представляет собой 40-разрядное
шестнадцатеричное число или
NULL (в том случае, если
входной аргумент был равен
NULL). Одно из возможных
применений для этой функции - в
качестве хеш-ключа. Можно ее
использовать и как
криптографически безопасную
функцию для сохранения паролей.
mysql> SELECT SHA1("abc");
-> 'a9993e364706816aba3e25717850c26c9cd0d89d'
Функция SHA1() была
добавлена в версии 4.0.2, и может
рассматриваться как более
защищенный криптографически
эквивалент функции
MD5(). SHA()
является синонимом для функции
SHA1().
AES_ENCRYPT(string,key_string),
AES_DECRYPT(string,key_string)
Эти функции позволяют
шифровать/дешифровать данные,
используя официальный алгоритм
AES (Advanced Encryption Standard) (предыдущее
название - Rijndael). В нем
применяется кодирование с
128-битовым ключом, однако при
помощи патча к исходному коду
длину ключа можно увеличить до
256 битов. В MySQL выбран 128-битовый
ключ, поскольку он работает
намного быстрее и обычно
обеспечивает вполне
достаточную защищенность.
Входные аргументы могут быть
любой длины. Если один из
аргументов равен NULL,
то результат этой функции также
будет иметь значение
NULL.
Так как AES является алгоритмом
блочного уровня, то для
декодирования используется
дополнение строк нечетной
длины, так, чтобы длина
результирующей строки могла
вычисляться как выражение
16*(trunc(длина_строки/16)+1).
Если AES_DECRYPT()
обнаруживает некорректные
данные или некорректное
заполнение строки (имеет в
виду padding - прим. пер.),
функция вернет NULL.
Однако AES_DECRYPT() вполне
может вернуть не-NULL
величину, или, возможно, просто
мусор, если входные данных или
ключ - некорректны.
AES_DECRYPT() имеет также
модификацию, возвращающую
величину со значением, не
равным NULL, даже при
неправильном ключе. Функции AES
можно использовать для
хранения данных в
зашифрованном виде путем
модификации запросов:
INSERT INTO t VALUES (1,AES_ENCRYPT("text","password"));
Можно добиться еще более высокого уровня защищенности за счет исключения передачи ключа через соединение для каждого запроса - для этого ключ на время соединения должен сохраняться в переменной на сервере:
SELECT @password:="my password";
INSERT INTO t VALUES (1,AES_ENCRYPT("text",@password));
Функции AES_ENCRYPT() и
AES_DECRYPT() были
добавлены в версию 4.0.2 и могут
рассматриваться как наиболее
криптографически защищенные
шифрующие функции, в настоящее
время доступные в MySQL.
DES_ENCRYPT(string_to_encrypt [, (key_number |
key_string) ] )
Шифрует строку с заданным ключом, используя алгоритм тройного DES. Следует учитывать, что эта функция работает только тогда, когда конфигурация MySQL поддерживает SSL. See Раздел 4.3.9, «Использование безопасных соединений». Ключ для использования при шифровании выбирается следующим образом:
| Аргумент | Описание |
| Только один аргумент | Используется первый ключ из
des-key-file |
| Номер ключа | Используется заданный ключ (0-9) из
des-key-file |
| Строка | Для шифрования string_to_encrypt
может использоваться ключ,
заданный в key_string |
Функция возвращает двоичную
строку, в которой первый символ
будет CHAR(128 | key_number).
Число 128 добавлено
для упрощения распознавания
зашифрованного ключа. При
использовании строкового ключа
key_number будет равен
127. При ошибке эта
функция возвращает
NULL. Длина строки в
результате будет равна
new_length=org_length + (8-(org_length %
8))+1. Выражение
des-key-file имеет
следующий форматt:
key_number des_key_string key_number des_key_string
Каждый элемент key_number
должен быть числом от 0 до 9.
Строки в данном файле могут
располагаться в произвольном
порядке. Выражение
des_key_string представляет
собой строку, которая будет
использована при шифровании
сообщения. Между числом и
ключом должен быть по крайней
мере один пробел. Первый ключ
используется по умолчанию, если
не задан какой-либо аргумент
ключа в функции
DES_ENCRYPT(). Существует
возможность послать MySQL запрос
на чтение новых значений ключей
из файла ключей при помощи
команды FLUSH DES_KEY_FILE.
Эта операция требует наличия
привилегии Reload_priv.
Одно из преимуществ наличия
набора ключей по умолчанию
состоит в том, что приложения
могут проверять существование
зашифрованных величин в
столбцах без предоставления
конечному пользователю права
расшифровки этих величин.
mysql> SELECT customer_address FROM customer_table WHERE
crypted_credit_card = DES_ENCRYPT("credit_card_number");
DES_DECRYPT(string_to_decrypt [,
key_string])
Дешифрует строку,
зашифрованную с помощью
функции DES_ENCRYPT().
Следует учитывать, что эта
функция работает только тогда,
когда конфигурация MySQL
поддерживает SSL. See
Раздел 4.3.9, «Использование безопасных соединений». Если
аргумент key_string не
задан, то функция
DES_DECRYPT() проверяет
первый байт зашифрованной
строки для определения номера
ключа алгоритма DES,
использованного для шифрования
исходной строки, Затем читает
ключ из des-key-file для
расшифровки сообщения. Чтобы
выполнить это, пользователь
должен обладать привилегией
SUPER. При указании
значения аргумента в
key_string эта строка
используется как ключ для
дешифровки сообщения. Если
строка string_to_decrypt не
выглядит как зашифрованная, то
MySQL вернет заданную строку
string_to_decrypt. При ошибке
эта функция возвращает
NULL.
LAST_INSERT_ID([expr])
Возвращает последнюю
автоматически сгенерированную
величину, которая была внесена
в столбец AUTO_INCREMENT. See
Раздел 8.4.3.31, «mysql_insert_id()».
mysql> SELECT LAST_INSERT_ID();
-> 195
Значение последнего
сгенерированного ID
сохраняется на сервере для
данного конкретного соединения
и не будет изменено другим
клиентом. Оно не будет изменено
даже при обновлении другого
столбца AUTO_INCREMENT
конкретной величиной (то есть,
которая не равна NULL и
не равна 0). При
внесении большого количества
строк с помощью одной команды
INSERT функция
LAST_INSERT_ID() возвращает
значение для первой внесенной
строки. Причина этого
заключается в том, что можно
легко воспроизвести точно
такую же команду INSERT
на другом сервере.
Если задано значение аргумента
expr в функции
LAST_INSERT_ID(), то величина
аргумента возвращается
функцией и устанавливается в
качестве следующего значения,
которое будет возвращено
функцией LAST_INSERT_ID().
Это можно использовать для
моделирования
последовательностей:
Вначале создается таблица:
mysql>CREATE TABLE sequence (id INT NOT NULL);mysql>INSERT INTO sequence VALUES (0);
Затем данную таблицу можно использовать для генерации чисел последовательности как показано ниже:
mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);
Можно генерировать
последовательности без вызова
LAST_INSERT_ID(): полезность
применения данной функции
состоит в том, что данное
значение ID
поддерживается на сервере как
последняя автоматически
сгенерированная величина
(защищенная от других
пользователей), и вы можете
извлекать новый ID так
же, как и любое другое
нормальное значение
AUTO_INCREMENT в MySQL.
Например, функция
LAST_INSERT_ID() (без
аргумента) возвратит новое
значение ID. Функцию C
API mysql_insert_id() также
можно использовать для
получения этой величины.
Следует учитывать, что,
поскольку функция
mysql_insert_id()
обновляется только после
команд INSERT и
UPDATE, то нельзя
использовать эту функцию C API
для извлечения значения
ID для
LAST_INSERT_ID(expr) после
выполнения других команд SQL,
таких как SELECT или
SET.
FORMAT(X,D)
Форматирует число X в
формат вида '#,###,###.##' с
округлением до D
десятичных знаков. Если
D равно 0,
результат будет представлен
без десятичной точки или
дробной части:
mysql>SELECT FORMAT(12332.123456, 4);-> '12,332.1235' mysql>SELECT FORMAT(12332.1,4);-> '12,332.1000' mysql>SELECT FORMAT(12332.2,0);-> '12,332'
VERSION()
Возвращает строку с номером версии сервера MySQL:
mysql> SELECT VERSION();
-> '3.23.13-log'
Следует учитывать, что если
данная версия заканчивается с
-log, то это означает,
что включено ведение журналов.
CONNECTION_ID()
Возвращает идентификатор
(thread_id) для данного
соединения. Каждое соединение
имеет свой собственный
уникальный идентификатор:
mysql> SELECT CONNECTION_ID();
-> 1
GET_LOCK(str,timeout)
Пытается осуществить
блокировку по имени, которое
заданно в строке str, с
временем ожидания в секундах,
указанном в аргументе
timeout. Возвращает
1, если блокировка
осуществлена успешно,
0 - если закончилось
время ожидания для данной
попытки, или NULL, если
возникла ошибка (такая как
отсутствие свободной памяти
или уничтожение потока
командой mysqladmin kill).
Блокировка снимается при
выполнении команды
RELEASE_LOCK(), запуске
новой команды GET_LOCK()
или при завершении данного
потока. Эту функцию можно
использовать для осуществления
блокировок уровня приложения
или для моделирования
блокировки записи. Функция
блокирует запросы других
клиентов на блокировку с тем же
именем; клиенты, которые
используют согласованные имена
блокировок, могут применять эту
функцию для выполнения
совместного упредительного
блокирования:
mysql>SELECT GET_LOCK("lock1",10);-> 1 mysql>SELECT IS_FREE_LOCK("lock2");-> 1 mysql>SELECT GET_LOCK("lock2",10);-> 1 mysql>SELECT RELEASE_LOCK("lock2");-> 1 mysql>SELECT RELEASE_LOCK("lock1");-> NULL
Обратите внимание: повторный
вызов функции
RELEASE_LOCK() возвращает
NULL, поскольку
блокировка lock1 была
автоматически выполнена вторым
вызовом функции
GET_LOCK().
RELEASE_LOCK(str)
Снимает блокировку, указанную в
строке str, полученной
от функции GET_LOCK().
Возвращает 1 если
блокировка была снята,
0 - если такая
блокировка уже поставлена в
другом соединении (в этом
случае блокировка не снимается)
и NULL, если блокировки
с указанным именем не
существует. Последнее может
произойти в случае, когда вызов
функции GET_LOCK() не
привел к успешному результату
или данная блокировка уже
снята. Функцию
RELEASE_LOCK() удобно
использовать совместно с
командой DO. See
Раздел 6.4.10, «Синтаксис оператора DO».
IS_FREE_LOCK(str)
Проверяет, свободна ли
блокировка по имени
str (т.е. не
установлена). Возвращает
1 если блокировка
свободна (никто не поставил
таковую). Возвращает 0
если блокировка установлена и
NULL в случае ошибки
(например, при неправильных
аргументах).
BENCHMARK(count,expr)
Функция BENCHMARK()
повторяет выполнение выражения
expr заданное
количество раз, указанное в
аргументе count. Она
может использоваться для
определения того, насколько
быстро MySQL обрабатывает данное
выражение. Значение результата
всегда равно 0.
Функция предназначена для
использования в клиенте
mysql, который сообщает
о времени выполнения запроса:
mysql> SELECT BENCHMARK(1000000,ENCODE("hello","goodbye"));
+----------------------------------------------+
| BENCHMARK(1000000,ENCODE("hello","goodbye")) |
+----------------------------------------------+
| 0 |
+----------------------------------------------+
1 row in set (4.74 sec)
Указанное в отчете время
представляет собой время,
подсчитанное на стороне
клиента, а не время, затраченное
центральным процессором (CPU time)
на сервере. Может оказаться
целесообразным выполнить
BENCHMARK() несколько раз,
чтобы выяснить, насколько
интенсивно загружен серверный
компьютер.
INET_NTOA(expr)
По заданному числовому адресу сети (4 или 8 байтов) возвращает представление указанного адреса в виде разделенных точками четырех октетов в виде строки:
mysql> SELECT INET_NTOA(3520061480);
-> "209.207.224.40"
INET_ATON(expr)
По заданному представлению сетевого адреса в виде строки, содержащей разделенные точками четыре октета, функция возвращает целое число, представляющее собой числовое значение данного адреса. Адреса могут быть длиной 4 или 8 байтов:
mysql> SELECT INET_ATON("209.207.224.40");
-> 3520061480
Результирующее число всегда
генерируется в соответствии с
порядком расположения октетов
в сетевом адресе, например
вышеприведенное число
вычисляется как 209*256^3 +
207*256^2 + 224*256 +40.
MASTER_POS_WAIT(log_name, log_pos)
Блокируется, пока подчиненный сервер не достигнет определенной точки положения в журнале репликации головного сервера (т.е. не прочитает и не выполнит все операции до указанной позиции).
Если информация головного
сервера не инициализирована,
или аргументы неправильны, то
функция возвращает
NULL. Если подчиненный
сервер не работает, то функция
блокируется и ожидает, пока
сервер запустится и дойдет до
указанной позиции или пройдет
через нее. Если подчиненный
сервер уже прошел указанную
точку, то функция немедленно
возвращает результат.
Если timeout (новшество в 4.0.10) указан, то ожидание прекратится по прошествии timeout секунд. Таймаут должен быть больше 0. 0 или негативный таймаут означает тоже самое что и отсутствие таймаута.
Возвращаемая величина
представляет собой число
событий в журнале, которые
функция должна была
``переждать'', пока сервер дойдет
до указанной точки,
NULL в случае ошибки
или -1 в случае, если
истек таймаут.
FOUND_ROWS()
Возвращает количество строк,
которые возвратила бы
последняя команда SELECT
SQL_CALC_FOUND_ROWS ... при
отсутствии ограничения
оператором LIMIT.
mysql>SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;mysql>SELECT FOUND_ROWS();
Второй вызов команды
SELECT возвратит
количество строк, которые
возвратила бы первая команда
SELECT, если бы она была написана
без выражения LIMIT.
Отметим, что, хотя при
использовании команды SELECT
SQL_CALC_FOUND_ROWS ..., MySQL должен
пересчитать все строки в наборе
результатов, этот способ все
равно быстрее, чем без
LIMIT, так как не
требуется посылать результат
клиенту.
Функция SQL_CALC_FOUND_ROWS
появилась в MySQL 4.0.0.
Вызов групповых функций для
SQL-команд, не содержащих GROUP
BY, эквивалентен выполнению
этих функций над всем набором
возвращаемых данных.
COUNT(expr)
Возвращает количество величин
со значением, не равным
NULL, в строках,
полученных при помощи команды
SELECT:
mysql> SELECT student.student_name,COUNT(*) FROM student,course
WHERE student.student_id=course.student_id
GROUP BY student_name;
Функция COUNT(*)
несколько отличается от
описанной выше: она возвращает
количество извлеченных строк,
содержащих величины со
значением NULL.
COUNT(*) оптимизирована
для очень быстрого возврата
результата при условии, что
команда SELECT извлекает
данные из одной таблицы, никакие
другие столбцы не
обрабатываются и функция не
содержит выражения
WHERE. Например:
mysql> SELECT COUNT(*) FROM student;
COUNT(DISTINCT expr,[expr...])
Возвращает количество
различающихся величин со
значением, не равным
NULL:
mysql> SELECT COUNT(DISTINCT results) FROM student;
В MySQL для того, чтобы получить
количество различающихся
комбинаций выражений, не
содержащих NULL, нужно
просто задать список этих
выражений. В ANSI SQL необходимо
провести конкатенацию всех
выражений внутри COUNT(DISTINCT
...).