mysql数据类型详解


转载1: 转载请注明出处: php程序员的笔记

(1)下面列举的是使用MySQL数据库过程中一些比较常见的数据类型的解释和说明。

1、整型

数据类型存储空间说明取值范围
TINYINT1字节非常小的整数带符号值:-128 ~ 127
无符号值:0 ~ 255
SMALLINT2字节较小的整数带符号值:-32768 ~ 32767
无符号值:0 ~ 65535
MEDIUMNT3字节中等大小的整数带符号值:-8388608 ~ 8388607
无符号值:0 ~ 16777215
INT4字节标准整数带符号值:-2147483648 ~ 2147483647
无符号值:0 ~ 4294967295
BIGINT8字节大整数带符号值:-263 (-9223372036854775808) ~ 263-1 (9223372036854775807)
无符号值:0 ~ 2^63-1 (9223372036854775807)

2、浮点型

数据类型存储空间说明取值范围
FLOAT4字节单精度浮点数 
DOUBLE8字节双精度浮点数 
DECIMAL(M,D)自定义以字符串形式表示 

3、字符串类型

类型存储空间说明最大长度
Char[(M)]M字节定长字符串M字节
Varchar[(M)]L+1字节可变长字符串M字节
tinyblog,tingtextL+1字节非常小的blob和文本串28字符
blob,textL+2字节小BLOB和文本串216-1字节
mediumblob,mediumtextL+3字节中等的BLOB和文本串224字节
longblob,longtextL+4字节大BLOB和文本串232-1字节
enum('value','value')1或2字节枚举:可赋予某个枚举成员65535个成员
set('value', 'value')1,2,3,4或8字节集合:可赋予多个集合成员64个成员

4、日期和时间类型

类型存储空间说明最大长度
Date3字节YYYY-MM-DD格式表示1000-01-01 ~ 9999-12-31
TIME3字节hh:mm:ss格式表示时间值-838:59:59 ~ 838:59:59
DATETIME8字节YYYY-MM-DD  hh:mm:ss格式 
TIMESTAMP4字节YYYYMMDDhhmmss格式表示时间戳 
YEAR1字节YYYY格式的年份值1901 ~ 2155


转载2:蓝海豹 http://www.cnblogs.com/lteal/archive/2013/03/04/2943061.html

MySQL数据类型,可以被分为3类:数值类型日期和时间类型以及字符串(字符)类型

 方括号(“[”和“]”)指出可选的类型修饰符的部分

  M 
    指出最大的显示尺寸。最大的合法的显示尺寸是 255 。 
  D 
   适用于浮点类型并且指出跟随在十进制小数点后的数码的数量。最大可能的值是30,但是应该不大于M-2。

  UNSIGNED
  
  为“无符号”的意思, 即为非负数。是MYSQL自定义的类型,非标准SQL。unsigned 属性只针对整型,用途:
    1.UNSIGNED 可用来约束数据的范围,例如有些年龄这种值一般能是负数,那么就可以设置一个 UNSIGNED ,这样可以不允许负数插入。
    2.可以增加数值范围(相当于把负数那部分加到正数上)。不过少用,不方便移植。

  ZEROFILL
    填零,即在数字长度不够的数据前面填充0,以达到设定的长度,MySQL中字段设置为该属性时,将为该列自动地增加UNSIGNED属性。

一、数值类型

    整型:(1个字节是8位)

            在MySQL中创建整型字段INT(或其它像tinyint)时,可以设定该字段的位数。如int(11),int(5),如果不指定位数,INT型默认长度为11。字段插入长度与int设定的M无关,当插入长度大于设定的M时,字段值不会被截断,还是按照类型的实际精度进行保存。
            整型字段有个ZEROFILL属性,在数字长度不够的数据前面填充0,以达到设定的长度。M值只当属性为ZEROFILL时,才有区别效果
            如表结构为id1 int(10) ,id2 int(5),对应数据为  第一行为(1,1),第二行为(1111111,1111111),当id1,id2字段设置为ZEROFILL属性时,显示数据为第一行为(0000000001,00001),第二行为(0001111111,1111111),不够的位数会以0补齐。

 
数据类型 大小 M
(默认值)
范围(有符号) 范围(无符号) 用途
tinyint [(M)] [UNSIGNED] [ZEROFILL] 1字节 4 -128~127  (-27~27-1) 0 ~ 255 (0 ~ 28-1) 非常小整数值
smallint [(M)] [UNSIGNED] [ZEROFILL] 2字节 6 -32768~32767(-215 ~ 215-1) 0 ~ 65535 (0 ~ 216-1)  较小整数
mediumint [(M)] [UNSIGNED] [ZEROFILL] 3字节 9 -8388608 ~ 8388607 (-223 ~ 223-1) 0 ~ 16777215 (0 ~ 224-1)  中等大小整数
int [(M)] [UNSIGNED] [ZEROFILL] 4字节  11 -2147483648 ~ 2147483647(-231 ~ 231-1) 0 ~ 4294967295 (0 ~ 232-1)  标准整数
integer [(M)] [UNSIGNED] [ZEROFILL] 4字节  11 -2147483648 ~ 2147483647(-231 ~ 231-1) 0 ~ 4294967295 (0 ~ 232-1)int相同
bigint [(M)] [UNSIGNED] [ZEROFILL] 8字节 20 -9223372036854775808 ~9223372036854775807
(-263 ~ 263-1)
0 ~ 18446744073709551615
(0 ~ 264-1)
 较大整数

   浮点型:

            (M,D) 表示总共M位,D个小数位,D包含于M中。浮点类型不能是unsigned的。 

            对每种浮点类型,可指定一个最大的显示尺寸M和小数位数D。M的值应该取1到255。D的值可为0到30,但是不应大于M-2。M和D对float和double都是可选的,但对于decimal是必须的,在选项M和D时,如果省略了它们,则使用缺省值,如果D被省略,它被设置为0。如果M被省掉,它被设置为10。

