zoukankan      html  css  js  c++  java
  • MySQ(二)数据类型

      跟编程语言一样,数据库也有不同的数据类型,用于存储不同类型的数据。

    一、MySQL的数据类型

      MySQL支持多种类型的SQL数据类型:数值,日期和时间类型,字符串(字符和字节)类型,空间类型和 JSON数据类型等。数据类型描述使用以下约定:

    • M表示整数类型的最大显示宽度。对于浮点和定点类型, M是可以存储的总位数(精度)。对于字符串类型, M是最大长度。允许的最大值M取决于数据类型。
    • D适用于浮点和定点类型,并指示小数点后面的位数。最大可能值为30,但不应大于 M-2。
    • [ ]表示类型定义的可选部分。

      在MySQL中常用数据类型主要分为以下几类:

    数值类型

      数值类型分为整数型、浮点型、定点型。

    整数型(精确值)

    • TINYINT 范围非常小的整数,有符号的范围是 -128到127,无符号的范围是0到 255
    • SMALLINT 范围较小的整数,有符号的范围是 -32768到32767,无符号的范围是0到 65535
    • MEDIUMINT 中等大小的整数,有符号的范围是 -8388608到8388607,无符号的范围是0到 16777215。
    • INT 正常大小的整数,有符号的范围是 -2147483648到 2147483647。无符号的范围是 0到4294967295。
    • BIGINT 大整数,有符号的范围是 -9223372036854775808到 9223372036854775807,无符号的范围是0到 18446744073709551615。

       不管你学什么语言,在基础方面,都应该知道  1个字节= 8位二进制数。 每个类型的取值范围也就能够知道,比如 TINYINT占用1个字节,也就是8位,2的8次方减1等于255,也就是说如果代表没符号的整数,该取值范围为0~255,如果是有符号的,最高位为符号号位,也就是2的7次方减1,也就是127,取值范围为-128~127, 为什么需要减1,这个问题就需要考虑临界值的问题了。

      在计算机中,可以区分正负的类型,称为有符号类型。无正负的类型,称为无符号类型。简单的理解为就是,有符号值可以表示负数,0以及正数,无符号只能为0或正数。如果不手动指定UNSIGNED,那么默认就是有符号的。

      我们在创建表的时候如果没有指定字段类型的显示宽度,那么,默认的显示宽度则是该字段类型最大的显示宽度。每个字段类型后面都有一个括号,括号里面的有个数值,这个数值实际上就是字段的显示宽度,也就是M的值,M表示整数类型的最大显示宽度。显示宽度与类型可包含的值范围无关

      例如字段a的显示宽度为4,是因为TINYINT有符号值的范围是-128到127,-128的长度为4(负号、1、2、8共四位),所以默认的显示宽度最大为4,其他的以此类推。

    浮点型(近似值)

    • FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] 一个小的(单精度)浮点数。允许值是-3.402823466E+38 到-1.175494351E-38, 0以及1.175494351E-38 到3.402823466E+38,M是总位数,D是小数点后面的位数。
    • DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]正常大小(双精度)浮点数。允许值是 -1.7976931348623157E+308到-2.2250738585072014E-308,0以及 2.2250738585072014E-308到 1.7976931348623157E+308。M是总位数,D是小数点后面的位数

      M:数值的总位数。 通俗点讲,就是看有多少个数字,比如,5.6789,M就是5;D:小数点后面能保留几位。 比如上面的5.6789 ,D就是4。浮点数存在精度丢失的问题,如果涉及到小数运算,尽量不要用浮点型  

    定点型(精确值)

    • DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]  常用于存储精确的小数,M是总位数,D是小数点后的位数。小数点和(负数) -符号不计入 M。如果 D为0,则值没有小数点或小数部分。最大位数(M)为 65. 最大支持小数(D)为30.如果D省略,则默认值为0.如果M省略,则默认值为10。M的范围是1到65。D范围为0到30,且不得大于M。

    FLOAT、DOUBLE、DECIMAL三者的区别

      都是用来表示我们所说的小数的也就是浮点数,但是三种的精度不一样,也就是后面显示的位数不一样:

    • FLOAT显示后面的小数点位大概在40多位,DOUBLE能显示的就是300多位了,不是一个层次上的,DECIMAL这个小数点后面能显示的位数跟DOUBLE差不多
    • FLOAT和DOUBLE在不指定精度时,也就是不用(M,D),默认会按照实际的精度,也就是你写多少就是多少,而DECIMAL如不指定精度默认为(10,0),也就是如果不指定精度,插入数值56.89,在数据库中存储的就是57。所以一般使用DECIMAL时就会指定精度,而使用FLOAT和DOUBLE就不用。
    • 浮点数相对与定点数(DECIMAL)的优点就是在长度一定的情况下,浮点数能够表示更大的数据范围,但是缺点是会引起精度问题。

    什么时候使用FLOAT、DOUBLE、DECIMAL

      对精度要求比较高的时候,比如货币、科学数据等,使用DECIMAL的类型比较好。其他的时候,看你要存放的数据的大小而定了,一般使用DOUBLE。

      并且在使用浮点数时需要注意,尽量避免做浮点数的比较,比如加、减,谁大谁小,这样的操作,会引起精度缺失。相信在一些程序语言中,遇到过float精度丢失的问题。

    超出范围和溢出处理

    当MySQL将值存储在超出列数据类型允许范围的数值列中时,结果取决于当时生效的SQL模式:如果启用了严格的SQL模式,则MySQL会根据SQL标准拒绝带有错误的超出范围的值,并且插入失败。
    如果未启用限制模式,MySQL会将值截断到列数据类型范围的相应端点,并存储结果值,并产生一个警告

    字符串类型

    • CHAR[(M)]:一个固定长度的字符串,在存储时始终用空格填充指定长度。 M表示以字符为单位的列长度。M的范围为0到255.如果M省略,则长度为1,存储时占用M个字节
    • VARCHAR(M):可变长度的字符串,M 表示字符的最大列长度,M的范围是0到65,535,存储时占用L+1(L<=M,L为实际字符的长度)个字节
    • TINYTEXT[(M)]:不能有默认值,占用L+1个字节,L<2^8
    • MEDIUMTEXT[(M)]:不能有默认值,占用L+3个字节,L<2^24
    • LONGTEXT[(M)]:不能有默认值,占用L+4个字节,L<2^32
    • TEXT[(M)]:不能有默认值,占用L+2个字节,L<2^16
    • ENUM('value1','value2',...):ENUM是一个字符串对象,其值从允许值列表中选择,它只能有一个值,从值列表中选择,最多可包含65,535个不同的元素。
    • SET('value1','value2',...):字符串对象,该对象可以有零个或多个值,最多可包含64个不同的成员

    CHAR和VARCHAR

      CHAR类型不管存储的值的长度是多少,都会占用M个字符,而VARCHAR则占用实际长度+1个字符。但是CHAR的查询效果要高于VARCHAR,所以说,如果字段的长度能够确定的话,比如手机号,身份证号之类的字段,可以用CHAR类型,像地址,邮箱之类的就用VARCHAR。超过char,varchar最大长度n的限制后,字符串会被截断。char不论实际存储的字符数都会占用n个字符的空间,而varchar只会占用实际字符应该占用的字节空间加1(实际长度length,0<=length<255)或加2(length>255)。因为varchar保存数据时除了要保存字符串之外还会加一个字节来记录长度(如果列声明长度大于255则使用两个字节来保存长度)。能存储的最大空间限制不一样:char的存储上限为255字节。char在存储时会截断尾部的空格,而varchar不会。

    TEXT系列

      TEXT系列的存储范围比VARCHAR要大,当VARCHAR不满足时可以用TEXT系列中的类型。需要注意的是TEXT系列类型的字段不能有默认值,在检索的时候不存在大小写转换,没有CHAR和VARCHAR的效率高。

    日期时间类型

    • TIME:范围是’-838:59:59.000000’ 到’838:59:59.000000’
    • DATE:支持的范围是 ‘1000-01-01’到 ‘9999-12-31’
    • DATETIME:日期和时间组合。支持的范围是 ‘1000-01-01 00:00:00.000000’到 ‘9999-12-31 23:59:59.999999’。
    • TIMESTAMP: 时间戳。范围是’1970-01-01 00:00:01.000000’UTC到’2038-01-19 03:14:07.999999’UTC。
    • YEAR:范围是 1901到2155。

    TIME

      我们可以看到TIME的存储范围是’-838:59:59’到 ‘838:59:59’,因为TIME类型不仅可以用于表示一天中的时间,还可以用于表示两个事件之间的经过时间或时间间隔。TIME的完整的显示为 D HH:MM:SS,D:表示天数,当指定该值时,存储时小时会先乘以该值,HH:表示小时,MM:表示分钟,SS:表示秒。

    DATETIME和TIMESTAMP

    CREATE TABLE timestamp_db( a TIMESTAMP )

    INSERT timestamp_db() VALUES(20020121);
    INSERT timestamp_db() VALUES(20020121142554);
    INSERT timestamp_db() VALUES("2015-12-16 21:14:15");
    INSERT timestamp_db() VALUES("2015-12-17");
    INSERT timestamp_db() VALUES(NULL);
    INSERT timestamp_db() VALUES(CURRENT_TIMESTAMP);
    INSERT timestamp_db() VALUES();

    约束条件

      约束条件就是在给字段加一些约束,使该字段存储的值更加符合我们的预期。常用的约束条件如下:

    • UNSIGNED :无符号,值从0开始,无负数
    • ZEROFILL:零填充,当数据的显示长度不够的时候可以使用前补0的效果填充至指定长度,字段会自动添加UNSIGNED
    • NOT NULL:非空约束,表示该字段的值不能为空
    • DEFAULT:表示如果插入数据时没有给该字段赋值,那么就使用默认值
    • PRIMARY KEY:主键约束,表示唯一标识,不能为空,且一个表只能有一个主键。一般都是用来约束id
    • AUTO_INCREMENT:自增长,只能用于数值列,而且配合索引使用,默认起始值从1开始,每次增长1
    • UNIQUE KEY:唯一值,表示该字段下的值不能重复,null除外。比如身份证号是一人一号的,一般都会用这个进行约束
    • FOREIGN KEY:外键约束,目的是为了保证数据的完成性和唯一性,以及实现一对一或一对多关系

    二、如何选择数据类型

    正数和浮点数

      如果不需要小数部分,则使用整数来保存数据,并且根据整数的大小,来选择合适的整数类型,如果需要小数部分,则使用浮点数类型,浮点数类型中,有float和double,如果需要精度高一点,则选择double。根据自己的需求来决定选什么。

    浮点数和定点数

      浮点数FLOAT、DOUBLE相对应定点数DECIMAL的优势在于:在长度一定的情况下,浮点数能表示更大的数据范围,但是浮点数容易产生误差。

      因此在精度比较高时,建议使用DECIMAL,比如货币这一类东西,就用DECIMAL比较合理,注意浮点数在进行加减运算时也容易出现问题。如果进行数值比较,也建议用DECIMAL

    日期与时间类型

      根据各种格式,选择自己所需要的数据类型,注意TIMESTAMP和DATETIME的区别,一个是跟时区有关,一个无关。

    CHAR和VARCHAR之间的特点与选择

      CHAR是固定长度字符、VARCHAR是可变长度字符。CHAR会自动删除插入数据的尾部空格,VARCHAR不会。 CHAR是固定长度,处理速度比VARCHAR更快,缺点很明显,浪费存储空间,所以对存储不大,但在速度上有要求的可以使用CHAR类型,反之用VARCHAR。

    ENUM和SET

      ENUM只能取单值,也就是从枚举类型中选取其中一个值,但是SET可以取多值,ENUM最多能存放65535个成员,SET只能65个,空字符串也能在SET中存储,要存储一个人的喜爱时,最好使用SET类型,其实最重要的是看具体的情况在选取

    BLOB和TEXT

      BLOB是二进制字符串,TEXT是非二进制字符串,两者均可存放大容量的信息,BLOB主要存储图片、音频信息,而TEXT只能存储纯文本文件。分清楚两者的用途。

    BINARY和VARBINARY

      这两个的区别和CHAR与VARCHAR的区别差不多,BINARY是固定长度、VARBINARY是可变程度,这两个的作用就是为了区分大小写的,注意这两个是字节字符串。

  • 相关阅读:
    [iOS]为什么不要在init初始化方法里调用self.view
    [iOS]ARC和MRC下混编
    CollectionView的基础代码
    关于ios项目中加入webp格式的图片
    【音频】远程链接音频播放(AVPlayer)
    iOS微信支付回调和iOS9系统左上角返回的冲突解决
    【转载】iOS开发经验总结
    【转载】iOS超全开源框架、项目和学习资料汇总(4)数据库、缓存处理、图像浏览、摄像照相视频音频篇
    【转载】3分钟实现iOS语言本地化/国际化(图文详解)
    微信小程序推荐网站
  • 原文地址:https://www.cnblogs.com/yfstudy/p/13550877.html
Copyright © 2011-2022 走看看