Документация MySQL
| Документация DHTML | Документация Smarty | SVG/VML Графика и JavaScript
| Документация bash |
| Глава 6. Справочник по языку MySQL | ||
|---|---|---|
| Пред. | След. | |
Глава 6. Справочник по языку MySQL
Содержание
- 6.1. Структура языка
- 6.2. Типы данных столбцов
- 6.3. Функции, используемые в операторах
SELECTиWHERE - 6.4. Обработка данных: SELECT, INSERT, UPDATE, DELETE
- 6.4.1. Синтаксис оператора
SELECT - 6.4.2. Синтаксис оператора
HANDLER - 6.4.3. Синтаксис оператора
INSERT - 6.4.4. Синтаксис оператора
INSERT DELAYED - 6.4.5. Синтаксис оператора
UPDATE - 6.4.6. Синтаксис оператора
DELETE - 6.4.7. Синтаксис оператора
TRUNCATE - 6.4.8. Синтаксис оператора
REPLACE - 6.4.9. Синтаксис оператора
LOAD DATA INFILE - 6.4.10. Синтаксис оператора
DO
- 6.4.1. Синтаксис оператора
- 6.5. Определение данных:
CREATE,DROP,ALTER - 6.5.1. Синтаксис оператора
CREATE DATABASE - 6.5.2. Синтаксис оператора
DROP DATABASE - 6.5.3. Синтаксис оператора
CREATE TABLE - 6.5.4. Синтаксис оператора
ALTER TABLE - 6.5.5. Синтаксис оператора
RENAME TABLE - 6.5.6. Синтаксис оператора
DROP TABLE - 6.5.7. Синтаксис оператора
CREATE INDEX - 6.5.8. Синтаксис оператора
DROP INDEX
- 6.5.1. Синтаксис оператора
- 6.6. Основные команды пользовательских программ MySQL
- 6.7. Команды управления транзакциями и блокировками в MySQL
- 6.8. Полнотекстовый поиск в MySQL
- 6.9. Кэш запросов в MySQL
MySQL имеет очень сложный, но интуитивно понятный и легкий в изучении интерфейс, основанный на SQL (структурированный язык запросов). В данном разделе описываются различные команды, типы данных и функции этого языка, которые необходимо знать, чтобы использовать MySQL рационально и эффективно. Данная глава служит также справочником по всем функциональным возможностям, реализованным в MySQL. Читатель найдет в этой главе ссылки на различные источники информации, которые, возможно, будут полезными для ее эффективного использования.
6.1. Структура языка
- 6.1.1. Литералы: представление строк и чисел
- 6.1.2. Имена баз данных, таблиц, столбцов, индексы псевдонимы
- 6.1.3. Чувствительность имен к регистру
- 6.1.4. Переменные пользователя
- 6.1.5. Системные переменные
- 6.1.6. Синтаксис комментариев
- 6.1.7. ``Придирчив'' ли MySQL к зарезервированным словам?
6.1.1. Литералы: представление строк и чисел
В этом разделе описываются различные способы представления строк и чисел в MySQL. Здесь затронуты также различные нюансы и особенности, с которыми могут столкнуться программисты при работе с этими базовыми типами данных в MySQL.
6.1.1.1. Cтроки
Строка представляет собой
последовательность символов,
заключенных либо в одинарные
кавычки (‘'’) -
апострофы, либо в двойные кавычки
(‘"’). При
использовании диалекта 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-последовательности:
NULASCII 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 предоставляют определенную возможность использования символов-заменителей, что позволяет вносить специальные маркеры в строку запроса и затем связывать с ними значения данных при выдаче результатов запроса.
6.1.1.2. Числа
Целые числа представляются в виде
последовательности цифр. Для
чисел с плавающей точкой в
качестве разделителя десятичных
знаков используется символ
‘.’. Числа обоих
типов могут предваряться
символом ‘-’,
обозначающим отрицательную
величину.
Примеры допустимых целых чисел:
1221 0 -32
Примеры допустимых чисел с плавающей запятой:
294.42 -32032.6809e+10 148.00
Целое число можно использовать в контексте дробных чисел, при этом оно будет интерпретироваться как эквивалент числа с плавающей запятой.
6.1.1.3. Шестнадцатеричные величины
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().
6.1.1.4. Значения NULL
Значение NULL означает
``отсутствие данных''. Они является
отличным от значения 0 для
числовых типов данных или пустой
строки для строковых типов (see
Раздел A.5.3, «Проблемы со значением NULL»).
При использовании форматов
импорта или экспорта текстовых
файлов (LOAD DATA INFILE, SELECT ... INTO
OUTFILE) NULL можно
представить как \N (see
Раздел 6.4.9, «Синтаксис оператора LOAD DATA INFILE»).
6.1.2. Имена баз данных, таблиц, столбцов, индексы псевдонимы
Для всех имен баз данных, таблиц, столбцов, индексов и псевдонимов в 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-setmysqld(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 ставят
в начале имен таблиц в качестве
префикса символ
‘.’.
6.1.3. Чувствительность имен к регистру
В 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.
6.1.4. Переменные пользователя
Для конкретного процесса
пользователь может определить
локальные переменные, которые в 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.
6.1.5. Системные переменные
Начиная с 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».
6.1.6. Синтаксис комментариев
Сервер 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, «Символы `--' как начало комментария»).
6.1.7. ``Придирчив'' ли MySQL к зарезервированным словам?
Это общая проблема, возникающая
при попытке создать таблицу с
именами столбцов, использующих
принятые в 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 |
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 | XOR | YEAR_MONTH |
ZEROFILL |
Следующие слова являются новыми зарезервированными словами в MySQL 4.0:
CHECK | FORCE | LOCALTIME |
LOCALTIMESTAMP | REQUIRE | SQL_CALC_FOUND_ROWS |
SSL | XOR |
Следующие символы (из приведенной выше таблицы таблицы) не разрешены в ANSI SQL, но допускаются в MySQL как имена столбцов/таблиц. Это объясняется тем, что некоторые из этих имен являются словами естественного языка и уже использованы многими потребителями.
ACTIONBITDATEENUMNOTEXTTIMETIMESTAMP
6.2. Типы данных столбцов
- 6.2.1. Числовые типы данных
- 6.2.2. Типы данных даты и времени
- 6.2.3. Символьные типы данных
- 6.2.4. Выбор правильного типа данных в столбце
- 6.2.5. Использование типов столбцов из других баз данных
- 6.2.6. Требования к памяти для различных типов столбцов
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».
6.2.1. Числовые типы данных
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 |
6.2.2. Типы данных даты и времени
- 6.2.2.1. Проблема 2000 года и типы данных
- 6.2.2.2. Типы данных
DATETIME,DATEиTIMESTAMP - 6.2.2.3. Тип данных
TIME - 6.2.2.4. Тип данных
YEAR
Существуют следующие типы данных
даты и времени: 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'TIMESTAMP00000000000000(длина зависит от количества выводимых символов)TIME'00:00:00'YEAR0000Значения ``ноль'' - особые. Для их хранения или ссылок на них можно явно применять представленные в таблице значения, а можно использовать ‘
0’ или ‘0’, что легче в написании.Значения ``ноль'' даты или времени при использовании MyODBC автоматически конвертируются в
NULLв версии MyODBC 2.50.12 и выше, так как ODBC не оперирует с подобными величинами.
6.2.2.1. Проблема 2000 года и типы данных
Ядро 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)).
6.2.2.2. Типы данных DATETIME, DATE и TIMESTAMP
Типы DATETIME, DATE
и TIMESTAMP являются
родственными типами данных. В
данном разделе описаны их
свойства, общие черты и различия.
Тип данных DATETIME
используется для величин,
содержащих информацию как о дате,
так и о времени. MySQL извлекает и
выводит величины DATETIME в
формате 'YYYY-MM-DD HH:MM:SS'.
Поддерживается диапазон величин
от '1000-01-01 00:00:00' до
'9999-12-31 23:59:59'.
(''поддерживается'' означает, что
хотя величины с более ранними
временными значениями, возможно,
тоже будут работать, но нет
гарантии того, что они будут
правильно храниться и
отображаться).
Тип DATE используется для
величин с информацией только о
дате, без части, содержащей время.
MySQL извлекает и выводит величины
DATE в формате
'YYYY-MM-DD'. Поддерживается
диапазон величин от
'1000-01-01' до
'9999-12-31'.
Тип столбца TIMESTAMP
обеспечивает тип представления
данных, который можно
использовать для автоматической
записи текущих даты и времени при
выполнении операций
INSERT или UPDATE.
При наличии нескольких столбцов
типа TIMESTAMP только
первый из них обновляется
автоматически.
Автоматическое обновление
первого столбца с типом
TIMESTAMP происходит при
выполнении любого из следующих
условий:
Столбец не указан явно в команде
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.
6.2.2.3. Тип данных TIME
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' или является
преобразованным значением
недопустимой величины.
6.2.2.4. Тип данных YEAR
Тип 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.
6.2.3. Символьные типы данных
- 6.2.3.1. Типы данных CHAR и VARCHAR
- 6.2.3.2. Типы данных
BLOBиTEXT - 6.2.3.3. Тип перечисления
ENUM - 6.2.3.4. Тип множества
SET
Существуют следующие символьные
типы данных: 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 |
6.2.3.1. Типы данных CHAR и VARCHAR
Типы данных CHAR и
VARCHAR очень схожи между
собой, но различаются по способам
их хранения и извлечения.
В столбце типа CHAR длина
поля постоянна и задается при
создании таблицы. Эта длина может
принимать любое значение между
1 и 255 (что же
касается версии MySQL 3.23, то в ней
длина столбца CHAR