数据类型 大小 用途
float [(M,D)] [ZEROFILL] 4字节 单精度浮点型,8位精度;参数m只影响显示效果,不影响精度,d却不同,会影响到精度;m是十进制数字的总个数,d是小数点后面的数字个数
double[(M,D)] [ZEROFILL] 8字节 双精度浮点型,16位精度;参数m只影响显示效果,不影响精度,d却不同,会影响到精度
real[(M,D)] [ZEROFILL] 8字节  同double
decimal[(M[,D])] [ZEROFILL] 4字节   decimal(m,d) 定点类型浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。参数m是定点类型数字的最大个数(精 度),范围为0~65,d小数点右侧数字的个数,范围为0~30,但不得超过m。对定点数的计算能精确到65位数字。DECIMAL 数据类型用于精度要求非常高的计算中,这种类型允许指定数值的精度和计数方法作为选择参数。精度在这里指为这个值保存的有效数字的总个数,而计数方法表示小数点后数字的位数。比如语句 DECIMAL(7,3) 规定了存储的值不会超过 7 位数字,并且小数点后不超过 3 位
numeric[(M,D)]  [ZEROFILL] 4字节  同decimal

           DECIMAL 类型不同于FLOAT和DECIMAL,其中DECIMAL 实际是以串存放的。DECIMAL 可能的最大取值范围与DOUBLE 一样,但是其有效的取值范围由M 和D 的值决定。如果改变M 而固定D,则其取值范围将随M 的变大而变大。表2 - 7的前三行说明了这一点。如果固定M 而改变D,则其取值范围将随D 的变大而变小(但精度增加)。表2 - 7的后三行说明了这一点。

mysql数据类型

          给定的DECIMAL 类型的取值范围取决于MySQL数据类型的版本。对于MySQL3.23 以前的版本,DECIMAL(M, D) 列的每个值占用M 字节,而符号(如果需要)和小数点包括在M 字节中。因此,类型为DECIMAL(5, 2) 的列,其取值范围为-9.99 到9 9 . 9 9,因为它们覆盖了所有可能的5 个字符的值。正如MySQL3.23 一样,DECIMAL 值是根据ANSI 规范进行处理的, ANSI 规范规定DECIMAL(M, D) 必须能够表示M 位数字及D 位小数的任何值。
         例如, DECIMAL(5, 2) 必须能够表示从-999.99 到999.99 的所有值。而且必须存储符号和小数点,因此自MySQL3.23以来DECIMAL 值占M + 2 个字节。对于DECIMAL(5, 2),“最长”的值(- 9 9 9 . 9 9)需要7个字节在正取值范围的一端,不需要正号,因此MySQL数据类型利用它扩充了取值范围,使其超过了ANSI 所规范所要求的取值范围。如DECIMAL(5, 2) 的最大值为9 9 9 9 . 9 9,因为有7 个字节可用
        简而言之,在MySQL3.23 及以后的版本中,DECIMAL(M, D) 的取值范围等于更早版本中的DECIMAL(M + 2, D) 的取值范围。在MySQL数据类型的所有版本中,如果某个DECIMAL 列的D 为0,则不存储小数点。这样做的结果是扩充了列的取值范围,因为过去用来存储小数点的字节现在可用来存放其他数字了。

二、字符类型

      对于可变长的字符类型,其值所占的存储量是不同的,这取决于实际存放在列中的值的长度,这个长度用L表示。

数据类型 大小(范围) 用途
char(M)[BINARY]

M个字节,0 <= M <= 255 (L为固定的=255,不够补空格)

定长字符串;CHAR 类型可以使用 BINARY 修饰符。当用于比较运算时,这个修饰符使 CHAR 以二进制方式参于运算,而不是以传统的区分大小写的方式。CHAR值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键词
varchar(M) [BINARY]

L+1个字节,其中L <= 0 <= M <= 65535(MySQL5.0之前都是最大255)

变长字符串;VARCHAR 类型在使用 BINARY 修饰符时与 CHAR 类型完全相同
tinyblobtinytext

L+1个字节,其中L < 28-1 (255)

tinyblob:不超过 255 个字符的二进制字符串;tinytext:短文本字符串
blob,text

L+2个字节,其中L < 216-1 (65535)

blob:二进制形式的长文本数据,在分类和比较时BLOB 类型区分大小写;text:长文本数据,在分类和比较时TEXT 不区分大小写
mediumblob,mediumtext

L+3个字节,其中L < 224-1

mediumblob:二进制形式的中等长度文本数据;mediumtext :中等长度文本数据,
longblob,longtext

L+4个字节,其中L < 232-1

longblob:二进制形式的极大文本数据   ;longtext :极大文本数据
enum('value1','value2',...)

12个字节,取决于枚举值的个数(最多65,535个值)

 
set('value1','value2',...)

1234或者8个字节,取决于set成员的数目(最多64个成员)

 

三、日期类型

      MySQL 带有 5 个不同的数据类型可供选择。它们可以被分成简单的日期、时间类型,和混合日期、时间类型。根据要求的精度,子类型在每个分类型中都可以使用,并且 MySQL 带有内置功能可以把多样化的输入格式变为一个标准格式。

类型 大小  范围 格式 用途
YEAR[(2|4)] 1字节 1901/2155 YYYY 年份值
DATE 3字节 '1000-01-01'--'9999-12-31' YYYY-MM-DD  日期值
TIME 3字节 '-838:59:59'到'838:59:59' HH:MM:SS  时间值或持续时间
DATETIME 8字节  '1000-01-01 00:00:00'--'9999-12-31 23:59:59' YYYY-MM-DD HH:MM:SS  混合日期和时间值
TIMESTAMP[(M)] 8字节   1970-01-01 00:00:00/2037 年某时 YYYYMMDD HHMMSS  混合日期和时间值,时间戳

 (1)YEAR

   给YEAR类型赋值可以有三种方法。

   第一种是直接插入4位字符串或者4位数字。

   第二种是插入2位字符串,这种情况下如果插入‘00’~‘69’,则相当于插入2000~2069;如果插入‘70’~‘99’,则相当于插入1970~1999。第二种情况下插入的如果是‘0’,则与插入‘00’效果相同,都是表示2000年。

    第三种是插入2位数字,它与第二种(插入两位字符串)不同之处仅在于:如果插入的是一位数字0,则表示的是0000,而不是2000年。所以在给YEAR类型赋值时,一定要分清0和‘0’,虽然两者相差个引号,但实际效果确实相差了2000年。

