SELECT
и WHERE
CREATE
, DROP
, ALTER
MySQL поддерживает несколько типов столбцов, которые можно разделить на три категории: числовые типы данных, типы данных для хранения даты и времени и символьные (строковые) типы данных. В данном разделе вначале дается обзор всех возможных типов и приводятся требования по хранению для каждого типа столбца, затем свойства типов описываются более подробно по каждой категории. Мы намеренно сделали обзор кратким, поскольку более детальные описания требуют дополнительной информации о конкретных типах столбцов, например, о допустимых форматах представления величин.
Ниже перечислены типы столбцов, поддерживаемые MySQL. В описаниях используются следующие обозначения:
M
D
M
-2.
Квадратные скобки (`[' и `]') указывают для типа данных группы необязательных признаков.
Заметьте, что если для столбца указать параметр ZEROFILL
, то MySQL будет
автоматически добавлять в этот столбец атрибут UNSIGNED
.
Предупреждение: следует помнить, что при выполнении вычитания между
числовыми величинами, одна из которых относится к типу UNSIGNED
, результат
будет беззнаковым! See section 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 section 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 section 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 section 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 section 6.2.2 Типы данных даты и времени.
Аргумент M
влияет только на способ вывода столбца TIMESTAMP
; для хранения
его значений всегда используется 4 байта. Следует учитывать, что столбцы
TIMESTAMP(M)
, где M
равно 8
или 14
, представляют собой числа, в то время,
как столбцы TIMESTAMP(M)
с иным значением аргумента M
являются строками.
Это убеждает, что можно надежно сделать дамп и восстановить таблицу с
этими типами столбцов! See section 6.2.2.2 Типы данных DATETIME
, DATE
и TIMESTAMP
.
TIME
'-838:59:59'
до '838:59:59'
. MySQL выводит значения
TIME
в формате 'HH:MM:SS'
, но можно устанавливать значения в столбце TIME
,
используя как строки, так и числа. See section 6.2.2.3 Тип данных TIME
.
YEAR[(2|4)]
1901
по 2155
, 0000
для
четырехзначного формата года и 1970-2069
при использовании двухзначного
формата (70-69
). MySQL выводит значения YEAR
в формате YYYY
, но можно
задавать значения в столбце YEAR
, используя как строки, так и числа (тип
данных YEAR
недоступен в версиях, предшествующих MySQL 3.22).
See section 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 section 6.2.3.1 Типы данных CHAR и VARCHAR.
CHAR
CHAR(1)
.
[NATIONAL] VARCHAR(M) [BINARY]
M
составляет от 0
до 255
символов (от 1
до 255
в
версиях, предшествующих MySQL Version 4.0.2). Если не задан атрибут
чувствительности к регистру BINARY
, то величины VARCHAR
сортируются и
сравниваются как независимые от регистра. See section 6.5.3.1 Молчаливые изменения определений столбцов. Термин VARCHAR
является сокращением от CHARACTER
VARYING
. See section 6.2.3.1 Типы данных CHAR и VARCHAR.
TINYBLOB
TINYTEXT
BLOB
или TEXT
с максимальной длиной 255
(2^8 - 1
) символов.
See section 6.5.3.1 Молчаливые изменения определений столбцов. See section 6.2.3.2 Типы данных BLOB
и TEXT
.
BLOB
TEXT
BLOB
или TEXT
с максимальной длиной 65535
(2^16 - 1
)
символов. See section 6.5.3.1 Молчаливые изменения определений столбцов. See section 6.2.3.2 Типы данных BLOB
и TEXT
.
MEDIUMBLOB
MEDIUMTEXT
BLOB
или TEXT
с максимальной длиной 16777215
(2^24 - 1
)
символов. See section 6.5.3.1 Молчаливые изменения определений столбцов. See section 6.2.3.2 Типы данных BLOB
и TEXT
.
LONGBLOB
LONGTEXT
BLOB
или TEXT
с максимальной длиной 4294967295
(2^32 - 1
)
символов. See section 6.5.3.1 Молчаливые изменения определений столбцов. Следует
учитывать, что в настоящее время протокол передачи данных сервер/клиент и
таблицы MyISAM
имеют ограничение 16 Мб на передаваемый пакет/строку таблицы,
поэтому пока нельзя использовать этот тип данных в его полном диапазоне.
See section 6.2.3.2 Типы данных BLOB
и TEXT
.
ENUM('значение1','значение2',...)
'значение1'
, 'значение2'
,
...
, NULL
или специальная величина ошибки ""
. Список ENUM
может содержать
максимум 65535
различных величин. See section 6.2.3.3 Тип перечисления ENUM
.
SET('значение1','значение2',...)
'значение1'
,
'значение2'
, ...
Список SET
может содержать максимум 64 элемента.
See section 6.2.3.4 Тип множества SET
.
DATETIME
, DATE
и TIMESTAMP
TIME
YEAR
BLOB
и TEXT
ENUM
SET
User Comments
Notice:
The documentation says that negative values are
disallowed in FLOAT columns that are marked
UNSIGNED but this is not the case. Moreover, INT
UNSIGNED Columns are set to zero when a negative
value is provided.
Verify your data type before insertion/update.
The manual errs when it says:
BIT
BOOL
These are synonyms for TINYINT(1).
BOOL is a synonym for TINYINT(1) UNSIGNED.
BOOL UNSIGNED generates an error.
> The manual errs when it says:
1 row in set (0.00 sec)> BIT
> BOOL
> These are synonyms for TINYINT(1).
> BOOL is a synonym for TINYINT(1) UNSIGNED.
> BOOL UNSIGNED generates an error.
Although BOOL UNSIGNED generates an error, BOOL does in fact map to TINYINT(1).
Heres a little demo you can try:
mysql> CREATE TABLE test ( tester BOOL );
Query OK, 0 rows affected (0.03 sec)
mysql> SHOW COLUMNS FROM test;
CHAR(0) columns cannot be indexed, so be carefull when choosing it.
I'm somewhat of a newb, so you may already know this. :)
If when using PHP, you get something like:
You have an error in your SQL syntax near 'when='2003-09-24'' at line 1
Try using a diffrent column name, like 'date' or 'time'.
Another idea, try using personal tauches, like 'whenZ'.
I had this problem, I just forgot that 'when' is a command.
well, someone could add such a sentence to help:
When you use BOOL type, value 0 "means" false, all non-zero values - TRUE. I made such way of idea, when I read about logical functions.
If you are having the
"You have an error in your SQL syntax near 'when='2003-09-24'' at line 1"
error like zavaboy pointed out, a good method is to prefix the "when" with the table name. (table_when) This will not only get rid of the error but will also lead to less confusion when you start doing things like joins. It is also good practice to do this with any field so that joins become less of a pain.
A warning when using FLOAT(x,y). If you try try to insert a value into a float column that has a comma (e.g. 1,345), the value will treat the comma as a decimel and truncate it before inserting (i.e. in the case of 1,345 the value inserted would be 1.00).
about using reserved words as field names:
they can be prefixed with the table itself, or quiote tehm with specaila quote characters:
mysql> create table _test (`where` date);
Query OK, 0 rows affected (0.05 sec)
mysql> desc _test;
mysql> select * from _test where _test.where='2003-1-1';
Empty set (0.00 sec)
mysql> select * from _test where `where`='2003-1-1';
Empty set (0.00 sec)
mysql> select `where` from _test;
Empty set (0.00 sec)
Add your own comment.