Postgresql选择处理前导空格

时间:2017-03-27 14:31:16

标签: sql linux windows postgresql

我试图找出select在两种不同的Postgresql安装方式之间的区别。一个是Windows上带有SQL_ASCII编码的9.3。另一个是Linux上的9.3,带有SQL_ASCII编码。

问题围绕select如何处理带有前导空格的字符字段。以下命令在两个区域中完成,具有两组不同的结果:

create table jb (jb1 character(3));
insert into jb values('010');
insert into jb values('  1');
insert into jb values('999');
select * from jb where jb1 between '  1' and '999';

结果:010,1,999

的Linux

create table jb (jb1 character(3));
insert into jb values('010');
insert into jb values('  1');
insert into jb values('999');
select * from jb where jb1 between '  1' and '999';

结果:1​​,99

我最好的解释是Linux安装本质上删除了SQL查询中的所有前导空格......但是,我不理解为什么会这样,以及如何克服它。外键与数十个其他表相关的数百万个遗留行。

欣赏输入。

1 个答案:

答案 0 :(得分:0)

感谢Laurenz& Mokadillion。

此处的问题特别是lc_collat​​e设置。在Windows框中,lc_collat​​e设置为English_United States.1252并在Linux框中:en_us.UTF8

因此,在linux上运行查询并明确地将排序设置为" C"将解决问题。

select * from jb where jb1 collate "C" > '  1';
然而,这不是一个好的"解决方案,因为要纠正的查询数量非常大。相反,只有两种解决方案。

第一种解决方案是更改表jb中第jb1列的排序规则。

alter table jb alter jb1 type character (3) collate "C";

由于实际列jb1存在于数十个表中,而其他列具有类似问题,因此这不太可能是最佳的长期解决方案。相反,最终的解决方案是转储数据库;删除数据库;在适当的lc_collat​​e下重新创建数据库;导入数据库。

鉴于实际数据库是> 50千兆,这是不幸的。但是,这是我找到的唯一可靠的答案。