优势数据库,区分大小写和排序规则

时间:2014-12-12 09:34:54

标签: sql collation case-sensitive advantage-database-server

我的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错误:状态= HY000; NativeError = 2213;   [iAnywhere Solutions] [Advantage SQL Engine] 无效的比较或   对具有不同排序规则的字符串进行操作。 **脚本错误   信息: - SQL语句中的错误位置是:137(行:   5栏:1)

我希望: -

t1_x    t2_x
cheese  CHEESE

这是因为' CHEESE' string literal变为类型VARCHARFOX,临时表中的列是cichar类型,因为我想要不区分大小写的比较。

我可以通过添加" COLLATE ads_default_ci"来解决此问题。比较,但这很麻烦,我永远不会记住它的确切语法。

我认为我必须对列类型或数据库的配置做一些根本性的错误,这是优雅/正确的方法吗?

1 个答案:

答案 0 :(得分:1)

字符串文字不是这里的问题,字符串文字通常表现得很好。

他们得到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中,您可以在连接属性中设置它)。