您的位置:首页 > 数据库 > MySQL

MySQL入门很简单-MySQL数据类型(1)

2015-03-08 21:23 190 查看
MySQL数据库提供了多种数据类型,其中包括整数类型、浮点数类型、定点数类型、日期和时间类型、字符串类型和二进制数据类型。不同数据类型有各自特点,适用范围不同,存储方式也不一样。

一、整数类型

标准SQL中支持INTEGER和SMALLINT这两类整数类型。MySQL数据库除了支持以上两种外,还扩展支持了TINYINT,MEDIUMINT,BIGINT。下面的表格从不同整数类型的字节数、取值范围等方面进行对比:



MySQL支持数据类型的名称后面指定该类型的显示宽度,基本形式如下:

数据类型 (显示宽度)

显示宽度指的是该类型所能表示的最大数据的长度,不指定宽度情况下,每个整数类型都有默认的显示宽度。几种不同整数类型的默认显示宽度如下:



注:图中MEDIUMINT的默认显示宽度有疑问

可搭配使用zerofill参数,使用时,MySQL会自动加上UNSIGNED属性。该整数类型只用表示无符号数,其显示宽度比默认宽度小1。

虽然可以设置显示宽度,但依然可以插入大于显示宽度的值,只要插入的数不超过小于等于该类型的最大值。

整数类型还有一个AUTO_INCREMENT属性,该属性可以使字段称为自增字段。具有该属性的字段,在插入新的记录时,该字段的值都会在前一条记录的基础上加1。

二、浮点数类型和定点数类型

浮点数类型包括单精度浮点数和双精度浮点数,定点数类型就是DECIMAL型。每种类型的取值范围、所占字节数如下表:



MySQL可以指定浮点数和定点数的精度,基本形式如下:

数据类型 (M,D)

M参数称为精度,是数据的总长度,D参数称为标度,是指小数点后的长度为D。

上述定义方法虽然都适用于三种类型,但建议在定义浮点数时,如果不是实际情况需要,最好不要使用上面这种形式,若使用了,可能会影响数据库的迁移;对定点数而言,上面的形式是定点数的标准格式。

如果插入值的精度高于实际定义的精度,系统会自动进行四舍五入处理,使值的精度达到要求,不同的是,FLOAT型和DOUBLE型在四舍五入时不会报错,而DECIMAL型会有警告。

注:MySQL中,定点数以字符串形式存储,其精度比浮点数要高,而且浮点数会出现误差,如果对数据的精度要求比较高,还是选择定点数比较安全。

三、日期和时间类型

有YEAR、DATE、TIME、DATETIME、TIMESTAMP五种类型:



1、YEAR类型:

使用4位字符串或数字表示,其范围从1901-2155。其格式为‘YYYY’或YYYY,如果超过了范围,就会插入0000。

使用2位字符串表示。‘00’~‘69’转化为2000~2069,‘70’~‘99’转换为1970~1999,‘0’和‘00’的效果是一样的。

使用2位数字表示。1~69转化为2001~2069,70~99转化为1970~1999,2位数字和2位字符串是不一样的。若插入0,转化后的YEAR值不是2000,而是0000。

注:使用YEAR类型时,一定要注意区分0和‘0’。

如果只需要记录年份,选择YEAR类型可以节约空间。

2、TIME类型:

MySQL中以HH:MM:SS的形式显示TIME类型的值,其中HH表示时,可以为负值,而且范围扩大,不是0~23(为了表示某种特殊需要的时间间隔),MM表示分,范围为0~59,SS表示秒,范围为0~59。

TIME类型的字段赋值的表示方法如下:

‘D HH:MM:SS’格式的字符串表示,D表示天数,取值范围是0~34。保存时,小时的值等于(D*24+HH)。当然,输入时可以不严格按照这个格式,可以是’HH:MM:SS’、’HH:MM’、’D HH:MM’、’D HH’、’SS’等形式。

‘HHMMSS’格式的字符串或HHMMSS格式的数值表示。如果输入‘0’或0,TIME类型会转换为0000:00:00。

一个合法的TIME值,如果超出了TIME的范围,将裁为范围最接近的端点。无效TIME值,系统会提示错误,其值也会被转换为00:00:00。

如果只需要记录时间,选择TIME类型是最合适的。

3、DATE类型:

以YYYY-MM-DD形式显示DATE类型的值,依次代表年月日,DATE类型的范围可以从’1000-01-01’~’9999-12-31’,字段赋值的方法如下:

