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

带你随便看看DB2数据库里那些字符串到底是啥玩意儿,怎么用也说不清楚

DB2里处理文字的东西,主要分两大类:一种叫“字符串”,另一种叫“大对象”,咱们今天主要唠唠那些最常用的“字符串”。

定长字符串:CHAR

这个最简单,你可以把它想象成电影院对号入座,你买票的时候,票上写着“8排15座”,这个座位就是固定给你的,不管你来的是个大高个还是个小朋友,这个座位的大小不变。

CHAR就是这么个玩意儿,比如你定义一个列是 CHAR(10),这意味着,无论你往里存什么字,DB2都会给它预留出正好10个字符的位置。

  • 如果你存进去的是“Hi”(2个字符),DB2会在后面自动给你补上8个空格,凑满10个字符。
  • 如果你不知好歹,非要存“这是一个很长的句子”(超过10个字符),DB2会直接报错,告诉你“对不起,超长了,存不进去”。

CHAR的好处是速度快,因为每个数据长度都一样,DB2找起来方便,但它浪费空间,比如你存一堆很短的名字,后面却跟着一大串空格,它最适合用在那些长度非常固定的数据上,比如身份证号(18位)、性别代码(M‘/’F‘,固定1位)等等。

变长字符串:VARCHAR

这个就更像现实生活中了,比较灵活,它好比是自助餐厅的椅子,有人来了就拉一把椅子坐下,人走了就把椅子收走,不占地方。

VARCHAR就是可变长度的,你定义它为 VARCHAR(100),意思是:“这个字段最多能存100个字符,但具体存多少,按实际的来”。

  • 你存“Hello”,它就只占5个字符的空间(DB2会偷偷用一两个字节记下实际长度是5)。
  • 你存“Good Morning”,它就占12个字符的空间。
  • 只要不超过100个字符,都没问题。

显然,VARCHAR节省空间,现在绝大多数情况下都用它,比如人名、地址、商品描述这些长度千变万化的字段,但因为它长度不固定,DB2管理起来稍微麻烦一丢丢,不过这点开销现在基本可以忽略不计。

带你随便看看DB2数据库里那些字符串到底是啥玩意儿,怎么用也说不清楚

这里有个小坑要注意:CHAR和VARCHAR在比较的时候,行为有点不一样,比如一个CHAR(5)的值是‘ABC‘(后面有两个空格),一个VARCHAR(5)的值是‘ABC‘(后面没空格),如果你用等号(=)去比较它俩,DB2会先把CHAR那个值后面的空格去掉再比,所以结果是相等的,但有些更精细的比较操作,可能会因为空格的问题出幺蛾子。

用于存双字节字符的:GRAPHIC

前面说的CHAR和VARCHAR,一个字符通常占一个字节(Byte),这用来存英文字母、数字啥的没问题,但咱们中文、日文这些,一个字就得占俩字节(这叫双字节字符),DB2为了处理这种情况,搞了对应的GRAPHIC类型。

  • GRAPHIC:相当于定长的双字节字符串。GRAPHIC(10),就是预留20个字节的空间,能存最多10个汉字。
  • VARGRAPHIC:相当于变长的双字节字符串。VARGRAPHIC(100),最多能存100个汉字,按实际使用分配空间。

以前数据库字符集设置不完善的时候,用GRAPHIC系列来存中文能避免乱码,但现在DB2的数据库默认都设置为支持Unicode(比如UTF-8)了,直接用VARCHAR就能完美存储全世界几乎所有语言的文字,所以GRAPHIC类型现在用得越来越少了,但你可能会在老系统里见到它。

一种特殊的字符串:CLOB

带你随便看看DB2数据库里那些字符串到底是啥玩意儿,怎么用也说不清楚

这个属于“大对象”范畴了,但因为也是存文本的,就顺便提一下,当你的字符串特别特别长,比如要存一篇文章、一份很长的合同文档、一段XML或JSON数据,长度可能超过VARCHAR的上限(通常32KB左右)时,就得用CLOB了。

CLOB的全称是Character Large Object,你可以把它想象成数据库里的一个“文本文件指针”,数据本身可能存在别的地方,数据库里只存一个“地址”和一些关键信息,处理CLOB和处理普通字符串不太一样,通常需要用一些特定的方法来读取和写入。

简单总结一下怎么选:

  • 长度死固定的,比如代码、邮编,用 CHAR
  • 长度变化但不太长的,比如名字、标题,用 VARCHAR
  • 要存中文字符,在现代DB2里,用 VARCHAR 就行(确保数据库是UTF-8编码)。
  • 要存超长文本,比如几千字的备注,用 CLOB

最后再说一个实用的小技巧:怎么在DB2里看看一个字段到底是什么类型?你可以查一个叫系统目录视图的东西,想看看某个表(比如叫‘MYTABLE‘)的字段信息,可以执行这个SQL(你可能需要有点权限):

SELECT COLNAME, TYPENAME, LENGTH, SCALE, NULLS FROM SYSCAT.COLUMNS WHERE TABNAME = 'MYTABLE‘

你看结果里的 TYPENAME 列,就能看到是CHAR、VARCHAR还是别的啥了,LENGTH就是定义的长度。

希望这么一说,DB2里这些字符串玩意儿是啥,该怎么用,能清楚一点儿了,它们其实就是数据库给你准备的各式各样的“盒子”,有的盒子大小固定,有的能伸缩,有的专门装大件,根据你要装的东西挑合适的就行。