(2)DATE

   MySQL是以YYYY-MM-DD格式来显示DATE类型的值,插入数据时,数据可以保持这种格式。另外,MySQL还支持一些不严格的语法格式,分隔符“-”可以用“@”、“.”等众多富豪来替代。在插入数据时,也可以使用“YY-MM-DD”格式,YY转化成对应的年份的规则与YEAR类型类似。如果我们想插入当前系统的时间,则可以插入CURRENT_DATE或者NOW()。
   允许使用字符串或数字把值赋给DATE列。

(3)TIME

    TIME类型表示为“时:分:秒”,尽管小时范围一般是0~23,但是为了表示某些特殊时间间隔,MySQL将TIME的小时范围扩发了,而且支持负值。对TIME类型赋值,标准格式是"HH:MM:SS",但不一定非要是这种格式。如果插入的是"D HH:MM:SS"格式,则类似插入了"(D*24+HH):MM:SS"。比如插入"2 23:50:50",相当于插入了"71:50:50"。如果插入的是"HH:MM"或"SS"格式,则效果是其他未被表示位的值赋为零值。比如插入"30",相当于插入了"00:00:30";如果插入"11:25",相当于插入了"11:25:00"。
    另外也可以插入‘D HH’和‘D HH:MM’,效果按上面的例子可以推理出来了吧。 在MySQl中,对于'HHMMSS'格式,系统能够自动转化为标准格式。如果我们想插入当前系统的时间,则可以插入CURRENT_TIME或者NOW()。     
    TIME类型允许使用字符串或数字把值赋给TIME列,只占3个字节,如果只是存储时间数据,它最合适了。
    需要注意的是,没有冒号分隔符的 TIME 类型值,将会被 MySQL 理解为持续的时间,而不是时间戳。

(4)DATETIME

    通常用于自动存储包含当前日期和时间的时间戳,并可在需要执行大量数据库事务和需要建立一个调试和审查用途的审计跟踪的应用程序中发挥良好作用。

(5)TIMESTAMP

    通常用于自动存储包含当前日期和时间的时间戳,并可在需要执行大量数据库事务和需要建立一个调试和审查用途的审计跟踪的应用程序中发挥良好作用。   
    TIMESTAMP的取值范围比较小,没有DATETIME的取值范围大,因此输入值时一定要保证在TIMESTAMP的范围之内。它的插入也与插入其他日期和时间数据类型类似。
    那么TIMESTAMP类型如何插入当前时间?第一,可以使用CURRENT_TIMESTAMP;第二,输入NULL,系统自动输入当前的TIMESTAMP;第三,无任何输入,系统自动输入当前的TIMESTAMP。
    另外有很特殊的一点:TIMESTAMP的数值是与时区相关.
    MySQL以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD格式来显示TIMESTAMP值,取决于是否M是14(或省略)、12、8或6,但是允许你使用字符串或数字把值赋给TIMESTAMP列。一个TIMESTAMP列对于记录一个INSERT或UPDATE操作的日期和时间是有用的,因为如果你不自己给它赋值,它自动地被设置为最近操作的日期和时间。你以可以通过赋给它一个NULL值设置它为当前的日期和时间

转载3:


数值类型

  MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段中的值是否有正负之分或者用零填补。

  表列出了各种数值类型以及它们的允许范围和占用的内存空间。

类型
大小
范围(有符号)
范围(无符号)
用途
TINYINT
1 字节
(-128,127)
(0,255)
小整数值
SMALLINT
2 字节
(-32 768,32 767)
(0,65 535)
大整数值
MEDIUMINT
3 字节
(-8 388 608,8 388 607)
(0,16 777 215)
大整数值
INT或INTEGER
4 字节
(-2 147 483 648,2 147 483 647)
(0,4 294 967 295)
大整数值
BIGINT
8 字节
(-9 233 372 036 854 775 808,9 223 372 036 854 775 807)
(0,18 446 744 073 709 551 615)
极大整数值
FLOAT
4 字节
(-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)
0,(1.175 494 351 E-38,3.402 823 466 E+38)
单精度
浮点数值
DOUBLE
8 字节
(1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)
0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)
双精度
浮点数值
DECIMAL
对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2
依赖于M和D的值
依赖于M和D的值
小数值

 

INT 类型

  在 MySQL 中支持的 5 个主要整数类型是 TINYINT,SMALLINT,MEDIUMINT,INT 和 BIGINT。这些类型在很大程度上是相同的,只有它们存储的值的大小是不相同的。

  MySQL 以一个可选的显示宽度指示器的形式对 SQL 标准进行扩展,这样当从数据库检索一个值时,可以把这个值加长到指定的长度。例如,指定一个字段的类型为 INT(6),就可以保证所包含数字少于 6 个的值从数据库中检索出来时能够自动地用空格填充。需要注意的是,使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围。

  万一我们需要对一个字段存储一个超出许可范围的数字,MySQL 会根据允许范围最接近它的一端截短后再进行存储。还有一个比较特别的地方是,MySQL 会在不合规定的值插入表前自动修改为 0。

  UNSIGNED 修饰符规定字段只保存正值。因为不需要保存数字的正、负符号,可以在储时节约一个“位”的空间。从而增大这个字段可以存储的值的范围。

  ZEROFILL 修饰符规定 0(不是空格)可以用来真补输出的值。使用这个修饰符可以阻止 MySQL 数据库存储负值。

