我的数据库背景位于MS SQL Server端,其中索引和约束中的文本比较不区分大小写(至少在默认情况下)。因此,一旦将值“abc”分配给唯一列,就不能存储第二个值“ABC”,如果搜索“ABC”,SQL Server将找到“abc”。
对于Oracle,情况有所不同,所以即使文本列上有唯一索引,您也可以存储“abc”和“ABC”,如果搜索“AbC”,则不会得到任何结果。
在Oracle 10gR2之前的AFAIK没有办法绕过它,现在可以设置不敏感的比较,因为一切都取决于程序员的纪律,因此恕我直言不是一个好的解决方案。但是,区分大小写的查找最糟糕的是,那些将所有搜索重写为UPPER(some_column)=UPPER(some_text)
(这是许多讨论主题推荐的内容)的人即使在some_column上有索引时也会以表扫描结束。性能含义是不稳定的:我刚刚在一个有50万行的表上测试了一个简单的搜索,并且使用UPPER函数调用的搜索比仅使用列标识符的搜索花费了20倍,从而确认在执行函数时不使用索引基于搜索。
在Oracle数据库中进行不区分大小写搜索的最标准技术是否真的如此应用UPPER / LOWER函数来搜索元素,尽管性能不佳?还是有更优雅的方法来解决这个问题?
答案 0 :(得分:7)
是的,使用UPPER(some_column)=UPPER(some_text)
确实是最好的方法,但您可以在UPPER(some_column)
上创建索引。这应该可以缓解这个问题。
答案 1 :(得分:0)
我会说根据贵公司的业务逻辑创建“干净”字段来清理这些字段(例如,公司名称或地址,将围绕家具词,usps规则等提供令人惊讶的清洁逻辑,而不是提到第三方清洁程序(如果使用的话)。
因此,对于重要的搜索字段,请同时保留原始(不干净)和干净的版本。如果您的清洁逻辑随时间发生显着变化,您可以根据原始值返回并重新清除。您的搜索(假设您没有使用像Oracle Text或Lucene这样的模糊逻辑引擎)会达到干净的值。
对于所有其他字段(不值得单独的清洁版本),我通常执行最低级别的清理。大写,修剪,条带控制字符,将多个空格减少到1个空间等都是一组基本清洁程序的一部分。这些通常在加载数据之前完成(在数据构建程序中)。
所以,提出一套数据标准并坚持下去,但我不会在数据库中抛出任何垃圾。尽量不要将数据库视为数据的倾销场,并且肯定会得到更好的结果。