区分大小写的 sybase 查询:无效的列名
Case sensitive sybase query: Invalid column name
详情:
- 2 个数据库:sybase 版本 15 和 sybase 版本 16
- 1 table 每个(相同):具有列 id、rolename 和 description
的 AuthRole
- 尝试了 jTDS 和 jconn 驱动程序
查询:
SELECT t1.roleName FROM AuthRole t1;
结果:
- Sybase 15:成功返回行。 'roleName' 可以是大写、小写或混合大小写,即不区分大小写
- Sybase 16:无效列名 'roleName'。它只适用于 'rolename' ,这是该列的确切情况。任何人都知道为什么会发生这种情况以及如何解决它?
听起来像是排序顺序的问题,例如:
- ASE 15 配置了不区分大小写的排序顺序
- ASE 16 配置了区分大小写的排序顺序
你应该可以通过运行 sp_helpsort
确认以上内容。
在 ASE 中,区分大小写适用于数据和标识符(例如,table/column 名称)。
要使 ASE 16 像 ASE 15 一样运行,DBA 需要更改 ASE 16 数据服务器中的排序顺序(我建议他们在使用时也验证字符集)。
请记住,更改排序顺序(and/or 字符集)是一个数据服务器范围的配置,需要(至少)重建所有索引并重新 运行 update index statistics
。 [有关 DBA 的更多信息,请参阅 ASE System Administration Guide
,关于 Configuring Character Sets, Sort Orders and Languages
的章节。]
超出我的想象:
在旧版本的 Sybase ASE 中,您必须在服务器安装时仔细设置区分大小写。安装程序默认区分大小写。也许安装 ASE15 的管理员注意到了这一点(并将默认设置更改为不区分大小写),而安装 ASE16 的管理员却没有。
是的,区分大小写是服务器的属性。您可以稍后使用 sp_configure
或 ALTER DATABASE 或两者进行更改(我不记得了,也没有时间查找)。您还可以使用图形管理工具更改服务器默认排序顺序。
在任何情况下,只有在 配置更改之后 创建的数据库才会受到影响。令人困惑的是,旧的数据库仍然区分大小写,或者会发出很多警告。这是因为在您的旧表中,所有主键 (PK) 都作为索引实现,假设区分大小写,并且 PK 和 PK 索引不能被安装程序或配置向导更改。
事实上,您必须删除并重新创建索引和 运行 dbcc something
(我又不记得了)。
对于小型数据库,这种索引的删除和重新创建当然可以完成(使用脚本或数据库重新设计工具来完成)。对于较大的数据库,这可能需要一些时间。
可能 ASE16 不同-检查文档
如果在 ASE 15 上两个查询都有效 - 使用 "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).
在我的示例中,排序顺序是二进制的 - 区分大小写。
有关如何更改服务器排序顺序的信息在 ASE manual 中。基本上更改您需要的排序顺序:
- 使用字符集程序添加新的排序顺序,
- 更改配置参数'sortorder id'
- 重新启动 ASE 服务器(服务器启动,重建磁盘设备,然后关闭)
- 再次重启 ASE 服务器
- 基于字符类型构建的索引被标记为无效,需要重建
详情:
- 2 个数据库:sybase 版本 15 和 sybase 版本 16
- 1 table 每个(相同):具有列 id、rolename 和 description 的 AuthRole
- 尝试了 jTDS 和 jconn 驱动程序
查询:
SELECT t1.roleName FROM AuthRole t1;
结果:
- Sybase 15:成功返回行。 'roleName' 可以是大写、小写或混合大小写,即不区分大小写
- Sybase 16:无效列名 'roleName'。它只适用于 'rolename' ,这是该列的确切情况。任何人都知道为什么会发生这种情况以及如何解决它?
听起来像是排序顺序的问题,例如:
- ASE 15 配置了不区分大小写的排序顺序
- ASE 16 配置了区分大小写的排序顺序
你应该可以通过运行 sp_helpsort
确认以上内容。
在 ASE 中,区分大小写适用于数据和标识符(例如,table/column 名称)。
要使 ASE 16 像 ASE 15 一样运行,DBA 需要更改 ASE 16 数据服务器中的排序顺序(我建议他们在使用时也验证字符集)。
请记住,更改排序顺序(and/or 字符集)是一个数据服务器范围的配置,需要(至少)重建所有索引并重新 运行 update index statistics
。 [有关 DBA 的更多信息,请参阅 ASE System Administration Guide
,关于 Configuring Character Sets, Sort Orders and Languages
的章节。]
超出我的想象:
在旧版本的 Sybase ASE 中,您必须在服务器安装时仔细设置区分大小写。安装程序默认区分大小写。也许安装 ASE15 的管理员注意到了这一点(并将默认设置更改为不区分大小写),而安装 ASE16 的管理员却没有。
是的,区分大小写是服务器的属性。您可以稍后使用 sp_configure
或 ALTER DATABASE 或两者进行更改(我不记得了,也没有时间查找)。您还可以使用图形管理工具更改服务器默认排序顺序。
在任何情况下,只有在 配置更改之后 创建的数据库才会受到影响。令人困惑的是,旧的数据库仍然区分大小写,或者会发出很多警告。这是因为在您的旧表中,所有主键 (PK) 都作为索引实现,假设区分大小写,并且 PK 和 PK 索引不能被安装程序或配置向导更改。
事实上,您必须删除并重新创建索引和 运行 dbcc something
(我又不记得了)。
对于小型数据库,这种索引的删除和重新创建当然可以完成(使用脚本或数据库重新设计工具来完成)。对于较大的数据库,这可能需要一些时间。
可能 ASE16 不同-检查文档
如果在 ASE 15 上两个查询都有效 - 使用 "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).
在我的示例中,排序顺序是二进制的 - 区分大小写。
有关如何更改服务器排序顺序的信息在 ASE manual 中。基本上更改您需要的排序顺序:
- 使用字符集程序添加新的排序顺序,
- 更改配置参数'sortorder id'
- 重新启动 ASE 服务器(服务器启动,重建磁盘设备,然后关闭)
- 再次重启 ASE 服务器
- 基于字符类型构建的索引被标记为无效,需要重建