FLOAT、DOUBLE 和 DECIMAL 类型

  MySQL 支持的三个浮点类型是 FLOAT、DOUBLE 和 DECIMAL 类型。FLOAT 数值类型用于表示单精度浮点数值,而 DOUBLE 数值类型用于表示双精度浮点数值。

  与整数一样,这些类型也带有附加参数:一个显示宽度指示器和一个小数点指示器。比如语句 FLOAT(7,3) 规定显示的值不会超过 7 位数字,小数点后面带有 3 位数字。

  对于小数点后面的位数超过允许范围的值,MySQL 会自动将它四舍五入为最接近它的值,再插入它。

  DECIMAL 数据类型用于精度要求非常高的计算中,这种类型允许指定数值的精度和计数方法作为选择参数。精度在这里指为这个值保存的有效数字的总个数,而计数方法表示小数点后数字的位数。比如语句 DECIMAL(7,3) 规定了存储的值不会超过 7 位数字,并且小数点后不超过 3 位。

  忽略 DECIMAL 数据类型的精度和计数方法修饰符将会使 MySQL 数据库把所有标识为这个数据类型的字段精度设置为 10,计算方法设置为 0。

  UNSIGNED 和 ZEROFILL 修饰符也可以被 FLOAT、DOUBLE 和 DECIMAL 数据类型使用。并且效果与 INT 数据类型相同。

字符串类型

  MySQL 提供了 8 个基本的字符串类型,可以存储的范围从简单的一个字符到巨大的文本块或二进制字符串数据。

类型
大小
用途
CHAR
0-255字节
定长字符串
VARCHAR
0-255字节
变长字符串
TINYBLOB
0-255字节
不超过 255 个字符的二进制字符串
TINYTEXT
0-255字节
短文本字符串
BLOB
0-65 535字节
二进制形式的长文本数据
TEXT
0-65 535字节
长文本数据
MEDIUMBLOB
0-16 777 215字节
二进制形式的中等长度文本数据
MEDIUMTEXT
0-16 777 215字节
中等长度文本数据
LOGNGBLOB
0-4 294 967 295字节
二进制形式的极大文本数据
LONGTEXT
0-4 294 967 295字节
极大文本数据

CHAR 和 VARCHAR 类型

  CHAR 类型用于定长字符串,并且必须在圆括号内用一个大小修饰符来定义。这个大小修饰符的范围从 0-255。比指定长度大的值将被截短,而比指定长度小的值将会用空格作填补。

  CHAR 类型可以使用 BINARY 修饰符。当用于比较运算时,这个修饰符使 CHAR 以二进制方式参于运算,而不是以传统的区分大小写的方式。

  CHAR 类型的一个变体是 VARCHAR 类型。它是一种可变长度的字符串类型,并且也必须带有一个范围在 0-255 之间的指示器。CHAR 和 VARCHGAR 不同之处在于 MuSQL 数据库处理这个指示器的方式:CHAR 把这个大小视为值的大小,不长度不足的情况下就用空格补足。而 VARCHAR 类型把它视为最大值并且只使用存储字符串实际需要的长度(增加一个额外字节来存储字符串本身的长度)来存储值。所以短于指示器长度的 VARCHAR 类型不会被空格填补,但长于指示器的值仍然会被截短。

  因为 VARCHAR 类型可以根据实际内容动态改变存储值的长度,所以在不能确定字段需要多少字符时使用 VARCHAR 类型可以大大地节约磁盘空间、提高存储效率。

  VARCHAR 类型在使用 BINARY 修饰符时与 CHAR 类型完全相同。

TEXT 和 BLOB 类型

  对于字段长度要求超过 255 个的情况下,MySQL 提供了 TEXT 和 BLOB 两种类型。根据存储数据的大小,它们都有不同的子类型。这些大型的数据用于存储文本块或图像、声音文件等二进制数据类型。

  TEXT 和 BLOB 类型在分类和比较上存在区别。BLOB 类型区分大小写,而 TEXT 不区分大小写。大小修饰符不用于各种 BLOB 和 TEXT 子类型。比指定类型支持的最大范围大的值将被自动截短。

 

日期和时间类型

  在处理日期和时间类型的值时,MySQL 带有 5 个不同的数据类型可供选择。它们可以被分成简单的日期、时间类型,和混合日期、时间类型。根据要求的精度,子类型在每个分类型中都可以使用,并且 MySQL 带有内置功能可以把多样化的输入格式变为一个标准格式。

类型
大小
(字节)
范围
格式
用途
DATE
3
1000-01-01/9999-12-31
YYYY-MM-DD
日期值
TIME
3
'-838:59:59'/'838:59:59'
HH:MM:SS
时间值或持续时间
YEAR
1
1901/2155
YYYY
年份值
DATETIME
8
1000-01-01 00:00:00/9999-12-31 23:59:59
YYYY-MM-DD HH:MM:SS
混合日期和时间值
TIMESTAMP
8
1970-01-01 00:00:00/2037 年某时
YYYYMMDD HHMMSS
混合日期和时间值,时间戳

DATE、TIME 和 TEAR 类型

  MySQL 用 DATE 和 TEAR 类型存储简单的日期值,使用 TIME 类型存储时间值。这些类型可以描述为字符串或不带分隔符的整数序列。如果描述为字符串,DATE 类型的值应该使用连字号作为分隔符分开,而 TIME 类型的值应该使用冒号作为分隔符分开。

  需要注意的是,没有冒号分隔符的 TIME 类型值,将会被 MySQL 理解为持续的时间,而不是时间戳。

  MySQL 还对日期的年份中的两个数字的值,或是 SQL 语句中为 TEAR 类型输入的两个数字进行最大限度的通译。因为所有 TEAR 类型的值必须用 4 个数字存储。MySQL 试图将 2 个数字的年份转换为 4 个数字的值。把在 00-69 范围内的值转换到 2000-2069 范围内。把 70-99 范围内的值转换到 1970-1979 之内。如果 MySQL 自动转换后的值并不符合我们的需要,请输入 4 个数字表示的年份。

