【问题标题】:Advantage Database, case sensitivity, and collationsAdvantage 数据库、区分大小写和排序规则
【发布时间】:2015-02-10 23:40:31
【问题描述】:

我的 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;本机错误 = 2213; [iAnywhere 解决方案] [Advantage SQL 引擎]无效比较或 对具有不同排序规则的字符串进行操作。 ** 脚本错误 信息: -- SQL 语句中的错误位置为:137(行: 5 列:1)

当我想要时:-

t1_x    t2_x
cheese  CHEESE

这是因为 'CHEESE' 字符串文字变成了 VARCHARFOX 类型,而临时表中的列是 cichar 类型,因为我想要不区分大小写的比较。

我可以通过在比较中添加“COLLATE ads_default_ci”来修复此实例,但这很麻烦,而且我永远记不起它的确切语法。

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

【问题讨论】:

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


    【解决方案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 中,您可以在连接属性中设置它)。

    【讨论】:

    • 是的,你是对的,你必须有一个派生表。我正在寻找合适的措辞来描述它。但是你得到的东西与派生表和文字不同是很奇怪的。
    猜你喜欢
    • 1970-01-01
    • 2014-05-10
    • 2011-06-01
    • 2010-11-14
    • 2019-06-19
    • 2011-05-11
    • 1970-01-01
    • 2011-03-18
    • 2012-01-12
    相关资源
    最近更新 更多