当前位置:首页 > 问答 > 正文

数据库里各种数据格式到底怎么用,存储和转换那些事儿谈一谈

说到数据库里的数据格式,咱们可以把它想象成现实生活中的各种容器和物品,你总不能把水用网兜来装,也不能把活鱼直接塞进文件柜,对吧?数据库里存数据也是一个道理,不同的数据要放在合适的“格式容器”里,才能存得下、取得快、用得方便。

最基础的格式:数字和文本

这俩是数据库里的“大米和白面”,最常用。

  • 数字格式:主要分两种,一种是整数,比如人的年龄、商品的数量,在数据库里通常叫 INT 或 INTEGER,另一种是带小数点的,比如商品价格、人的体重,这叫浮点数,常见的是 FLOAT 或 DECIMAL,它们俩的区别在于精度,FLOAT 像是一个估算值,计算快但可能会有极微小的误差,适合对精度要求不高的科学计算,而 DECIMAL 则像计算器,非常精确,一分钱都不会差,所以像金融、交易相关的金额,必须用它。(来源:常见数据库系统如MySQL、PostgreSQL的官方文档中对数值类型的描述)

  • 文本格式:也分长短,短一点的,比如人的姓名、产品的型号,可以用 VARCHAR,这个“VAR”意思是可变长度,你存一个“张三”,它就只占两个字符的空间;存一个“亚历山大·伊万诺夫”,它就占长一点的空间,比较节省,另一种是定长的 CHAR,比如你规定它长度是10,那么存“男”这个字,它也会在后面给你补上9个空格,凑满10位,这种适合长度非常固定的数据,比如身份证号、手机号,VARCHAR 更常用。(来源:SQL标准及多数关系型数据库的实践指南)

处理时间和日期

时间和日期是特别容易搞乱的部分,数据库通常有几种专门的格式:

  • DATE:只关心年月日,比如生日、入职日期。
  • TIME:只关心时分秒,比如会议开始时间。
  • DATETIME 或 TIMESTAMP:这俩最常用,把年月日和时分秒合在一起,它俩看起来很相似,但有个重要区别:DATETIME 是你存入什么时间,它就永远记着那个时间,不受数据库所在时区的影响,而 TIMESTAMP 通常会转换成统一的全球标准时间(UTC)存储,当你查询时,再根据数据库设置的时区转换回当地时间,如果你的应用用户遍布全球,用 TIMESTAMP 会更省心。(来源:MySQL官方文档中对DATETIME和TIMESTAMP的对比说明)

高级玩家:二进制和大对象

当你要存的东西不再是简单的数字和文字时,就需要更强大的容器了。

  • 二进制:用来存真正的“0101”这种原始字节数据,你想存一个用户上传的文件指纹(MD5值),或者一些加密后的密文,这些数据本身没有数字或文本的意义,就用二进制格式,通常叫 BINARY 或 VARBINARY。

  • 大对象:这就像仓库了,专门放“大件货”,分两种:

    • BLOB:二进制大对象,用来存图片、音频、视频文件本身,数据库并不关心文件内容是什么,就当是一大串字节存起来,优点是管理和备份方便,和数据记录在一起;缺点是会让数据库体积变得巨大,影响性能。
    • CLOBTEXT:字符大对象,用来存超长的文本,比如一篇文章、一本电子书、整个系统的日志文件。

存储和转换那些事儿

存格式容易,但数据经常要搬来搬去,或者变个样子用,这就涉及到转换。

  • 为什么转换?

    1. 计算需要:你从网页表单里收到的年龄是文本“25”,但数据库里年龄字段是整数INT,不转换成数字,你怎么做“年龄大于20”的查询呢?
    2. 显示需要:数据库里存的是UTC时间的TIMESTAMP,但给中国用户看,你得转换成“北京时间”。
    3. 集成需要:你的数据库用DATETIME存时间,但另一个系统只认“2024-05-20T10:30:00Z”这种格式的字符串,你就得转换。
  • 怎么转换? 主要靠两种方式:

    1. 在数据库层面转换:直接用SQL语句里的函数,用 CAST(‘123’ AS INT) 把字符串‘123’变成数字123;用 DATE_FORMAT()TO_CHAR() 函数把日期格式化成你想要的字符串样子,这种方式速度快,减轻了应用程序的负担。
    2. 在应用程序层面转换:在你的Java、Python程序中转换,用Python的 int() 函数转数字,用 strftime() 函数格式化日期,这种方式更灵活,尤其是当转换逻辑非常复杂时。

选对数据格式是高效使用数据库的第一步,基本原则是“量体裁衣”,数字、文本、日期各司其职,转换则是数据流动中的常态,关键在于搞清楚转换的目的,然后选择是在数据库里转还是在程序里转,别看这些格式好像很枯燥,但它们就像是盖楼的地基,地基打得好,上层建筑(你的各种应用功能)才能稳固可靠。

数据库里各种数据格式到底怎么用,存储和转换那些事儿谈一谈