DATEYIME 和 TIMESTAMP 类型

   除了日期和时间数据类型,MySQL 还支持 DATEYIME 和 TIMESTAMP 这两种混合类型。它们可以把日期和时间作为单个的值进行存储。这两种类型通常用于自动存储包含当前日期和时间的时间戳,并可在需要执行大量数据库事务和需要建立一个调试和审查用途的审计跟踪的应用程序中发挥良好作用。

  如果我们对 TIMESTAMP 类型的字段没有明确赋值,或是被赋与了 null 值。MySQL 会自动使用系统当前的日期和时间来填充它。

 

复合类型

  MySQL 还支持两种复合数据类型 ENUM 和 SET,它们扩展了 SQL 规范。虽然这些类型在技术上是字符串类型,但是可以被视为不同的数据类型。一个 ENUM 类型只允许从一个集合中取得一个值;而 SET 类型允许从一个集合中取得任意多个值。

 

ENUM 类型

  ENUM 类型因为只允许在集合中取得一个值,有点类似于单选项。在处理相互排拆的数据时容易让人理解,比如人类的性别。ENUM 类型字段可以从集合中取得一个值或使用 null 值,除此之外的输入将会使 MySQL 在这个字段中插入一个空字符串。另外如果插入值的大小写与集合中值的大小写不匹配,MySQL 会自动使用插入值的大小写转换成与集合中大小写一致的值。

   ENUM 类型在系统内部可以存储为数字,并且从 1 开始用数字做索引。一个 ENUM 类型最多可以包含 65536 个元素,其中一个元素被 MySQL 保留,用来存储错误信息,这个错误值用索引 0 或者一个空字符串表示。

  MySQL 认为 ENUM 类型集合中出现的值是合法输入,除此之外其它任何输入都将失败。这说明通过搜索包含空字符串或对应数字索引为 0 的行就可以很容易地找到错误记录的位置。

SET 类型

  SET 类型与 ENUM 类型相似但不相同。SET 类型可以从预定义的集合中取得任意数量的值。并且与 ENUM 类型相同的是任何试图在 SET 类型字段中插入非预定义的值都会使 MySQL 插入一个空字符串。如果插入一个即有合法的元素又有非法的元素的记录,MySQL 将会保留合法的元素,除去非法的元素。

  一个 SET 类型最多可以包含 64 项元素。在 SET 元素中值被存储为一个分离的“位”序列,这些“位”表示与它相对应的元素。“位”是创建有序元素集合的一种简单而有效的方式。并且它还去除了重复的元素,所以 SET 类型中不可能包含两个相同的元素。

  希望从 SET 类型字段中找出非法的记录只需查找包含空字符串或二进制值为 0 的行。

一些说明为了更好的理解mysql数据库的数据类型的应用

转载4:

流星飞雨的博客http://blog.sina.com.cn/sunlyliuh


mysql int(3)与int(11)的区别

总结,int(M) zerofill,加上zerofillM才表现出有点点效果,比如 int(3) zerofill,你插入到数据库里的是10,则实际插入为010,也就是在前面补充加了一个0.如果int(3)int(10)不加zerofill,则它们没有什么区别.M不是用来限制int个数的.int(M)的最大值和最小值与undesigned有关,最下面那副图有说明.

mysql> create table t (t int(3) zerofill);
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t set t = 10;
Query OK, 1 row affected (0.00 sec)

mysql> select * from t;
+——+
| t |
+——+
| 010 |
+——+
1 row in set (0.11 sec)

Zerofill with default width, the same as int(10):

mysql> create table t (t int zerofill);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t set t = 10;
Query OK, 1 row affected (0.02 sec)

mysql> select * from t;
+————+
| t |
+————+
| 0000000010 |
+————+
1 row in set (0.08 sec)

Without zerofill:

mysql> create table t (t int);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t set t = 10;
Query OK, 1 row affected (0.01 sec)

mysql> select * from t;
+——+
| t |
+——+
| 10 |
+——+

1 row in set (0.00 sec) 

注意:这里的M代表的并不是存储在数据库中的具体的长度,以前总是会误以为int(3)只能存储3个长度的数字,int(11)就会存储11个长度的数字,这是大错特错的。

其实当我们在选择使用int的类型的时候,不论是int(3)还是int(11),它在数据库里面存储的都是4个字节的长度,在使用int(3)的时候如果你输入的是10,会默认给你存储位010,也就是说这个3代表的是默认的一个长度,当你不足3位时,会帮你不全,当你超过3位时,就没有任何的影响。

前天组管问我 int(10)与int(11)有什么区别,当时觉得就是长度的区别吧,现在看,他们之间除了在存储的时候稍微有点区别外,在我们使用的时候是没有任何区别的。int(10)也可以代表2147483647这个值int(11)也可以代表。

要查看出不同效果记得在创建类型的时候加 zerofill这个值,表示用0填充,否则看不出效果的。

我们通常在创建数据库的时候都不会加入这个选项,所以可以说他们之间是没有区别的。


转载5:转载请注明来自那些事儿 www.naxieshir.com

mysql 建表定义中 int(10),这个10代表啥?

这个东西对于mysql存储的数值没有任何影响,mysql存储的数值范围如下所示(32位系统),这个定义的唯一作用,需要与zerofill配合使用,如果启用了zerofill,就是当数值的位数<M的时候,左侧自动以0补齐,>M的时候没有任何作用,如果启用了zerofill,程序中对查询出的int值需要做intval处理才能正确使用,其实是一件比较坑爹的事情,所以基本没有人这么用

总结一句话就是,int(M),M其实对我们没有任何影响,建议大家定义表结构时忽略此值


转载6:作者:做一个进化的程序猿

Mysql类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。

当结合可选扩展属性ZEROFILL使用时, 默认补充的空格用零代替。例如,对于声明为INT(5) ZEROFILL的列,值4检索为00004。请注意如果在整数列保存超过显示宽度的一个值,当MySQL为复杂联接生成临时表时会遇到问题,因为在这些情况下MySQL相信数据适合原列宽度。

所有整数类型可以有一个可选(非标准)属性UNSIGNED。当你想要在列内只允许非负数和该列需要较大的上限数值范围时可以使用无符号值。
 
