带有尾随空格的Varchar作为SQL Server 2008中的主键

时间:2009-12-30 11:43:41

标签: sql-server sql-server-2008 primary-key unique-constraint unique-key

是否可以将varchar列作为主键,其值为'a'和'a',在MS SQL Server 2008中始终会出现此错误“违反PRIMARY KEY约束”。 在Oracle中不要给出任何错误。 顺便说一句我没有这样实现我只是试图将数据从oracle迁移到sql server。

此致

6 个答案:

答案 0 :(得分:4)

SQL-92标准规定,为了进行字符串比较,在比较之前将字符串填充为相同的长度:通常填充字符是空格。

因此'a'和'a'比较EQUAL,这违反了PK约束。 http://support.microsoft.com/kb/316626

我找不到任何迹象表明此行为已经发生变化。

你可能会使用varbinary而不是varchar,但这可能无法做到你想要的。

答案 1 :(得分:1)

您可以使用textntext列,其中一列取决于您要导入的数据类型及其长度 - 这将保留空格。 char将填充空格,因此可能不合适。

答案 2 :(得分:0)

使用不剥离尾随空格的数据类型。

答案 3 :(得分:0)

您可以尝试存储为varbinary,然后在选择时转换为varchar。

答案 4 :(得分:0)

我认为这可能与ANSI_PADDING有关:但我在这里的测试表明,对于PKs(可能还有UNIQUE INDEXES,未尝试过),这仍然无济于事。

所以:

SET ANSI_PADDING ON

适用于非PK字段 - 也就是说,它会保留插入的尾随空格,但由于某些原因不在PK上...

见:

http://support.microsoft.com/kb/154886/EN-US/

答案 5 :(得分:0)

您可以在主键约束中添加另一列,该约束保存oracle列中数据的长度。这将允许您在需要时导入数据并重建oracle数据 - 使用oracle数据的长度以及microsoft表中的长度来添加缺少的空间以便在报告中显示等。