天天看点

MySQL数据类型及字段属性

mysql 数据类型mysql中定义数据字段的类型对你数据库的优化是非常重要的。mysql支持多种类型,大致可以分为三类:

数值

日期/时间

字符串(字符)

mysql支持所有标准sql数值数据类型。

这些类型包括严格数值数据类型(integer、smallint、decimal和numeric),以及近似数值数据类型(float、real和double precision)。

MySQL数据类型及字段属性

表示时间值的日期和时间类型为datetime、date、timestamp、time和year。

每个时间类型有一个有效值范围和一个”零”值,当指定不合法的mysql不能表示的值时使用”零”值。timestamp类型有专有的自动更新特性。

MySQL数据类型及字段属性

字符串类型指char、varchar、binary、varbinary、blob、text、enum和set。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

MySQL数据类型及字段属性

char和varchar类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

1.char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。

2.char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符将占用4个字节。

3.char类型的字符串检索速度要比varchar类型的快。

1.varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。

2.text类型不能有默认值。

3.varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。

类类似于char和varchar,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

blob是一个二进制大对象,可以容纳可变数量的数据。有4种blob类型:tinyblob、blob、mediumblob和longblob。它们只是可容纳值的最大长度不同。有4种text类型:tinytext、text、mediumtext和longtext。这些对应4种blob类型,有相同的最大长度和存储需求。

1._blob和_text存储方式不同,_text以文本方式存储,英文存储区分大小写,而_blob是以二进制方式存储,不分大小写。

2._blob存储的数据只能整体读出。

3._text可以指定字符集,_blo不用指定字符集。

mysql有如下字段属性:

mysql关键字

含义

null

数据列可包含null值

not null

数据列不允许包含null值

default

默认值

primary key

主键

auto_increment

自动递增,适用于整数类型

unsigned

无符号

character set name

指定一个字符集

mysql支持给一个数值类型添加一个length属性,它代表这个字段值的展示宽度。比如int(4)定义了这个字段会按四个字符的宽度进行展示。这个功能有什么用呢?当我们在查询这个字段时,如果字段值小于定义的展示宽度,那么在展示时系统会自动在这个数值的左侧通过空格进行补齐。

这个length属性只是定义了展示数值的宽度,绝对不会影响数值实际存储的大小。不管我们定义的是int(4)、int(11)还是int(20),我们最终存储的数值大小都占4个字节, 范围都是 (-2 147 483 648,2 147 483 647)。当实际存储的数值宽度大于我们定义的宽度时,会按实际宽度进行展示。比如我们定义的宽度时int(5),而实际数值是123456共6位,那么查询时显示的还是123456。

总之一句话,length属性只会在实际数值宽度小于我们定义的宽度时才用空格进行补齐,任何情况下都不会影响实际数值的存储和展示。

当length属性结合zerofill属性一起使用时,补齐的就不是空格了,而是0。比如我们定义的列属性为int(4) zerofill,如果数据库中存储的值是5的话,查询出来便会是0005。注意,此时数据库中的值依然是5,只是查询出来是0005。

如果我们使用了unsigned,则存储的最大值翻倍,如tinyint unsigned的取值范围就由(-128~127)变成了(0~256)。

如果我们定义的列是zerofill的,那么mysql会自动给这个列加上unsigned属性。

如果我们给一个列添加了autoincrement属性,那么当我们插入null或0值时,列值便会自动设置成下一个序列号,一般是当前value+1。注意,只有当列值属性设置为not null时,插入null值才会autoincrement,否则便会直接插入null值。