You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中char类型用like '%M'无结果,varchar正常,是否为预期行为?

PostgreSQL中CHAR类型使用LIKE '%'匹配异常是预期行为吗?

问题场景

创建表结构:

create table movie(movie_name varchar(20), director char(20));

注:movie_name为可变长度的varchar类型,director为固定长度的char类型

插入测试数据:

insert into movie values('JaiBhim', 'Gnanavel');
insert into movie values('Dharbar', 'ARM');

执行以下查询:

select * 
from movie 
where movie_name like '%m';

返回正确结果:包含JaiBhim和Gnanavel的行。

但执行针对director的查询:

select * 
from movie 
where director like '%M';

预期返回包含Dharbar和ARM的行,实际却返回0条结果。

解答

这是预期行为,核心原因在于PostgreSQL中char(n)(固定长度字符类型)的特性:

  • 当插入的字符串长度小于指定的n时,PostgreSQL会自动用空格填充至长度n。比如例子中director字段是char(20),插入'ARM'后,实际存储的是'ARM'加上17个空格,而非单纯的'ARM'。
  • like '%M'是匹配以M结尾的字符串,但此时director字段的实际值结尾是空格,自然无法匹配。
  • 而varchar(n)是可变长度类型,不会自动填充空格,存储的就是插入的原始字符串,因此like '%m'可以正常匹配。

解决方法

  1. 推荐方案:将char类型改为varchar类型,除非你明确需要固定长度且自动填充空格的场景(这类场景极少)。
  2. 临时处理:查询时去除字段两端的空格后再匹配:
select * 
from movie 
where trim(director) like '%M';
  1. 也可以匹配包含空格的结尾,但这种方式依赖字段的固定长度,不推荐:
select * 
from movie 
where director like '%M                   '; -- 补17个空格对应char(20)的长度

内容的提问来源于stack exchange,提问作者Muthuramalingam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 10:53:13