0
Select Name from tblAnimal where Id=1

回报:我的宠物

Select Id from tblAnimal where Name='My Pet'  --I copy/pasted this value in SSMS!

返回空变更集(为什么?)

经过一番研究,我发现它可以是 Char(10) 和 Char(13)。所以,我想,当我复制粘贴 My Pet 时,它会自动将 Char(10) 转换为 Windows 环境下的 Space?

因为这:

Select id from tblAnimal where Name like '%My%'  

返回 1 而

select id from Animal where Name like '%My %'  

什么都不返回。

问题。
1. 为什么会这样?
2.如何解决这个问题(生产数据库,几百万条记录)
3.如何防止这种情况发生?

4

2 回答 2

6

要清理数据,请将 CR/LF 对替换为空格:

UPDATE dbo.table
  SET column = REPLACE(REPLACE(column, CHAR(10), ''), CHAR(13), ' ')
  WHERE CHARINDEX(CHAR(10), column) + CHARINDEX(CHAR(13), column) > 0;

并且首先要解决有关阻止这些数据的问题,您当然可以阻止它,这就是应该开始预防的地方 - 尽可能接近数据,因为您对所有外部方式的控制较少人们可以把垃圾塞进你的桌子。假设您已经有一张桌子:

CREATE TABLE dbo.blat(col VARCHAR(32));

添加约束很简单:

ALTER TABLE dbo.blat ADD CONSTRAINT ck_col_NoCRLF
  CHECK(CHARINDEX(CHAR(10), col) + CHARINDEX(CHAR(13), col) = 0);

现在:

INSERT dbo.blat(col) SELECT NULL;

作品。

INSERT dbo.blat(col) SELECT 'howdy';

作品。

INSERT dbo.blat(col) SELECT 'howdy
    partner';

失败:

消息 547,级别 16,状态 0,第 1 行
INSERT 语句与 CHECK 约束“ck_col_NoCRLF”冲突。冲突发生在数据库“test”、表“dbo.blat”、列“col”中。
该语句已终止。

您还可以考虑添加各种其他特殊字符 - CHAR(9)( tab) 也是一种常见的字符。

于 2013-01-24T22:53:24.243 回答
1

char 10 和 char 13 是换行符和回车符——它们不是空格,即使它们在网格结果中显示为这样。如果您在 SSMS 中查看结果,最好告诉它以文本形式查看您的结果(ctrl+T,或在您的工具栏上)。如果你这样做,你会看到结果是否真的是:

My Pet

或者

My
Pet

网格的结果将显示为My Pet一行,因为这就是网格的工作方式。结果文本将显示新行,即使是单个记录,因此您会更好地查看表中的确切数据。

于 2013-01-24T21:29:38.047 回答