所以int(10)与int(11)后的括号中的字符表示显示宽度,整数列的显示宽度与mysql需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,int类型的字段能存储的数据上限还是2147483647(有符号型)和4294967295(无符号型)。
 
如果为一个数值列指定ZEROFILL,MySQL自动为该列添加UNSIGNED属性。

转载7:MySQL数据库之数据类型BOOL/BOOLEAN与TINYINT测试总结

【导读】

网络上很多人咨询mysql是否提供布尔类型?MySQL数据库确实提供布尔类型,此数据类型的关键字可以写成:布尔类型BOOL或布尔类型BOOLEAN,但是MySQL数据库数据类型的布尔类型是否也像其他数据库产品一样呢?本文揭开mysql布尔类型的真实面目。

(一) 数据类型测试

(1). 布尔类型BOOL/BOOLEAN 与 微整型TINYINT

注:boolean 数据类型 boolean 变量存储为 8 位(1 个字节)的数值形式,但只能是 True 或是 False。

a). 创建测试表结构

      
      
  1. root@localhost : test 05:12:49> CREATE TABLE boolean_test(ID INT NOT NULL AUTO_INCREMENT,  
  2.    
  3.     ->                           Online_Flag BOOL,  
  4.    
  5.     ->                           Lock_Flag BOOLEAN,  
  6.    
  7.     ->                           PRIMARY KEY(ID)  
  8.    
  9.     ->                           )ENGINE=InnoDB CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';  
  10.    
  11. Query OK, 0 rows affected (0.01 sec) 

我们可以发现对于字段类型写成BOOL或者BOOLEAN,MySQL的SQL语法都是允许通过的,另外我们再通过SHOW命令查阅创建好的表结构:

      
      
  1. *************************** 1. row ***************************  
  2.    
  3.        Table: boolean_test  
  4.    
  5. Create TableCREATE TABLE `boolean_test` (  
  6.    
  7.   `ID` int(11) NOT NULL AUTO_INCREMENT,  
  8.    
  9.   `Online_Flag` tinyint(1) DEFAULT NULL,  
  10.    
  11.   `Lock_Flag` tinyint(1) DEFAULT NULL,  
  12.    
  13.   PRIMARY KEY (`ID`)  
  14.    
  15. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8  
  16.    
  17. 1 row in set (0.00 sec) 

小结:

我们对比手工输入创建表boolean_test的结构定义与数据库中查阅到表结构定义,可以发现二者的差别:

  • MySQL数据库将字段的数据类型BOOL/BOOLEAN默认地转换成TINYINT(1);
  • MySQL数据库自动完成的数据类型转换过程,没有给出任何错误或警告信息提示;

b). 测试数据的写入

      
      
  1. root@localhost : test 05:12:58> INSERT INTO boolean_test(Online_Flag,Lock_Flag) VALUES(TRUE,FALSE);  
  2.    
  3. Query OK, 1 row affected (0.00 sec)  
  4.    
  5. root@localhost : test 05:13:58> INSERT INTO boolean_test(Online_Flag,Lock_Flag) VALUES(1,0);  
  6.    
  7. Query OK, 1 row affected (0.00 sec)  
  8.    
  9. root@localhost : test 05:14:04> INSERT INTO boolean_test(Online_Flag,Lock_Flag) VALUES(2,-1);  
  10.    
  11. Query OK, 1 row affected (0.00 sec)  
  12.    
  13. root@localhost : test 05:14:11> INSERT INTO boolean_test(Online_Flag,Lock_Flag) VALUES(-128,127);  
  14.    
  15. Query OK, 1 row affected (0.00 sec) 
      
      
  1. root@localhost : test 05:14:18> INSERT INTO boolean_test(Online_Flag,Lock_Flag) VALUES(-256,256);  
  2.    
  3. Query OK, 1 row affected, 2 warnings (0.00 sec)  
  4.    
  5. root@localhost : test 05:14:24> SHOW WARNINGS;  
  6.    
  7. +---------+------+------------------------------------------------------+  
  8.    
  9. Level   | Code | Message                                              |  
  10.    
  11. +---------+------+------------------------------------------------------+  
  12.    
  13. | Warning | 1264 | Out of range value for column 'Online_Flag' at row 1 |  
  14.    
  15. | Warning | 1264 | Out of range value for column 'Lock_Flag' at row 1   |  
  16.    
  17. +---------+------+------------------------------------------------------+  
  18.    
  19. rows in set (0.00 sec) 

小结:

  • 测试数据表boolean_test的2个字段布尔类型字段,写入的值超过有符号整型TINYINT数据类型存储范围时,出现了字段值截断的警告信息;
  • 向测试数据表boolean_test的字段可以写入表达布尔数值的TRUE 或 FALSE是不会报错,也不需要用单引号或双引号括起来;
  • 向测试数据表boolean_test的字段可以写入非表达布尔类型的数值,MySQL数据库不会有任何错误或警告信息提示;

c). 显示写入表boolean_test的数据

      
      
  1. root@localhost : test 06:31:33> SELECT * FROM boolean_test;  
  2.    
  3. +----+-------------+-----------+  
  4.    
  5. | ID | Online_Flag | Lock_Flag |  
  6.    
  7. +----+-------------+-----------+  
  8.    
  9. |  1 |           1 |         0 |  
  10.    
  11. |  2 |           1 |         0 |  
  12.    
  13. |  3 |           2 |        -1 |  
  14.    
  15. |  4 |        -128 |       127 |  
  16.    
  17. |  5 |        -128 |       127 |  
  18.    
  19. +----+-------------+-----------+  
  20.    
  21. rows in set (0.00 sec) 

小结:

通过查阅测试表boolean_test的数据,可以发现MySQL数据库中存储的值与数据写入的INSERT语句还是有一些差别体现在:

  • 写入的布尔类型值TRUE 转换成了 1,FALSE 转换成了 0;
  • 超过TINYINT数据类型存储的上下限制的值,被自动截断;
  • 布尔类型BOOL/BOOLEAN的功能等同于微整型TINYTINT;

