我试图找出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查询中的所有前导空格......但是,我不理解为什么会这样,以及如何克服它。外键与数十个其他表相关的数百万个遗留行。
欣赏输入。
答案 0 :(得分:0)
感谢Laurenz& Mokadillion。
此处的问题特别是lc_collate设置。在Windows框中,lc_collate设置为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_collate下重新创建数据库;导入数据库。
鉴于实际数据库是> 50千兆,这是不幸的。但是,这是我找到的唯一可靠的答案。