mysql 字段类型探究

Why

每次要创建一个表时,总是要犹豫该为每个字段选择什么样的字段类型?为什么犹豫?因为首先对 MariaDB(mysql) 的字段类型没有一个清楚的认识;其次也没有对这些字段类型做过横向比较,去思考这些类型的不同之处,而这些不同之处,正是我们在选择字段类型时的参考依据。

类型

MariaDB(mysql) 的字段类型总体可以分为如下几类:

  1. 数字类型
  2. 文本类型
  3. 日期和时间类型

数字

数字类型又可以分为整数和浮点数。

整数类型

就类型本身而言,这些类型之间的不同之处只有一点,就是能够存储的值的范围不同。作为开发者,我们在选择合适的整数类型时,需要关注的就是根据要存储的值的情况,选择合适大小的整数类型,减少磁盘空间及磁盘I/0读写开销,减少内存占用,减少CPU的占用率。

浮点数类型

浮点数类型之间除了每种类型能够存储的值的范围不同外,其能存储的值的精度也不同。这里就不做深入探究了,毕竟还没有遇到过需要使用的情景。

Else

  1. zerofill
    当一个字段被设置了 zerofill 时,它会在如下两方面受到影响。

    首先,设置了 zerofill,就意味着这个这个字段是 unsigned 的,就是说这个字段只能存储正数。

    其次,当查看这个字段的数据时,zerofill 会影响这个字段的显示。简单来讲,比如我们设置了一个字段的 zerofill 为 6,那当某条记录该字段的值为小于 6 位的数字时,mysql 显示时就会补零,怎么补?比如 1,就会被显示成 000001;123就会被显示成 000123;12345 就会被显示成 012345。

    除此之外,zerofill 不会对字段的其他方面产生任何影响。

  2. 显示宽度指示器
    显示宽度指示器需要配合 zerofill,否则没有任何意义,显示宽度指示器就是我们上面距离时,设置的那个 6。

  3. mysql 数字类型的字段默认是有符号的。

文本

mysql 给我们提供了很多文本类型,这些文本类型的不同之处主要体现在如下方面:

  1. 能够存储的字符串的长度不同

  2. 存储时是否占用固定大小的存储空间
    比如 CHAR 类型就是固定的,在通过一个大小修饰符指定一个长度后,不管要存储的字符串的长度是否小于这个指定的长度,这个字符串占用的存储空间的大小都是固定的;但 VARCHAR 就不会这样,虽然同样需要通过一个大小修饰符指定一个长度,但当要存储的字符串的长度小于这个指定的长度后,这个值占用的存储空间大小视这个字符串的本身的长度而定。

  3. 处理方式
    基于字符串,还是基于字节流。

    首先我觉得,把 TEXT 与 BLOB(包括这两者的相似类型,如TINYTEXT、TINYBLOB) 都归为文本类型很不合适,太容易让人误解了。虽然两者底层存储的都是字节流,但两者的差别还是很大的。其实,如果你愿意,可以把字符串存储到 BLOB 类型中,只不过,当你需要处理这段字符串时,首先需要把它从字节流根据指定的字符集翻译成字符串;但反过来,一些能用 BLOB 类型存储的数据,比如照片、音频、视频等等,你无法用 TEXT 类型去存储它们,因为这些文件中的字节流基本不能根据字符集翻译成可读的字符串,你可以尝试用 notepad 打开一个图片文件,看下 notepad 把一个图片文件翻译成字符串的效果。

    说白了,如果不把 TEXT 和 BLOB 类型都归为文本类型,我觉得这里并没有什么理解上的困难,毕竟我也是从一开始学计算机,就和字节打交道了。

  4. 是否需要手动指定最大长度
    比如 CHAR 和 VARCHAR 都需要我们指定一个最大长度,但 TINYTEXT、TEXT 这些就不需要。

那上面这4点其实也是我们在选择文本类型时要考虑的4点。

日期与时间

这个唯一选择时让人比较疑惑的点应该是 DATETIME 与 TIMESTAMP,下面的文章对其区别说的很清楚:

MySQL date、datetime和timestamp类型的区别

ENUM 和 SET 类型

这两种类型也被归为文本类型,理解上并没有什么难的,主要是数据库引擎在处理这两种类型的字段时的一些方法要注意,比如插入非法值时会在怎样。

参考文档

  1. 字段类型与合理的选择字段类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值