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'可以正常匹配。
解决方法
- 推荐方案:将
char类型改为varchar类型,除非你明确需要固定长度且自动填充空格的场景(这类场景极少)。 - 临时处理:查询时去除字段两端的空格后再匹配:
select * from movie where trim(director) like '%M';
- 也可以匹配包含空格的结尾,但这种方式依赖字段的固定长度,不推荐:
select * from movie where director like '%M '; -- 补17个空格对应char(20)的长度
内容的提问来源于stack exchange,提问作者Muthuramalingam
相关产品推荐
相关产品推荐