‘YYYY-MM-DD’或’YYYYMMDD’格式的字符串表示,MySQL还支持一些不严格的语法格式,任何标点都可以用来做间隔符。

‘YY-MMM-DD’或者’YYMMDD’格式的字符串表示,’YY’的取值与YEAR类型一致,此种方式MySQL也支持一些不严格的语法格式。

YYYYMMDD或YYMMDD格式的数字表示,YY的取值与用2位数字表示YEAR类型一致。注意:如果输入的值为数字0,DATE类型将其转化为0000-00-00。

注:虽然MySQL支持一些不严格的语法格式,但在实际应用中,最好还是选择标准格式,日期中使用“-”做分隔符,时间用“:”做分隔符,如有特殊需要,可以使用“@”、“*”等特殊字符做分隔符。

可使用CURRENT_DATE或NOW()来获取当前系统日期。

4、DATETIME类型:

‘YYYY-MM-DD HH:MM:SS’或’YYYYMMDDHHMMSS’格式的字符串表示,这种方式的范围为’1000-01-01 00:00:00’~’9999-12-31 23:59:59’。MySQL还支持一些不严格的语法格式,情况与DATE类型相同,而且,时间部分也可以用任意分隔符隔开,这与TIME类型不同,TIME类型只能用’:’隔开。

‘YY-MM-DD HH:MM:SS’或’YYMMDDHHMMSS’格式的字符串,’YY’取值与之前介绍的相同。

YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的数字,取值与之前介绍的相同。注意值为0,将转换为0000-00-00 00-00-00。

也可使用NOW()来获取当前日期和时间。

如果需要同时记录日期和时间,可以选择DATETIME类型。

5、TIMESTAMP类型:

TIMESTAMP类型的范围从1970-01-01 08:00:01~2038-01-19 11:14:07,MySQL中也是以’YYYY-MM-DD HH:MM:SS’的形式显示TIMESTAMP类型的值。给TIMESTAMP赋值的方法基本与DATETIME相同,但TIMESTAMP类型范围比较小,使用时注意不要越界。

TIMESTAMP类型与DATETIME类型的不同:

(1)使用CURRENT_TIMESTAMP获取系统当前日期和时间

(2)输入NULL,系统会输入系统当前日期和时间

(3)无任何输入时,系统会输入系统当前日期和时间

TIMESTAMP类型还有一个很大的特殊点,就是时间是根据时区来显示的。但TIMESTAMP类型范围太小,当需要的时间范围比较大,还是选择DATETIME类型比较安全。

四、字符串类型

字符串类型包括CHAR、VARCHAR、TEXT、ENUM、SET

1、CHAR类型和VARCHAR类型:

两种类型都是在创建表时指定了最大长度,其基本形式如下:

字符串类型(M)

M参数指定了该字符串的最大长度为M

CHAR类型的长度是固定的,在创建表时就指定了。其长度可以是0~255的任意值;VARCHAR类型的长度是可变的,在创建表时指定了最大长度以后,其长度可以在0到最大长度之间,在这个最大长度范围内,使用多少分配多少,VARCHAR类型实际占用的空间为字符串的实际长度加1,这样可以有效节约系统空间的使用。

例子:



图中需要注意的一点是CHAR类型会删除字符串最后的空格,而VARCHAR类型会保留。

如果插入的字符串的长度大于该类型指定的长度会报错。

2、TEXT类型:

TEXT类型是一种特殊的类型,TEXT只能保存字符数据。

4000
下表是各种TEXT类型的对比:



可以根据需要选择合适的TEXT类型。

3、ENUM类型:

ENUM类型的取值范围以列表的形式指定。其基本形式如下:

属性名 ENUM(‘值1’,’值2’,…,’值n’)

属性名指字段的名称,’值n’参数表示列表中的第n个值。

ENUM类型的值只能取列表中的一个元素,其取值列表中最多有65535个值,列表中的每个值都有一个顺序排列的编号,MySQL中存入的是这个编号,而不是列表中的值。

如果ENUM类型加上了NOT NULL属性,其默认值为取值列表的第一个元素。如果不加NOT NULL属性,ENUM类型允许插入NULL,而且NULL为默认值。(默认值是指不指定插入值时的值)

如果只能选取列表中的一个值,选择ENUM类型;如果需要选取列表中多个值的组合,需要选择SET类型。

