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

数据库里long类型那些事儿,咋用又是啥讲究,别光看名字就完了

“Long”这个名字在不同的数据库里,指的可能完全不是同一种东西,你可千万别以为在Java里用long,在数据库里找个叫Long的就能无缝对接,那大概率会掉坑里,第一个讲究就是:先看你用的是啥数据库

MySQL里的“Long”

MySQL里带“Long”的关键字有好几个,最容易搞混。

  1. LONGTEXT:这个家伙,你千万别被它的名字骗了,它跟数字一毛钱关系都没有!它是用来存超级长的文本的,比如一整篇小说、一篇超长的JSON字符串或者HTML代码,它的存储空间非常大,能放下最多4GB的文本数据,如果你要存的是大段大段的文字,就用它,但如果你想存数字,比如订单ID、用户ID,用这个就全错了。

  2. LONG:这个类型在MySQL的老版本里存在过,现在基本上已经被淘汰了,官方都建议你别用了,直接用LONGTEXT或者LONGBLOB(存二进制数据的)来代替,看到它,忽略就好。

  3. BIGINT这才是MySQL里真正对应Java中long类型的“正主”,Java里的long是64位的,范围是正负900多万亿的那个大数。BIGINT也是64位的,取值范围是从 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807,当你需要存储一个非常大的整数,比如自增的主键ID(当你的用户量达到亿级时,用INT可能就不够了)、雪花算法生成的分布式ID,这时候就必须用BIGINT

Oracle数据库里的“Long”

Oracle的情况又不一样了。

  1. LONG:和MySQL的LONGTEXT类似,Oracle的LONG也是用来存长文本的,但同样,它也是一个“老古董”类型,Oracle官方自己都不推荐在新项目里使用了,为啥?因为它有很多限制,比如一个表只能有一个LONG列,不能用在子查询里,很多字符串函数也对它不支持,Oracle现在主推的是CLOB类型来存储大文本。

  2. NUMBER:在Oracle里,没有直接叫BIGINT的类型,如果你想存大的整数,用的是NUMBER类型,你可以指定精度,比如NUMBER(19),这表示这个数字最多有19位,这基本上就等价于其他数据库的BIGINT或者Java的long了,Oracle的NUMBER类型非常强大,既能存整数也能存小数,很灵活。

SQL Server里的“Long”

SQL Server的命名又换了一套逻辑。

  1. BIGINT:没错,和MySQL一样,SQL Server里存放大整数的类型也叫BIGINT,同样是64位,取值范围也一样,在SQL Server里,对应Java long的就是它。

  2. TEXTNTEXT:这两个是SQL Server里用来存放大文本的,相当于MySQL的LONGTEXT,但和Oracle的LONG命运类似,它们也是被标记为“即将废弃”的类型了,微软推荐使用VARCHAR(MAX)或者NVARCHAR(MAX)来替代它们,因为后者功能更强大,限制更少。

咋用?有啥讲究?

  1. 首要讲究:搞清楚目的,这是最最关键的,你是要存大整数,还是要存大文本?存整数,就往BIGINT(MySQL/SQL Server)或NUMBER(Oracle)方向找,存文本,就往LONGTEXT(MySQL)、CLOB(Oracle)、VARCHAR(MAX)(SQL Server)方向找,别被名字里的“Long”带偏了。

  2. 性能讲究BIGINT这类整数类型,数据库处理起来非常快,做索引、比较、计算效率都很高,而LONGTEXT这类大文本类型,因为数据量可能非常大,数据库处理起来会比较吃力,通常不会直接拿大文本列来做WHERE条件的筛选(比如WHERE content = ‘xxx’),效率很低,一般会对大文本列做全文索引来优化查询。

  3. 空间讲究BIGINT固定占8个字节,很规整,而大文本类型是可变长度的,你用多少空间它就占多少,但数据库管理起来会更复杂一些。

  4. 编程时的讲究:在你的程序代码(比如Java)里,对应数据库的BIGINT,你就用long(基本类型)或者Long(包装类),对应大文本类型,你就用String,但要注意,如果文本特别大,一次性加载到内存的String里可能会爆掉,这时候就需要用流(Stream)的方式来分段读取处理。

  5. 避坑讲究:坚决不用那些已经被数据库厂商标记为“废弃”(Deprecated)的类型,比如MySQL的LONG,Oracle的LONG,SQL Server的TEXT,因为它们未来可能会被移除,而且功能上有各种限制,是给自己挖坑。

“数据库里的Long类型”根本不是一个单一的概念,它像一个多义词,在不同语境(数据库品牌)下意思完全不同,核心在于望文生义必踩坑,一定要根据实际要存储的数据性质(是数字还是文本),去查阅你所用的具体数据库的文档,找到正确的类型,存大整数找BIGINTNUMBER,存大文本找LONGTEXTCLOBVARCHAR(MAX),并远离那些过时的类型,这样用起来才踏实。

数据库里long类型那些事儿,咋用又是啥讲究,别光看名字就完了