【问题标题】:Why is there no NVarCiChar field type in ADS?为什么 ADS 中没有 NVarCiChar 字段类型?
【发布时间】:2012-09-28 11:34:10
【问题描述】:

我想知道为什么 ADS 中没有不区分大小写的 Unicode 字符字段类型?

虽然您可以将 NVarChar 字段的索引排序规则设置为不区分大小写,但使用 WHERE field = 'HeLlO WoRlD' 的简单查询找不到值 'Hello World'

我知道WHERE field = 'HeLlO WoRlD' COLLATE ads_default_ci 有效,但不能对每一次比较都这样做。

CiChar 字段类型不支持 Unicode(除非您在其中存储 UTF-8 字符串会导致其他问题)。

【问题讨论】:

    标签: advantage-database-server


    【解决方案1】:

    从根本上说,与常规字符字段不同,Unicode 可以存储来自所有语言的字符,因此没有与之关联的特定排序规则/语言。排序规则来自于它的使用、索引或排序方式。如果要定义 NVarCiChar 字段,则需要将语言/区域设置(英语与法语或德语区分大小写)与此类字段类型相关联,这会给系统带来不必要的复杂性(当英语 ci field 是与德语 ci 字段进行比较)。

    虽然 ciChar 类型在某些方面更容易使用,但它也有缺点。主要是它不是标准的,因此它不能移植到其他数据库,并且需要在代码中进行一些特殊处理。它不太灵活。尝试将 ciChar 字段与常规 char 字段进行比较时会导致问题——这种比较需要 COLLATE 子句。由于相对标准的使用 COLLATE 子句的方式支持不区分大小写的比较,以更清晰的方式同时更灵活,我们决定不区分大小写的 Unicode 字段是不必要的。通过为 SQL 语句句柄指定不区分大小写的 Unicode 排序规则来避免使用多个 COLLATE 子句,也很容易对 Unicode 字符串进行不区分大小写的比较。

    【讨论】:

    • 好的,但是如何使用 Delphi 或 ARC32 指定 case insensitive Unicode collation for the SQL statement handle?我想避免到处写 COLLATE。
    • 在 ARC 中,右键单击连接,选择连接属性,单击“排序规则”旁边的展开按钮,选择适当的 Unicode 区域设置并选中“Unicode 不区分大小写搜索”复选框。排序规则应该说类似“ansi:en_us_ads_ci”的内容。 _ads_ci 后缀表示不区分大小写的排序规则。
    • 在 Delphi 中,您可以在连接级别或语句级别控制排序规则。要设置每个语句句柄排序规则,请使用 TAdsQuery.AdsTableOptions.AdsCollat​​ion 属性。我只是注意到它没有记录在我们的帮助文件中。它是“AnsiCollat​​ion:UnicodeCollat​​ion”格式的字符串属性。您可以使用上面的示例。一般用法在这个link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多