• MySQL基本数据类型


    FloatDouble

      MySQL将四个字节用于单精度值,并将八个字节用于双精度值。Float、DOUBLE类型代表近似数值。对于FLOAT,SQL标准允许对FLOAT括号中的关键字后面的位以精度(但不允许指数的范围)进行可选的规范。由于浮点值是近似值而不是作为精确值存储的,因此在比较中尝试将它们视为精确值可能会导致问题。它们还受平台或 实现依赖性的约束。如果需要表示的精确度很高时,如货币数据,最好使用decimal。

    DECIMAL

      DECIMAL以字符串的形式存储, 可能的最大取值范围与 DOUBLE 相同,但是有效的取值范围由 M 和 D 决定。DECIMAL(M,D)如果改变 M 而固定 D,则取值范围将随 M 的变大而变大。M的默认值为10,D的默认值是0.(精确的行为是特定于操作系统的,但是通常效果是将其截断为允许的位数。)

    例如 decimal(5,2),5是精度,2是小数位数。精度表示值存储的有效位数,小数位数表示小数点后可以存储的位数。所以可以表示为123.12

      浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的范围;但缺点是会引起精度问题。并且两个浮点数进行减法和比较运算时也容易出问题,所以在使用浮点数时需要注意,并尽量避免做浮点数比较。

    TIMESTAMP DATETIME

      TIMESTAMP 与 DATETIME 除了存储字节和支持的范围不同外,还有一个最大的区别是:DATETIME 在存储日期数据时,按实际输入的格式存储,即输入什么就存储什么,与时区无关;而 TIMESTAMP 值的存储是以 UTC(世界标准时间)格式保存的,存储时对当前时区进行转换。

    BINARY VARBINARY

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

      在将数据转换为二进制数据时,SQL Server会对生成的二进制数据进行填充或截断。

    当BINARY被存储的值,它们被右侧填充垫值到指定的长度。填充值为0x00(零字节)。值在0x00插入时用右填充,不会删除尾随字节以进行检索。所有字节在比较中都很重要,包括ORDER BY和DISTINCT操作。 0x00比较中,空间和空间有所不同,0x00先于空间进行 排序。

    示例:对于BINARY(3)列, 在插入时'a '变为 'a '。 插入时'a'变为'a'。两个插入的值均保持不变以进行检索。

    对于VARBINARY,没有用于插入的填充,也没有剥离任何字节以进行检索。所有字节在比较中都很重要,包括ORDER BY和DISTINCT操作。 0x00比较中,空间和空间有所不同,0x00先于空间进行 排序。

    对于那些删除尾部填充字节或比较将其忽略的情况,如果一列具有要求唯一值的索引,则将仅尾部填充字节数不同的值插入该列会导致重复键错误。例如,如果表包含'a',则尝试存储'a'会导致重复键错误。

    BLOB

      BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。同样TEXT也有四种类型: TINYTEXT,TEXT, MEDIUMTEXT,和LONGTEXT。这些对应于四种BLOB类型,并且具有相同的最大长度和存储要求。

      BLOB值被视为二进制字符串(字节字符串)。它们具有binary 字符集和排序规则,并且比较和排序基于列值中字节的数字值。 TEXT值被视为非二进制字符串(字符字符串)。它们具有 binary以外的字符集,并且根据字符集的排序规则对值进行排序和比较。

      在大多数情况下可以将BLOB列看做VARBINARY,相似的,可以将TEXT列视为VARCHAR。但是BLOB、TEXT与VARBINARY、VARCHAR的不同在于:

    • 对于BLOB和TEXT的索引列,必须指定索引前缀长度。但对于CHAR和VARCHAR,前缀长度是可选的。

    • BLOB和TEXT列不能有DEFAULT值。

      MySQL Connector / ODBC将BLOB值定义为 LONGVARBINARY,将TEXT 值定义为LONGVARCHAR。

      由于BLOBandTEXT 值可能非常长,因此在使用它们时可能会遇到一些限制:

      使用临时表处理的查询结果中的 实例BLOB或 TEXT列会导致服务器在磁盘而不是内存中使用表,因为 MEMORY存储引擎不支持这些数据类型。使用磁盘会导致性能下降,因此仅在确实需要时在查询结果中包含 BLOB或TEXT列。例如,避免使用 SELECT *选择所有列的。

    SET和ENUM

      ENUM 是一个字符串对象,值为表创建时列规定中枚举的一列值。

      SET 是一个字符串的对象,可以有零或多个值,SET 列最多可以有 64 个成员,值为表创建时规定的一列值。指定包括多个 SET 成员的 SET 列值时,各成员之间用逗号,隔开。如果插入 SET 字段中的列值有重复,则 MySQL 自动删除重复的值;插入 SET 字段的值的顺序并不重要,MySQL 会在存入数据库时,按照定义的顺序显示;如果插入了不正确的值,默认情况下,MySQL 将忽视这些值,给出警告。

      与 ENUM 类型相同,SET 值在内部用整数表示,列表中每个值都有一个索引编号。当创建表时,SET 成员值的尾部空格将自动删除。

      但与 ENUM 类型不同的是,ENUM 类型的字段只能从定义的列值中选择一个值插入,而 SET 类型的列可从定义的列值中选择多个字符的联合。

     

  • 相关阅读:
    java.net.ConnectException: localhost/127.0.0.1:8088 Connection refused java程序员
    网络模式:GSM,WCDMA,CDMA2000什么意思 java程序员
    Spring contextConfigLocation java程序员
    src总结 java程序员
    广州天河软件园面试Java实习生时的一些面试题 java程序员
    纠结了好久的Android SDK无法更新问题 java程序员
    Android SDK 2.3/3.0/4.0/4.1 下载与安装教程 java程序员
    域名解析文件hosts文件是什么?如何修改hosts文件? java程序员
    安卓模拟器Android SDK 4.0.3 R2安装完整图文教程 java程序员
    SpringBoot+mongoDB实现id自增
  • 原文地址:https://www.cnblogs.com/Sherlockmmc/p/14284687.html
Copyright © 2020-2023  润新知