Database 区分大小写的sybase查询:列名无效

Database 区分大小写的sybase查询:列名无效,database,sybase,sap-ase,Database,Sybase,Sap Ase,详情: 2个数据库:sybase版本15和sybase版本16 每个表1个(相同):具有列id、rolename和说明的AuthRole 尝试了jTDS和jconn驱动程序 查询: SELECT t1.roleName FROM AuthRole t1; 结果: Sybase 15:已成功返回行。'roleName'可以是大写、小写或大小写混合,即不区分大小写 Sybase 16:列名无效“roleName”。它只适用于“rolename”,这正是该列的情况。有人知道为什么会发生这种情况

详情:

  • 2个数据库:sybase版本15和sybase版本16
  • 每个表1个(相同):具有列id、rolename和说明的AuthRole
  • 尝试了jTDS和jconn驱动程序
查询:

SELECT t1.roleName FROM AuthRole t1;
结果:

  • Sybase 15:已成功返回行。'roleName'可以是大写、小写或大小写混合,即不区分大小写
  • Sybase 16:列名无效“roleName”。它只适用于“rolename”,这正是该列的情况。有人知道为什么会发生这种情况以及如何解决吗

    • 听起来像是排序顺序的问题,例如:

      • ASE 15配置了不区分大小写的排序顺序
      • ASE 16配置了区分大小写的排序顺序
      您应该能够通过运行
      sp\u helpsort
      来确认上述内容

      在ASE中,区分大小写适用于数据和标识符(例如表/列名)

      要使ASE16像ASE15一样工作,DBA需要更改ASE16数据服务器中的排序顺序(我建议他们在处理字符集时也要验证字符集)


      请记住,更改排序顺序(和/或字符集)是数据服务器范围的配置,需要(至少)重新生成所有索引并重新运行
      更新索引统计信息
      。[有关更多信息,DBA应参考ASE
      系统管理指南
      配置字符集、排序顺序和语言章节

      在较旧版本的Sybase ASE中,您必须在服务器安装时仔细设置区分大小写。安装程序默认为区分大小写。也许安装ASE15的管理员注意到了这一点(并将默认值更改为不区分大小写),而安装ASE16的管理员没有注意到

      是的,区分大小写是服务器的一个属性。您可以稍后使用
      sp_configure
      或ALTER DATABASE更改它,或者两者都更改(我不记得了,也没有时间查找它)。您还可以使用图形化管理工具更改服务器默认排序顺序

      在任何情况下,只有在配置更改之后创建的数据库才会受到影响。令人困惑的是,较旧的数据库仍将区分大小写,或者会发出大量警告。这是因为在旧表中,所有主键(PK)都实现为索引(假定区分大小写),安装程序或配置向导无法更改PK和PK索引。 事实上,您必须删除并重新创建索引,然后运行
      dbcc something
      (我也不记得了)

      对于小型数据库,这种索引的删除和重新创建当然可以完成(使用脚本或数据库重新工程工具来完成)。对于较大的数据库,这可能需要一些时间


      ASE16可能有所不同-如果ASE15上的两个查询都使用“rolename”和“rolename”,请检查文档站

      ,这意味着此数据库中的排序顺序不区分大小写

      如果ASE 16上的“rolename”与“rolename”不同,则表示此数据库中的排序顺序区分大小写

      您可以通过查询来检查:

      if "a" = "A" print "Case insensitive" else print "Case sensitive" 
      
      此设置对于整个服务器(以及服务器包含的所有数据库)是静态设置,但可以更改。当然,更改排序顺序是一个耗时的过程,因为它需要根据字符类型重建所有索引

      您可以检查服务器排序器设置:

      exec sp_configure 'sortorder id'
      
      数据库服务器启动时,有关排序顺序的信息应在ASE错误日志中可见:

      00:0002:00000:00002:2017/07/04 16:49:26.35 server  ASE's default unicode sort order is 'binary'.
      00:0002:00000:00002:2017/07/04 16:49:26.35 server  ASE's default sort order is:
      00:0002:00000:00002:2017/07/04 16:49:26.35 server   'bin_iso_1' (ID = 50)
      00:0002:00000:00002:2017/07/04 16:49:26.35 server  on top of default character set:
      00:0002:00000:00002:2017/07/04 16:49:26.35 server   'iso_1' (ID = 1).
      
      在我的示例中,排序顺序是二进制的,区分大小写

      有关如何更改服务器排序顺序的信息,请参阅。基本上要更改排序顺序,您需要:

      • 使用charset程序添加新的排序顺序
      • 更改配置参数“sortorder id”
      • 重新启动ASE服务器(服务器引导、重建磁盘设备,然后关闭)
      • 重新启动ASE服务器
      • 基于字符类型生成的索引被标记为无效,需要重新生成