【问题标题】:Varchar with trailing spaces as a Primary Key in SQL Server 2008带有尾随空格作为 SQL Server 2008 中的主键的 Varchar
【发布时间】:2010-12-31 02:06:44
【问题描述】:

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

问候

【问题讨论】:

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


    【解决方案1】:

    SQL-92 标准规定,出于字符串比较的目的,字符串在比较之前被填充为相同的长度:通常填充字符是一个空格。

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

    我找不到任何迹象表明这种行为自那以后发生了变化。

    您可以使用 varbinary 而不是 varchar 侥幸逃脱,但这也可能无法满足您的要求。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • text 和 ntext 已被弃用,如果您不提供它们,char 将用空格填充。
      • textntext 可能已被弃用,但有一次导入临时表我看不出问题。
      • 到 char,'a' 和 'a' 都将填充到 'a'。对于 varchar,它们都被更改为 'a'
      • 哦,text 和 ntext 不可索引,因此不能用作主键。
      • 我遇到了类似的问题,使用ntext作为加载目标,然后将列类型更改为nvarchar。似乎 MSSQL 2014 允许文本数据类型作为主键。
      【解决方案3】:

      使用不去除尾随空格的数据类型。

      【讨论】:

      • 比如什么?以及将内容视为字符串而不是不透明的二进制数据的任何此类数据类型?
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        我认为这可能与 ANSI_PADDING 有关:但我在此处的测试表明,对于 PK(也可能是 UNIQUE INDEXES,未尝试过),不幸的是,这仍然无济于事。

        所以:

        SET ANSI_PADDING ON
        

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

        见:

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

        【讨论】:

        • 谢谢我看到了,我不知道是否有一个选项形式改变方式(是否有尾随)sql server比较唯一键......
        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-02
          • 1970-01-01
          • 1970-01-01
          • 2010-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多