我正在实现一个数据库,其中几个表具有字符串数据作为候选键(例如:用户名),并将相应索引。对于这些领域我想:通过存储原始字符串大小写和小写字母来绕过数据库区分大小写问题是疯狂的吗?
不区分大小写时有人询问在琴键上表
最初写的情况下以某种方式保存下来,以便应用程序能与原来的显示数据给用户情况下所使用
我也想的数据库架构象数据库独立地,由于应用程序代码(或不应该是)不从动于一个特定的RDBMS。
另外值得注意的是绝大多数在数据库上完成的查询都是由应用程序代码完成的,而不是通过客户端的直接表访问。
在实现这个过程中,我遇到了很多恼人的问题。一个是,并不是所有的RDBMS都以相同的方式实现COLLATE(这是敏感度在架构层次上似乎可调的地方)。另一个问题是排序规则和区分大小写选项可以设置在多个级别(服务器,数据库,表(?),列),我不能保证应用程序会得到什么设置。还有一个问题是,COLLATE本身可能会变得毛茸茸的,因为在那里存在比简单区分大小写更多的事情(例如:unicode选项)。
为了避免所有这些令人头痛的问题,我正在考虑通过为一个数据存储两列来完全避免这个问题。一列与原始案例,另一列由应用层下降到小写。
例如:在表中的字段中的两个
user_name = "fredflintstone" (a unique index on this one) orig_name = "FredFlintstone" (just data... no constraints)
的优点和这个缺点,我看到它是:
优点:
没有歧义 - 应用程序代码将管理大小写转换,并且当底层RDBMS /设置更改时,我从不需要担心单元测试“神秘地”失败。该指数
搜索将是干净,从来没有整理的功能减慢或调用,以降低()或任何(假设这样的事情慢下来的指数,这似乎是合乎逻辑的)
缺点:在加倍后的行动数据所需
额外的存储空间
这似乎有点残酷
我知道它会工作,但同时它闻起来不对。
这样做是疯了/毫无意义吗?有什么我不知道的,这使得大小写敏感问题比我目前看起来那么棘手?
你想复制数据?坏... – 2010-10-25 16:26:55
在'LOWER'上面选择'UPPER',因为在执行'LOWER'时某些字符不能往返于某些地区http://msdn.microsoft.com/en-us/library/bb386042.aspx – bdukes 2010-10-25 16:30:24
@bdukes - 哇... thx。我不知道。 – Russ 2010-10-25 16:35:06