• Welcome to Journal web site.

我是 PHP 程序员

- 开发无止境 -

Next
没有了

02 常用数据类型与使用建议

Data: 2016-07-17 01:53:01Form: JournalClick: 2

1、数据类型

 

2、常用数据类型解读及使用建议

【字符串类型】

  1. char:长度 范围1~255,数据长度不够时会用空格填满到指定长度,如数据长度出入较大会浪费空间。固定数据长度使用,如身份证、手机号。
  2. varchar: 长度 范围1~65535,用于长度不等的数据储存
  3. tinytext、text、mediumtext、longtext 四种文本数据类型
    • tinytext:最大长度是(2^8 - 1)个字符
    • text:最大长度是(2^16 - 1)个字符
    • mediumtext:最大长度是(2^24 - 1)个字符
    • longtext:最大长度是(2^32 - 1)个字符

【日期 / 时间类型】

  1. date:储存日期所使用,存储范围是 ‘1000-01-01’ 到 ‘9999-12-31’,常用于生日储存。

  2. time:储存时间所使用,取值范围是 ‘-838:59:59’ to ‘838:59:59’,支持负数储存。也允许以 “D HH:MM:SS” 的格式存储。其中,D 的取值是 0 ~ 34。如果要存储时间间隔,time 则会以(时间间隔 * 小时)作为小时进行存储。它的计算公式是:D * 24 + HH。例如,插入了 “2 19:20:00”,相当于插入 “67:20:00”。
  3. datetime:日期时间组合使用,取值范围是 ‘1000-01-01 00:00:00.000000’ 到 ‘9999-12-31 23:59:59.999999’
  4. timestamp:带时区 日期时间组合使用,取值范围是:‘1970-01-01 00:00:01.000000’UTC 到 ‘2038-01-19 03:14:07.999999’UTC。比 datetime 取值范围略小一些。储存是反馈当前时间,插入数据时会自动转行为本地时间后再储存,查询同理。不同时区使用同一数据将看到不同结果。

【数值类型】

  1. 整数类型:tinyint、smallint、mediumint、int、bigint。设置时定义 UNSIGNED 可只保存正整数

     
  2. 浮点类型:float、double。float 表示 单精度浮点数,占用4个字节。double 表示 双精度浮点数,占用8个字节。只能保存近似数值,无法保存准确数值。
    float 特点:占用空间小,精度略低,取值范围略小。

     
  3. 定点类型:decimal 表示 定点数据类型,保存高精度计算使用,也可 decimal 去保存比 bigint 还要大的整数值 时使用每 4 个字节可以存储 9 个数字。
    如 decimal (18, 9):

    两边各有 9个数字,占据 2 * 4 = 8 个字节,小数点自身占用一个字节,最终,decimal (18, 9) 一共占用 9 个字节。
    位数不够时,末尾小数会自动补零。位数超出时,会报错!一般情况下不建议使用该类型,比较占用空间跟计算开销,适合高精度计算场景下使用。
     
  4. 二进制类型:tityblob、blob、mediumblob、longblob。日常使用频率较低,可储存任何数据,如文本、图像、多媒体数据等,但不建议文件直接保存这边,会大幅降低数据库性能,一般不建议使用该类型。

     

【数据类型选用技巧与建议】

  1. 使用 NOT NULL,且带有 COMMENT
    数据库索引值为 NULL 时,需要 储存更多空间,使用 NOT NULL 更省空间。比较计算时 NULL 更占资源
     
  2. 使用存储需要的最小数据类型
    使用存储需要的最小数据类型,如状态用 tinyint;班级人数用 smallint等。越小的数据库类型占用硬件资源越少,速度越快建立索引时所需空间也越小,遍历IO次数也少,索引发挥的效果将越高。
     
  3. 选择简单的数据类型
    纯数字类型就选 int,避免使用 varchar,
    整型数据 会比 字符串类型 占用资源更低。
    储存浮点数尽量使用 decimal ,甚至再简约一些,可以把 订单金额*100 按“分”来储存成整数类型,这样可以优化掉小数点占用资源问题。

     
  4. 尽量 避免使用 text 和 blob
    数据库内存临时表不支持 text、blob 大数据类型,如要操作该字段类型排序等操作,性能将会下降很多。如真的需要使用这些类型时,查询 一定不要直接  SELECT *,而是取出需要的列。另外数据库对索引长度有限制,text类型只能用到 前缀索引,并且由于存储的是指针,text 列上不能有默认值
Name:
<提交>