我正在使用Microsoft SQL Server 2008 R2(具有最新的Service Pack /修补程序),数据库归类为SQL_Latin1_General_CP1_CI_AS。唯一索引,varchar列和(空格)空格的行为
以下代码:
SET ANSI_PADDING ON;
GO
CREATE TABLE Test (
Code VARCHAR(16) NULL
);
CREATE UNIQUE INDEX UniqueIndex
ON Test(Code);
INSERT INTO Test VALUES ('sample');
INSERT INTO Test VALUES ('sample ');
SELECT '>' + Code + '<' FROM Test WHERE Code = 'sample ';
GO
产生以下结果:
(受影响1行(S))
消息2601,级别14,状态1,行8
不能在具有唯一索引'UniqueIndex'的对象'dbo.Test'中插入重复键行。重复的键值是(样本)。
该声明已终止。
‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐
>样品<
(1行(一个或多个)受影响)
我的问题s是:
- 我假设索引不能存储尾随空格。任何人都可以指出我的官方文件,指定/定义这种行为?
- 是否有一个设置可以改变这种行为,也就是说,使它识别'sample'和'sample'为两个不同的值(顺便说一句),因此两者都可以在索引中。
- 为什么地球上的SELECT返回一行? SQL Server必须对WHERE子句中的空格做一些真正有趣/聪明的事情,因为如果我删除了索引中的唯一性,那么两个INSERT都将运行OK,并且SELECT将返回两行!
任何帮助/指针在正确的方向将不胜感激。谢谢。
感谢您的指针,伙计们。因为我自己对Google太懒惰了。在我看来,标准定义的行为并不直观。我可以想象,10个开发者中有9个会说'a'和'a'不是同一个字符串,但是哦。 – Eric 2012-02-27 17:26:45