zoukankan      html  css  js  c++  java
  • 第五节:MySQL中的数据类型

    数据类型的分类

    1. MySQL中定义数据字段的类型对数据库的优化是非常重要的
    2. 数值类型:
      1. 整数类型:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT
      2. 浮点数类型: FLOAT 和 DOUBLE
      3. 定点数类型:DECIMAL
    3. 日期/时间类型:YEAR、TIME、DATE、DATETIME 和 TIMESTAMP
    4. 字符串类型:
      1. 文本字符串:CHAR、VARCHAR、TINYTEXT、MEDIUMTEXT、TEXT和LONGTEXT等
      2. 二进制字符串:BINARY、VARBINARY、TINYBLOB、MEDIUMBLOB、BLOB和LONGBLOB等

    数值类型

    1. 标准SQL支持的数值数据类型,mysql都支持
    2. 下面的表显示了每个整数类型的存储和范围:
    类型大小范围(有符号)范围(无符号)用途
    TINYINT 1 字节 (-128,127) (0,255) 小整数值
    SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
    MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
    INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
    BIGINT 8 字节 (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
    FLOAT 4 字节 (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度
    浮点数值
    DOUBLE 8 字节 (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度
    浮点数值
    DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

    日期/时间类型

    1. 每个时间类型有一个有效值范围和一个"零"值,当指定不合法的值时使用"零"值
    类型大小
    (字节)
    范围格式用途
    DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
    TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
    YEAR 1 1901/2155 YYYY 年份值
    DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
    TIMESTAMP 4

    1970-01-01 00:00:00/2038-1-19 03:14:07

    结束时间是第 2147483647 秒,格林尼治时间 2038年1月19日 凌晨 03:14:07

    xxxxxxxxxxxxxx 时间戳: 以格林威治时间为基准:从1970年1月1日00:00:00到目前的秒数,经常作为时间差的求值

    字符类型

    类型大小用途
    CHAR 0-255字符 定长字符串
    VARCHAR 0-65535 字节 变长字符串
    TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
    TINYTEXT 0-255字节 短文本字符串
    BLOB 0-65 535字节 二进制形式的长文本数据
    TEXT 0-65 535字节 长文本数据
    MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
    MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
    LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
    LONGTEXT 0-4 294 967 295字节 极大文本数据
    1. binary、varbinary和blob之间的关系类似于char、varchar和text之间的关系,区别是是前者是二进制字符串,后者是文本字符串
    2. char、varchar 和text小结:
      1. 字段值经常变化的字段用char
      2. 知道固定长度的用 char
      3. 尽量用 varchar
      4. 超过 255 字符的只能用 varchar 或者 text
      5. 能用 varchar 的地方不用 text
    3. 一个汉字占多少长度与编码有关:
      1. UTF-8:一个汉字=3个字节
      2. GBK:一个汉字=2个字节

    char、varchar和text的区别

    1. char的长度是不可变的,而varchar的长度是可变的
    2. CHAR 和 VARCHAR:它们保存和检索的方式不同。它们否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换
      1. char(M):定义的列的长度是固定的M个字符,当保存的字符的值小于M值时,在它们的右边填充空格以达到指定的长度,当检索到字符有空格的时候,尾部的空格会被删除,在存储或检索过程中不进行大小写转换。
      2. varchar(M):定义的列的长度是可变的,列的长度由实际存储的字符个数决定,不由M决定,所有不会在它们的右边进行填充空格,当检索到字符有空格的时候,尾部的空格也不会被删除,在存储或检索过程中不进行大小写转换。
      3. 比如:定义一个char[10]和varchar[10],如果存进去的是‘abcd’,那么char所占的长度依然为10,除了字符‘abcd’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的
    3. char:char(n)中的n表示字符数,最大长度是255个字符; 如果是utf8编码方式, 那么char类型占255 * 3个字节。(utf8下一个字符占用1至3个字节)
    4. varchar:varchar(n)中的n表示字符数, 存放的最大字符数量跟字符集有关,如果是utf8编码, 那么varchar最多存65532/3 = 21844个字符。解释如下:
      1. varchar最大空间是65535个字节,实际是65532个字节(头部字节是空的,不存任何的数据,尾部还需要两个字节来存放字符串的长度)
      2. varchar需要1或者2个字节来存储存储长度信息,当存储数据的长度=<255时需要1个字节,当存储数据的字符长度>=255时候需要2个字节
    5. text跟varchar基本相同,实际上text占用内存空间最大也是65535个字节,与varchar相比不需要少三个字节,text不需要指定最大的字符长度。(后面如果指定长度,不会报错误,但是这个长度是不起作用的,意思就是你插入数据的时候,超过你指定的长度还是可以正常插入)
    6. 按照存取速度: char最快, varchar次之,text最慢
    7. char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的
    8. 从碎片角度进行考虑,使用CHAR字符型时,由于存储空间都是一次性分配的。为此某个字段的内容,其都是存储在一起的。单从这个角度来讲,其不存在碎片的困扰。而可变长度的字符数据类型,其存储的长度是可变的。当其更改前后数据长度不一致时,就不可避免的会出现碎片的问题。故使用可变长度的字符型数据时,数据库管理员要时不时的对碎片进行整理(如执行数据库导出导入作业,来消除碎片)

    字符存放在varchar(n)和varchar(m)的区别

      用户需要存储一个地址信息大概是90个字符。根据评估,只要使用100个字符就可以了。但是有些数据库管理员会认为,反正Varchar数据类型是根据实际的需要来分配长度的。还不如给其大一点的呢。为此他们可能会为这个字段一次性分配200个字符的存储空间。这VARCHAR(100)与VARCHAR(200)真的相同吗?结果是否定的。虽然他们用来存储90个字符的数据,其存储空间相同。但是对于内存的消耗是不同的。对于VARCHAR数据类型来说,硬盘上的存储空间虽然都是根据实际字符长度来分配存储空间的,但是对于内存来说,则不是。其时使用固定大小的内存块来保存值。简单的说,就是使用字符类型中定义的长度,即200个字符空间。这对于排序或者临时表(这些内容都需要通过内存来实现)作业会产生比较大的不利影响。所以如果某些字段会涉及到文件排序或者基于磁盘的临时表时,还是要评估实际需要的长度,然后选择一个最长的字段来设置字符长度。如果为了考虑冗余,可以留10%左右的字符长度。

  • 相关阅读:
    笔试算法题(51):简介
    笔试算法题(50):简介
    笔试算法题(49):简介
    笔试算法题(48):简介
    笔试算法题(47):简介
    笔试算法题(46):简介
    SQL Server 笔记
    SQL Server 2008 安装重启电脑失败
    列举某个目录文件
    Linux LAMP 配置
  • 原文地址:https://www.cnblogs.com/WeiKing/p/11790847.html
Copyright © 2011-2022 走看看