您当前的位置: > 技术探讨 >

深入浅出mysql 数据类型

发布时间:2019-05-25 14:25编辑:admin阅读(

    整数类型tinyint、smallint、mediumint、int和bigint
    1)如果超出类型范围的操作,会发生"Out of range" 的错误提示,为了避免此类问题发生,在选择数据类型时要根据应用的实际情况确定其取值范围,最后根据确定的结果慎重选择数据类型。
    2)所有的整数类型都有一个可选属性UNSIGNED <无符号>,如果需要在字段里面保存非负数或者需要较大的上限值时,可以用此选项,他的取值范围是正常值的下限取0,上限取原值的2倍)。
    3)整数类型还有一个属性 AUTO_INCREMENT ,在需要产生唯一标识符或顺序值时,可利用此属性,这个属性只用于整数类型,对于任何想要使用AUTO_INCREMENT的列,应该定义为NOT NULL ,并定义为PRIMARY KEY或定义为UNIQUE键。

            小数分为两种方式:浮点数和定点数
    1)浮点数包括float<单精度>和double<双精度>,而定点数则只有decimal一种表示。定点数在mysql中以字符串形式保存,比浮点数更准确,适合用来表示货币等高精度的数据。
    2)浮点数和定点数都可以用类型名称后加(M,D)的方式进行表示,(M,D)表示该值一共显示M位数字(整数位+小数位),其中D位位于小数点后面,M和D又称为精度和标度。
    3)浮点数后面跟(M,D的用法是非标准用法),如果用于数据库的迁移,则最好不要这么使用。
    4)floatdouble在不指定精度时,默认会按照实际的精度(由实际的硬件和操作系统决定)来显示,而decimal在不指定精度时,默认的整数位为10,默认的小数位为0。
    5)浮点数如果不写精度和标度,则会按照实际精度值显示,如果有精度和标度,则会自动将四舍五入后的结果插入,系统不会报错,定点数如果不写精度和标度,则按照默认值 decimal(10,0)来进行操作,并且如果数据超越了精度和标度值,系统则会报错。

            BIT(位)类型
    1)用于存放字段值,BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写则默认1位。
    2)直接使用SELECT命令将不会看到结果,可以用bin()(显示为二进制格式)或者(hex)(显示为十六进制格式)函数进行读取。
    3)数据插入bit类型字段时,首先转换为二进制,如果位数允许,讲成功插入,如果位数小于实际定义的位数,则插入不变。


    日期时间类型  DATE(表示年月日)、DATETIME(表示年月日时分秒)、TIME(时分秒)
    1)如果需要经常插入或者更新日期为当前系统时间,则通常使用TIMESTAMP 来表示。TIMESTAMP值返回后显示为" YYYY-MM-DD HH:MM:SS"格式的字符串,显示宽度为19个字符。如果想要获得数字值,应在TIMESTAMP列添加 " +0"。
    2)如果只是表示年份,可以用YEAR来表示,他比DATA占用更少的空间。YEAR有2位或4位格式的年。默认为4位格式。在4位格式中,允许的值是1901~2155和0000。在2位格式中,允许的值是70~69,表示从1970~2069年。(mysql以YYYY格式显示YEAR值,从5.5.27开始,2位格式的year已经不被支持)。
    3)TIMESTAMP就是和时区相关,当插入日期时,会先转换为本地时区后存放,而从数据库中取出时,也同样需要将日期转换为本地时区后显示。TIMESTAMP的取值范围为19700101080001到2038年的某一天。
    4)TIMESTAMP 和 DATETIME 的区别:TIMESTAMP支持的时间范围较小,DATETIME取值范围大。TIMESTAMP的插入和查询都受当地失去的影响,更能反映出实际的时期。而DATETIME则只能反映出插入时当地的时区,其他时区的人查看数据会有误差。TIMESTAMP的属性收msql版本和服务器SQLmode的影响很大。
    5)日期类型的插入格式有很多,包括整数(如2019)、字符串(如2019-01-01 00:00:01)、函数(如now())
    6)DATETIME允许" 不严格 "语法,即任意标点符号都可以用做日期部分或时间部分之间的间隔符。如99-12-31 11:30:30 、99.12.31 11+30+30 ,对于包括日期部分间隔符的字符串值,如果日和月的值小于10,不需要指定两位数,1999-9-9 和 1999-09-09 是相同的,同样对于包括时间部分间隔符的字符串,如果时、分和秒的值小于10不需要指定两位数 1999-09-09 1:2:3 和1999-09-09 01:02:03 是相同的。


    字符串类型 包括了 CHAR、VARCHAR、BINARY、BARBINARY、BLOB、TEXT、ENUM和SET
            CHAR和VARCHAR类型
    1)都是用来保存mysql中较短的字符串。
    2)二者的主要区别在于存储方式不同:CHAR列的长度固定为创建表时声明的长度,长度可以为从0~255的任意值,而VARCHAR列中的值为可变长字符串,长度可以指定为0~255 或 65535 之间的值。在检索的时候CHAR列删除了尾部的空格,而VARCHAR则保留这些空格。
            BINARY 和 VARBINARY类型
    1)BINARY VARBINARY 类似于CHARVARCHAR,不用的是它们包含二进制字符串而不包含非二进制字符串。
            ENUM类型
    1)ENUM中文名称叫枚举类型,他的值范围需要在创建表时通过枚举方式显式指定,对1~255个成员的枚举需要1个字节存储。对于255~65535个成员,需要2个字节存储。最多允许有65535个成员。
    2)ENUM类型时忽略大小写的,在存储时将它们都转换成了大写,对于插入不在ENUM指定范围内的值时,并没有警告,而是插入了ENUM(M,F)的第一个值M。
    3)ENUM类型只允许从值集合中选取单个值,而不能一次取多个值。
            SET类型
    1)SETENUM类型非常类似,也是一个字符串对象,里面可以包含0~64个成员,根据成员不同,存储上也有不同。1~8成员的集合,站1个字节。9~16成员的集合,占2个字节。17~24成员的集合,占3个字节。25~32成员的集合,占4个字节。33~64成员的集合占8个字节。

    2)SETENUM出来存储之外,最主要的区别在于SET类型一次可以选取多个成员,而ENUM则只能选一个。
    3)SET类型可以从允许值集合中选择任意一个或多个元素进行组合,所以对于输入的值只要是在允许值的组合范围内,都可以正确地注入到SET类型的列中。