说到在PostgreSQL里搞文本数据,咱们有三个主角:CHAR、VARCHAR和TEXT。每个都有自己的特点、优点和小细节。咱们一个个来看看。
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!'' |
优点:可以存任意长度的文本,完全不用担心限制。
缺点:没限制的话,数据表可能会被撑得很大,效率也可能受影响。
文本数据类型对比
搞文本的时候,选对数据类型很重要。下面是CHAR、VARCHAR和TEXT的主要区别:
| 数据类型 | 长度 | 性能 | 啥时候用? |
|---|---|---|---|
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。
GO TO FULL VERSION