当使用CREATE TABLE语句创建一个表时,表中的每一列必须声明为MySQL所支持的数据类型。使用ALTER TABLE语 句可以添加或修改表中的某一列。把数据类型划分为如下三个基本类型:数值类型、 日期和时间类型以及字符串类型。
一、数值数据类型
-
BIT
这是一个位字段数据类型列。使用该列,你可以指定最大的字段位数。该值可以接受的范围为1到64,如果没有指定宽度,则默认值为1。你可以使用该列来存储二进制数据(比如,由1和0组成的数据)。你也可以在该列中使用类似于BIn( )这样的函数。 -
TINYINT
本数据类型列用于很小的整数值。有符号的范围为-128到127;无符号的范围是0到255。如果没有指定宽度,则默认宽度为4。该类型的列对于简单的逻辑列十分有用。 -
BOOL,BOOLEAN
B0OL数据类型列是BOOLEAN和TINYINT(1)的同义词。事实上,如果你把某一列设置成了这种类型,接着使用DESCRIBE语句来查看该列的描述,它将以TINYINT(1)的形式 显示出来。对于值只有true或者false这样的简单逻辑列,它能够派上用场。 -
SMALLINT
本数据类型列用于小整数值。有符号数的范围为-32,768;无符号数的范围为0到65,535。如果没有指定宽度,其默认值为6。 -
MEDIUMINT
该数据类型列适用于中等大小的整数值。有符号数的范围为-8,388,608;无符号数的范围为0到16.777,215。如果没有指定宽度,其默认值为9。 -
INT,INTEGER
最普通的数值类型列。有符号数的范围为-2,147,483,648到2,147,483,647;无符号数的范围为0到4,294,967,295。如果没有指定宽度,其默认值为11。INTEGER是INT数据类型的同义词。 -
BIGINT,SERIAL
该数据类型适用于大整数值。有符号数的范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807;无符号数的范围为0到18,446,744,073,709,551,615。如果没有指定
宽度,其默认值为20。INTEGER是 INT数据类型的同义词。SERIAL是BIGINT数据类型的同义词,但是SERIAL必须指定列选项: BIGINT、UNSIGNED、NOT NULL、AUTO INCREMENT和UNIQUE。 -
FLOAT
可以指定该类数据类型的精度标准。单精度浮点数的精度标准为0到24,而双精度浮点数的则为25到53。为了保持与ODBC的兼容性,可以使用第二条语法用位指定精度。如果你没有为FLOAT指定精度,则默认情况下为单精度浮点数。如果服务器的SQL模式启用了REAL_AS_FLOAT选项,则REAL是FL0AT的同义词。当启动服务器时,可以在sql-mode选项中进行设置。 -
DOUBLE,DOUBLE,PRECISION
你可以使用这个近似的数据类型列—浮点数。 给定的宽度是总数字的最大宽度—在小数点位置的两侧,并不包括小数点。给定的小数是小数数字的位数以及小数点后填零的数目。
例如,对于一个类型为DOUBLE(4, 2)的列,如果给定值为123.4,则会返回一个警告并把该值存储为给定宽度的最大值,即99.99。 如果该列给定的值为12.3,它便不会产生任何警告,并把该值存储为12.30。
有符号数的范围为-1.7976931348623157E+308到-2.2250738585072014E-308,而无符号数的范围为2.2250738585072014E-308到1.7976931348623157E+308。由于服务器的硬件和操作系统的限制,通常情况下,并不能达到这些限制。这种数据类型的精度可以达到15位小数位。这种数据类型如果指定了UNSIGNED修饰符的话,则它们的值不允许为负数。如果服务器的SQL模式没有启用REAL_AS_FLOAT选项, 此时REAL是DOUBLE的同义词。 -
DEC,DECIMAL,FIXED,NUMERIC
这种数据类型与FL0AT十分相似,但是它用于精确度非常高的定点数中。当用DECIMAL列进行计算时,它的精度总数可以达到65位。给定的宽度是总数字的最大宽度—在小数点位置的两侧,且不包括小数点;或者如果为负数,则不包括负号。给定的小数是小数数字的位数以及小数点后填零的数目。例如,对于一个 类型为DECIMAL(4,2)的列,如果给定值为123.4,则会返回一个警告并把该值存储为给定宽度的最大值,即99.99。如果该列给定的值为12.3,它便不会产生任何警告,并把该值存储为12.30。如果某一列的数据类型为DECIMAL且指定了UNSIGNED修饰符,则该列不允许有负值。
MySQL把DECIMAL列中的数字存储为字符串。因此,超出这种数据类型的最大范围的数字存储在DECIMAL列中。这种数据类型以字符串的形式被检索和显示,但是在上下文中则为数字(如,作为计算结果的一部分),它不能超过表中显示的数值。
二、日期和时间数据类型
日期和时间类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
DATE | 4 | 1000-01-01 | 9999-12-31 |
DATETIME | 8 | 10-01-01 00:00:00 | 9999-12-31 23:59:59 |
TIMESTAMP | 4 | 19700101080001 | 2038年的某一刻 |
TIME | 3 | -838:59:59 | 838:59:59 |
YEAR | 1 | 1901 | 2155 |
三、字符串数据类型
-
CHAR
CHAR类型是固定宽度的列,如果需要的话,在它们的右边填充空格(以达到指定的长度)。查询时,结果中并没有包含这些空格。CHAR列的长度可以从0到255。如果没有指定宽度,默认情况下其值为1。CHAR类型与CHARACTER是同义词。你也可以使用NATIONALCHARACTER或NCHAR来指示定义的字符集为国际字符集。在存储过程中,在CHAR列的右边会以空格来填充。在MyISAM表的CHAR列上,可以执行FULLTEXT索引和查找。
从MySQL 4.1版本开始,在使用CHAR类型时,你可以为它们指定ASCII属性。这将为该列设置latin1字符集。从MySQL 4.1版本开始,你也可以为CHAR类型指定UNICODE属性,这将为该列设置ucs2字符集。 -
VARCHAR
VARCHAR类型调整自身的宽度,它并不对存储的字符串加以填充。在存储过程中,包含在字符串中的尾部空格将会被移除。VARCHAR列的长度可以从0到65,535。这种类型的字符集可以影响给定的字符串数目,因为每个字符串要求不止一个字节(如,UTF-8)。如果没有指定宽度,默认情况下其值为1。CHARACTER类型与CHARACTER VARYING是同义词。你也可以使用NATIONAL VARCHAR来指示定义的字符集为国际字符集。在MyISAM表的VARCHAR列上,可以执行FULLTEXT索引和查找。 -
BINARY
这种数据类型存储的数据是二进制字符串而不是类似于CHAR那样的字符串。指定的最大宽度是以字节为单位的一在使用该类型的数据时必须指定这个值。这种数据类型代替了CHAR BINARY。如果你使用的MySQL是4.1.2之前的版本,那么你可以在CHAR之后添加BINARY修饰符,这会令MySQL把这些值当作字节字符串并对它们进行分类和比较。如果在表达式中使用BINARY列,那么MySQL会把表达式中的所有元素当成二进制字符串来看待。 -
VARBINARY
这种数据类型存储的数据是二进制字符串而不是类似于VARCHAR那样的字符串。指定的最大宽度是以字节为单位的—在使用该类型的数据时必须指定这个值。在某一列中,如果你想使用特定的而不是表中默认的字符集,那么你可以为该列指定一个字符集。列中存储的这些值是以字符集校验为基础的。这种数据类型代替了VARCHAR BINARY。如果你使用的MySQL是4.1.2之前的版本,那么可以在VARCHAR之后添加BINARY修饰符,这会令MySQL把这些值当作字节字符串并对它们进行分类和比较。表达式中的所有元素会被当成二进制字符串来看待。 -
TINYBLOB
这种数据类型的列允许存储二进制数据,其最大宽度为255个字节。 -
TINYTEXT
这种数据类型的列允许存储文本数据,其最大宽度为255个字节。在某一列中,如果你想使用特定的而不是表中默认的字符集,那么你可以为该列指定一个字符集。列中存储的这些值是以字符集校验为基础的。 -
BLOB
这种数据类型的列允许存储大量的二进制数据。你可以为该种数据类型指定一个宽度,其最大值为65,535个字节。如果你试图在BLOB (Binary Large Object,二进制大对象)列中存储一个超出其范围的值,除非服务器设定为SQL严格模式,否则数据将会被截短并且产生警告信息。如果开启了严格模式,那么MySQL会拒绝该数据并返回出错信息。BL0B列没有默认值。你可以指定max_sort_length系统变量的值以便对数据进行分类。在每列中,只有由该变量指定了字节数的数据才可以包含在分类中。 -
TEXT
这种数据类型的列允许存储大量的二进制数据。你可以为该种数据类型指定一个宽度,其最大值为65,535个字节。如果你试图在TEXT列中存储一个超出其范围的值,除非服务器设定为SQL严格模式,否则数据将会被截短并且产生警告信息。如果开启了严格模式,那么MySQL会拒绝该数据并返回出错信息。TEXT列没有默认值。你可以指定max_ sort_length系统变量的值以便对数据进行分类。在每列中,只有由该变量指定了字节数的数据才可以包含在分类中。你可以在MyISAM表中的TEXT列上执行FULLTEXT索引和查找。在某一列中,如果你想使用特定的而不是表中默认的字符集,那么你可以为该列指定一个字符集。列中存储的这些值是以字符集校验为基础的。 -
MEDIUMBLOB
这种数据类型的列允许存储大量的二进制形式的中等长度的文本数据,其最大宽度为16,777,215个字节。 -
MEDIUMTEXT
这种数据类型的列允许存储大量的中等长度的文本数据,其最大宽度为16.777,215个字节。在某一列中,如果你想使用特定的而不是表中默认的字符集,那么可以为该列指定一个字符集。列中存储的这些值是以字符集校验为基础的。 -
LONGBLOB
这种数据类型的列允许存储大量的二进制形式的极大文本的数据,其最大宽度为4G。 -
LONGTEXT
这种数据类型的列允许存储大量的极大文本数据,其最大宽度为4G。在某一列中,如果你想使用特定的而不是表中默认的字符集,那么你可以为该列指定一个字符集。列中存储的这些值是以字符集校验为基础的。 -
ENUM
在ENUM列中,所有可能的选择都包含在了里面(如,ENUM(‘yes’, ‘no’, ‘maybe’)) 。它也有可能包含空值(如,’’)和NULL。如果ENUM列声明为允许NULL值,那么该列的默认值便是NULL。如果ENUM列声明为NOT NULL, 则该列不允许NULL并且默认值为给定值的第一个元素。
MySQL在列中存储了枚举值的数字索引,其中第一个值为1。在数值上下文中检索这些值时,会用到该列。当往列中输入数据时(如,UPDATE table1 SET col1 = 3;更改第三个元素的值),便会执行相反的操作。存储在列中的这些ENUM值是根据数字索引的编号进行升序排序,而不是按照它们相应的枚举值进行排序。在某一列中,如果你想使用特定的而不是表中默认的字符集,那么你可以为该列指定一个字符集。列中存储的这些值是以字符集校验为基础的。 -
SET
SET类型与ENUM类型相似,只是SET列可以保存多个值(如,UPDATE table1 SET col1 =‘a, b’; )。你可以用FIND_IN_SET( )函数对SET类型的值进行过滤。在某一列中,如果你想使用特定的而不是表中默认的字符集,那么你可以为该列指定一个字符集。列中存储的这些值是以字符集校验为基础的。
参考书籍
- 《深入理解MySQL核心技术》