4、SET类型:

基本形式:属性名 SET(‘值1’,’值2’,…,’值n’)

SET类型的值可以取列表中一个元素或多个元素的组合,取多个元素时,不同元素之间用逗号隔开,SET类型的值最多只能是有64个元素构成的组合。

插入记录时,SET字段中的元素顺序无关紧要,存入数据库后,数据库系统会自动按照定义时的顺序显示。

插入的值必须是在定义的集合中的元素,否则,系统会报错。

SET类型和ENUM类型对于取值在一定范围的离散值很有效,这两个类型的数据都不是直接将数据存入数据库,而是将其列表中的编号存入数据库。

五、二进制类型

如下表:





1、BINARY和VARBINARY类型:

基本形式如下:

二进制字符串类型(M)

M参数指定了该二进制数的最大字节长度为M。

BINARY类型的长度是固定的,创建表时就指定了,不足最大长度的空间由“0”补全。

VARBINARY类型的长度是可变的,在创建表时就指定了最大长度,制定好了该类型的最大值后,其长度可以在0到最大长度之间,在这个最大长度范围内,使用多少分配多少,VARBINARY类型实际占用的空间为实际长度加1,这样可以有效节约系统空间的使用。

2、BIT类型:

基本形式如下:

BIT(M)

M指定了最大字节数,最大值为64

在查询BIT类型的数据时,要用BIN(字段名+0)来将值转换为二进制显示。

3、BLOB类型:

BLOB类型是一种特殊的二进制类型,BLOB可以用来保存数据量很大的二进制数据,如图片等。BLOB类型包括TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB,这几种类型的最大区别就是能够保存的最大长度不同。LONGBLOB的长度最大,TINYBLOB的长度最小。

BLOB类型和TEXT类型很类似,不同点在于BLOB类型用于存储二进制数据,BLOB类型数据是根据其二进制编码进行比较和排序,而TEXT类型是根据文本模式进行比较和排序的。

BLOB类型主要用来存储图片、PDF文档等二进制文件,通常可以将图片、PDF文档存储在文件系统中,然后在数据库中存储这些文件的路径,这种方式比直接存储在数据库简单,但是访问速度比存储在数据库中慢。

总结:如何选择数据类型?

1、整数类型和浮点数类型

整数类型根据取值范围决定使用哪种类型;

浮点数类型:DOUBLE类型比FLOAT类型的精度高,如果需要精确到小数点后10位以上,应选择DOUBLE类型。

2、浮点数类型和定点数类型

在未指定精度情况下,浮点数和定点数有默认精度,FLOAT型和DOUBLE型默认会保存实际精度,与操作系统和硬件精度有关;DECIMAL型默认整数位为0,小数位为0,即默认为整数。

定点数比浮点数精度要高,浮点数会出现误差,如果对数据精度要求比较高,应该选择定点数。

3、CHAR类型和VARCHAR类型

VARCHAR比CHAR灵活,对于长度变化比较大的字符串类型,最好选择VARCHAR类型,但CHAR类型的处理速度比VARCHAR快,因此,对于长度变化不大和查询速度要求较高的字符串类型,最好选择CHAR类型。

4、时间和日期类型

如果只需要记录年份,选择YEAR;

如果只需要记录时间,选择TIME;

如果只需要记录日期,选择DATE;

如果需要记录日期和时间,但要求的范围比较大,选择DATETIME;如果需要显示的时间与时区对应,选择TIMESTAMP。

5、ENUM类型和SET类型

ENUM类型最多可以有65535个成员,但只能选取一个;SET类型最多包含64个成员,因此对于多个值中选取一个的,选择ENUM类型,如“性别”,对于可以选个多个值的字段,可以选择SET类型,如“爱好”。

6、TEXT类型和BLOB类型

TEXT类型存储只能存储字符数据,BLOB类型可以用于存储二进制数据。如果要存储文章等纯文本数据,选择TEXT类型,如果存储图片等二进制数据,选择BLOB类型。

补充:

1、存储路径?

CHAR、VARCHAR、TEXT等字符串类型都可以存储路径,但是如果在路径中使用”\”符号时,这个符号会被过滤,解决办法是:用“/”或”\\”来代替。

2、如何使用布尔类型?

MySQL中BOOL和BOOLEAN类型最后转换成TINYINT(1)

注:转载请注明原作者博客地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库