我的Advantage数据库中有类似的内容:
drop table #test;
create table #test (x cichar(50));
insert into #test (x) values ('cheese');
insert into #test (x) values ('fromage');
insert into #test (x) values ('Queso');
select
t1.x t1_x,
t2.x t2_x
from
#test t1
inner join
(
select
'CHEESE' x // String literal will be of type VARCHARFOX
from
system.iota
) t2
on t1.x=t2.x
这给了我消息:
poQuery:错误7200:AQE错误:State = HY000; NativeError = 2213;
[iAnywhere解决方案] [Advantage SQL Engine] 比较无效或
对具有不同排序规则的字符串进行操作。 **脚本错误
信息:-SQL语句中错误的位置是:137(行:
5栏:1)
当我想:-
t1_x t2_x
cheese CHEESE
这是因为'CHEESE'字符串文字变成了VARCHARFOX类型,而临时表中的列是cichar类型,因为我想要不区分大小写的比较。
我可以通过在比较中添加“COLLATE ads_default_ci”来修复此实例,但这很麻烦,我永远也记不清它的确切语法。
我想我在列类型或数据库配置上肯定犯了一些根本性的错误,执行此操作的优雅/正确方法是什么?
最佳答案
问题不在于字符串文字,这里的字符串文字通常表现良好。
他们得到the COERCION_COMPATBILE collation:
TRY drop table #test; CATCH ALL END TRY;
create table #test (x cichar(50));
insert into #test (x) values ('cheese');
insert into #test (x) values ('fromage');
insert into #test (x) values ('Queso');
select
t1.x t1_x,
'CHEESE' t2_x
from
#test t1
where
t1.x='CHEESE'
问题是您要引入派生表,并且ADS引擎将派生表字段的数据类型确定为
VARCHARFOX(6)
:select
'CHEESE' x
from
system.iota
我认为没有简单的方法可以做到这一点。
我创建了an upstream request on the ADS forum。
我还基于此添加了feature request。如果实施,则解决方案将是:
select
CICHAR'CHEESE' x
from
system.iota
我认为这将是一个干净的解决方案。
您还应该注意其他事项:
有一个排序规则associated with each connection。
NCHAR还内置了对区分大小写的和不区分大小写的排序规则的支持。使用哪种连接取决于当前连接的排序规则。
您可以使用AdsSetCollation函数设置当前连接的排序规则(或者对于您的开发环境是等效的,例如,在ARC中,您可以在连接属性中进行设置)。
关于sql - 优势数据库,区分大小写和排序规则,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27440632/