gpt4 book ai didi

sql - Postgresql 选择前导空格的处理

转载 作者:太空宇宙 更新时间:2023-11-04 12:32:00 24 4
gpt4 key购买 nike

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

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

Windows

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 查询中的所有前导空格……但是,我不明白为什么会这样以及如何克服它。针对数十个其他表,有数百万涉及外键的遗留行。

欢迎输入。

最佳答案

感谢 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 Gig,这很不幸。然而,这是我找到的唯一可靠答案。

关于sql - Postgresql 选择前导空格的处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43049240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com