转载8:mysql中枚举类型之enum详解
1、enum类型就是我们常说的枚举类型,它的取值范围需要在创建表时通过枚举方式,一个个的列出来,显式指定,对1至255个成员的枚举需要1个字节存储.

对于255至65535个成员,需要2个字节存储,最多允许有65535个成员,先通过sql语句创建一个具有枚举类型的数据表,代码如下:

create table user_sex( sex enum('M','F'));

再往表中写入几条测试数据:insert into user_sex values('M'),('s'),('2'),('f');

在表中查看写入的结果时,发现变成了这样M,M,M,F(注意每个字符为一条记录)。由结果可知enum类型是忽略大小写的,'f'被自动转化成了'F',对写入了不在指定范围内的值时,会强制写入枚举里的第一个值(M)。另外,enum类型只从填集合中选取单个值,而不能取多个值.

2、枚举(ENUM)类型,最多可以定义65535种不同的字符串从中做出选择,只能并且必须选择其中一种,占用存储空间是一个或两个字节,由枚举值的数目决定;集合(SET)类型,最多可以有64个成员,可以选择其中的零个到不限定的多个,占用存储空间是一个到八个字节,由集合可能的成员数目决定。

举个例子来说,在SQLServer中,你可以节约到用一个Bit类型来表示性别(男/女),但MySQL没有Bit,用TINTINT?不,可以用ENUM('帅哥','美眉')!只有两种选择,所以只需一个字节——跟TINYINT一样大,但却可以直接用字符串'帅哥'和'美眉'来存取。真是太方便啦!

3、详解MySQL数据类型之枚举类型ENUM的用法

MySQL数据类型之枚举类型ENUM

MySQL数据库提供针对字符串存储的一种特殊数据类型:枚举类型ENUM,这种数据类型可以给予我们更多提高性能、降低存储容量和降低程序代码理解的技巧,前面介绍了首先介绍了四种数据类型的特性总结,其后又分别介绍了布尔类型BOOL或称布尔类型BOOLEAN,以及后续会再单独介绍集合类型SET。

本文详细介绍集合类型enum测试过程与总结,加深对mysql数据库集合类型enum的理解记忆。
n  枚举类型ENUM
a).数据库表mysqlops_enum结构
执行数据库表mysqlops_enum创建的SQL语句:
 

复制代码代码示例:
root@localhost : test 11:22:29> CREATE TABLE Mysqlops_enum(ID INT NOT NULL AUTO_INCREMENT,
    ->  Job_type    ENUM('DBA','SA','Coding Engineer','JavaScript','NA','QA','','other') NOT NULL,
    ->  Work_City ENUM('shanghai','beijing','hangzhou','shenzhen','guangzhou','other') NOT NULL DEFAULT 'shanghai',
    ->  PRIMARY KEY(ID)
    ->  )ENGINE=InnoDB CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
 
Query OK, 0 rows affected (0.00 sec)
 

执行查询数据库表mysqlops_enum结构的SQL语句:
 

复制代码代码示例:
root@localhost : test 11:23:31> SHOW CREATE TABLE Mysqlops_enum\G
 
*************************** 1. row ***************************
 
       Table: Mysqlops_enum
 
Create Table: CREATE TABLE `Mysqlops_enum` (
 
  `ID` int(11) NOT NULL AUTO_INCREMENT,
 
  `Job_type` enum('DBA','SA','Coding Engineer','JavaScript','NA','QA','','other') NOT NULL,
 
  `Work_City` enum('shanghai','beijing','hangzhou','shenzhen','guangzhou','other') NOT NULL DEFAULT 'shanghai',
 
  PRIMARY KEY (`ID`)
 
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8
 
1 row in set (0.00 sec)
 

小结:
     为方便测试枚举类型,如何处理字段定义的默认值、是否允许为NULL和空值的情况,我们定义了2个枚举类型的字段名,经过对比创建与查询数据库中表的结构信息,没有发现MySQL数据库默认修改任何信息。
b). 写入不同类型的测试数据
写入一条符合枚举类型定义的记录值:
 

复制代码代码示例:
root@localhost : test 11:22:35> INSERT INTO Mysqlops_enum(ID,Job_type,Work_City) VALUES(1,'QA','shanghai'); 
Query OK, 1 row affected (0.00 sec)

测试第二个枚举类型字Work_City是否允许为空记录值:
 

复制代码代码示例:
root@localhost : test 11:22:42> INSERT INTO Mysqlops_enum(ID,Job_type,Work_City) VALUES(2,'NA',''); 
Query OK, 1 row affected, 1 warning (0.00 sec)
 
root@localhost : test 11:22:48> SHOW WARNINGS;
 
+---------+------+------------------------------------------------+
 
| Level   | Code | Message              |
 
+---------+------+------------------------------------------------+
 
| Warning | 1265 | Data truncated for column 'Work_City' at row 1 |
 
+---------+------+------------------------------------------------+
 
1 row in set (0.00 sec)
 

测试第二个枚举类型字段Work_City是否允许存储NULL值:
 

复制代码代码示例:
root@localhost : test 11:22:53> INSERT INTO Mysqlops_enum(ID,Job_type,Work_City) VALUES(3,'Other',NULL); 
ERROR 1048 (23000): Column 'Work_City' cannot be null

测试第一个枚举类型字段Job_type是否可以存储空白值:
 

复制代码代码示例:
root@localhost : test 11:22:59> INSERT INTO Mysqlops_enum(ID,Job_type,Work_City) VALUES(4,'','hangzhou'); 
Query OK, 1 row affected (0.00 sec)

测试第二个枚举类型字段Job_City如何处理没有在定义中描述的值域第一个枚举类型字段Work_Type的默认值没指定情况下,会默认填写那个值:
 

复制代码代码示例:
root@localhost : test 11:23:06> INSERT INTO Mysqlops_enum(ID,Work_City) VALUES(5,'ningbo'); 
Query OK, 1 row affected, 1 warning (0.00 sec)
 
root@localhost : test 11:23:13> SHOW WARNINGS;
 
+---------+------+------------------------------------------------+
 
