CodeGym /课程 /SQL SELF /文本数据类型: CHARVARCHAR

文本数据类型: CHARVARCHARTEXT

SQL SELF
第 15 级 , 课程 2
可用

说到在PostgreSQL里搞文本数据,咱们有三个主角:CHARVARCHARTEXT。每个都有自己的特点、优点和小细节。咱们一个个来看看。

CHAR(n)

CHAR,也叫character,就是长度固定为n的字符串。如果你存的内容没那么长,后面会自动补空格。

例子:

id code - CHAR(5)
1 ''ABC''

这种类型适合所有字符串都得一样长的时候用(比如各种代码、条形码或者长度固定的ID啥的)。

但如果你要存长度不一样的文本,那这些补的空格就白白占数据库空间了。

VARCHAR(n)

VARCHAR,也叫variable character,是用来存长度不固定的字符串,但有最大长度n的限制。

例子:

id username - VARCHAR(10)
1 ''Alice''

这种类型很省空间,因为只存实际的文本内容。缺点就是你得指定最大长度。如果超了,数据库会直接报错。

TEXT

TEXT是没有长度限制的字符串类型。你不确定文本会有多长的时候,这个用起来最爽。

例子:

id content - TEXT
1 ''This is a long piece of text. No limits!''

优点:可以存任意长度的文本,完全不用担心限制。

缺点:没限制的话,数据表可能会被撑得很大,效率也可能受影响。

文本数据类型对比

搞文本的时候,选对数据类型很重要。下面是CHARVARCHARTEXT的主要区别:

数据类型 长度 性能 啥时候用?
CHAR(n) 固定 长度固定的字符串最快 用在长度固定的代码(比如ISO)
VARCHAR(n) 最大长度n 有长度限制时比TEXT 长度不固定但有最大值的字符串
TEXT 无限制 最通用 文本很长、长度不好预测的时候

实际用法举例

来看看这些类型在实际场景里咋用。

例子1:用CHAR存固定长度的代码

比如你有个数据库,要存城市的ISO 3166-1 alpha-3标准代码。每个代码都必须是3个字符。

city_id city_name - VARCHAR(50) iso_code - CHAR(3)
1 New York NYC
2 Los Angeles LAX
3 Chicago CHI

这里CHAR(3)就很合适,因为每个城市的ISO代码都是固定长度。

例子2:用VARCHAR存用户名

用户名就是VARCHAR的典型用法。长度不固定,但肯定不会超过50个字符。

user_id username - VARCHAR(50) email - VARCHAR(50)
1 Alice alice@example.com
2 Bob bob@example.net

VARCHAR可以省空间,因为实际长度一般都比50短。

例子3:用TEXT存描述

比如你有个博客,每篇文章都要存很长的描述。这时候TEXT最合适。

post_id title - VARCHAR(100) content - TEXT
1 Post 1 This is a very long blog post content that goes on and on...

如果你根本不知道文本会有多长,TEXT就是最佳选择。

4. 额外细节和坑

用文本类型的时候,有些点要注意,避免踩坑。

问题:CHAR会自动补空格

如果你直接比较CHAR类型的字段,没考虑补的空格,可能查不到你想要的结果。

SELECT * FROM cities WHERE iso_code = 'NYC';
-- 如果不去掉空格,啥都查不到

怎么解决:TRIM()函数去掉空格。

SELECT * FROM cities WHERE TRIM(iso_code) = 'NYC';

问题:VARCHAR长度限制可能报错

如果你往VARCHAR字段里插入超出最大长度的字符串,数据库会直接报错。

INSERT INTO users (username, email) VALUES ('A_username_that_is_too_long_for_field', 'test@example.com');
-- 报错

怎么解决:确保长度限制(n)够用,或者直接用TEXT避免限制。

问题:TEXT可能让数据库变胖

TEXT能存无限长的内容,表可能会变得很大,索引也会变慢。

怎么避免:如果你打算给TEXT字段建索引,最好考虑用有限长度的VARCHAR

2
任务
SQL SELF, 第 15 级, 课程 2
已锁定
大小写转换和去除空格
大小写转换和去除空格
2
任务
SQL SELF, 第 15 级, 课程 2
已锁定
按模式过滤(LIKE)
按模式过滤(LIKE)
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION