2012-09-28 47 views
1

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

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

我知道WHERE field = 'HeLlO WoRlD' COLLATE ads_default_ci的作品,但这样做每一个比较不是一种选择。

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

回答

2

基本上,与常规字符字段不同,Unicode可以存储来自所有语言的字符,因此不存在与其关联的特定归类/语言。排序规则来自于如何使用,索引或排序。如果要定义一个NVarCiChar字段,语言/语言环境(英语与法语或德语的区分大小写不同)需要与此类字段类型相关联,并且会给系统带来不必要的复杂性(英语ci时该怎么办领域是与德国ci领域比较)。

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

+0

好的,但我怎样才能指定一个'使用Delphi或ARC32的SQL语句句柄'不区分大小写的Unicode排序?我想避免在任何地方写COLLATE。 –

+0

在ARC中,右键单击连接,选择连接属性,单击“整理”旁边的展开按钮,选择适当的Unicode区域设置并选中“Unicode区分不敏感搜索”复选框。整理应该说类似“ansi:en_us_ads_ci”。 _ads_ci后期修复意味着不区分大小写的排序规则。 –

+0

在Delphi中,您可以控制连接级别或语句级别的排序规则。要设置per语句句柄归类,请使用TAdsQuery.AdsTableOptions.AdsCollat​​ion属性。我只注意到它没有记录在我们的帮助文件中。它是“AnsiCollat​​ion:UnicodeCollat​​ion”格式的字符串属性。你可以使用上面的例子。一般用法在这[链接](http://devzone.advantagedatabase.com/dz/webhelp/Advantage11/master_collat​​ion_support.htm) –

相关问题