| Level   | Code | Message              |
 
+---------+------+------------------------------------------------+
 
| Warning | 1265 | Data truncated for column 'Work_City' at row 1 |
 
+---------+------+------------------------------------------------+
 
1 row in set (0.00 sec)
 

测试第二个枚举类型字段未插入数据的情况下,是否能使用上字段定义中指定的默认值:
 

复制代码代码示例:
root@localhost : test 11:23:17> INSERT INTO Mysqlops_enum(ID,Job_type) VALUES(6,'DBA'); 
Query OK, 1 row affected (0.00 sec)

小结:
若是枚举类型字段定义为非NULL,默认的SQL_MODE模式下,插入NULL值则会报错,导致SQL语句执行失败;若是没有明确申明非NULL,则允许插入NULL值;
若是枚举类型字段的枚举值中,没有指定空格字符值,插入空格字符数据时,会出现数据截断的警告信息,但是SQL语句依然执行成功;
若是向枚举类型字段插入未在定义列表中出现的数据,则会出现数据截断的警告信息,但是SQL语句依然执行成功;
若是枚举类型定义为非NULL,向数据库表中插入新数据,但未指定枚举类型字段的值,则使用枚举类型字段定义申明的默认值,若是无显示申明则是采用枚举类型字段的枚举列表中第一个值作为默认值;
c). 查询数据库表mysqlops_enum的数据
查询枚举类型数据库表Mysqlops_enum所有的数据(注释:两个枚举类型字段都是非NULL,所以截断后的值为空格):
 

复制代码代码示例:
root@localhost : test 11:23:24> SELECT * FROM Mysqlops_enum;
 
+----+----------+-----------+
 
| ID | Job_type | Work_City |
 
+----+----------+-----------+
 
|  1 | QA       | shanghai  |
 
|  2 | NA       |           |
 
|  4 |          | hangzhou  |
 
|  5 | DBA      |           |
 
|  6 | DBA      | shanghai  |
 
+----+----------+-----------+
 
5 rows in set (0.00 sec)
 

验证枚举类型字段存储的是数据对应的序列编号,而不是真实的字符串值,且序列号是与枚举类型字段值域列表中的顺序有关:
 

复制代码代码示例:
root@localhost : test 11:23:57> SELECT * FROM Mysqlops_enum WHERE Work_City=0;
 
+----+----------+-----------+
 
| ID | Job_type | Work_City |
 
+----+----------+-----------+
 
|  2 | NA       |           |
 
|  5 | DBA      |           |
 
+----+----------+-----------+
 
2 rows in set (0.00 sec)
 
root@localhost : test 01:22:08> SELECT * FROM Mysqlops_enum WHERE Work_City=1;
 
+----+----------+-----------+
 
| ID | Job_type | Work_City |
 
+----+----------+-----------+
 
|  1 | QA       | shanghai  |
 
|  6 | DBA      | shanghai  |
 
+----+----------+-----------+
 
2 rows in set (0.00 sec)
 
root@localhost : test 02:40:31> SELECT * FROM Mysqlops_enum WHERE Work_City=2;
 
Empty set (0.00 sec)
 
root@localhost : test 02:40:33> SELECT * FROM Mysqlops_enum WHERE Work_City=3;
 
+----+----------+-----------+
 
| ID | Job_type | Work_City |
 
+----+----------+-----------+
 
|  4 |          | hangzhou  |
 
+----+----------+-----------+
 
1 row in set (0.01 sec)
 
root@localhost : test 02:40:34> SELECT * FROM Mysqlops_enum WHERE Work_City=4;
 
Empty set (0.00 sec)
 
root@localhost : test 02:40:36> SELECT * FROM Mysqlops_enum WHERE Work_City=5;
 
Empty set (0.00 sec)
 
root@localhost : test 02:40:37> SELECT * FROM Mysqlops_enum WHERE Work_City=6;
 
Empty set (0.00 sec)
 
root@localhost : test 04:29:07> SELECT * FROM Mysqlops_enum WHERE Job_type=7;
 
+----+----------+-----------+
 
| ID | Job_type | Work_City |
 
+----+----------+-----------+
 
|  4 |          | hangzhou  |
 
+----+----------+-----------+
 
1 row in set (0.00 sec)
 

枚举类型数据小结:
枚举类型字段定义必须为确定的值,不能为变量、函数、表达式等;
若是向枚举类型字段插入NULL值,且枚举类型的字段定义为非NULL,SQL语句会执行失败;
若是向枚举类型字段插入,其枚举列表值域中不存在的值,则会发生字段值的截断,并且用空格字符串值替代,其存储的序列编号为0;
若是枚举类型字段定义的枚举列表值域中存在空字符串值,该枚举类型字段发生字段值截断,则是会用空格值替代,但是其存储的序列号与枚举列表中存储的序列号不同,也即参考事例所示:
 

复制代码代码示例:
root@localhost : test 04:37:32> SELECT * FROM Mysqlops_enum WHERE Job_type=0;
 
+----+----------+-----------+
 
| ID | Job_type | Work_City |
 
+----+----------+-----------+
 
|  8 |          | hangzhou  |
 
+----+----------+-----------+
 
1 row in set (0.00 sec)
 
root@localhost : test 04:37:35> SELECT * FROM Mysqlops_enum WHERE Job_type='';
 
+----+----------+-----------+
 
| ID | Job_type | Work_City |
 
+----+----------+-----------+
 
|  4 |          | hangzhou  |
 
|  8 |          | hangzhou  |
 
+----+----------+-----------+
 
2 rows in set (0.00 sec)
 

若是枚举类型字段定义为非NULL,且没有为该字段指定值的方式插入数据行,则把字段定义显式申明的默认值作为字段默认值,没有显式申明则把枚举列值域表中第一个值作为默认值;
若是枚举类型字段允许插入NULL值,则NULL值对应存储的序列号为NULL;

转载9:mysql中数据类型之set详解
这个暂时不理解,转都不知道咋转……先留一个链接吧:http://www.jbxue.com/db/12937.html




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值