什么是TSQL中的空字符文字?

我想知道什么字符为空字符 (例如'\ 0')在TSQL中。

注意:不是NULL字段值,而是空字符( 请参阅链接 )。

我有一个混合了典型和空字符的列。 我试图用不同的值replace空字符。 我会认为,以下将工作,但它是不成功的:

select REPLACE(field_with_nullchar, char(0), ',') from FOO where BAR = 20 

Cade Roux的答案有两种不同的行为:replace成功(使用SQLsorting规则时)和不成功(使用Windowssorting规则)。 原因在于使用的sortingtypes。

这种行为在4年前已经提交给微软:

问:尝试使用replace()replaceNUL字符时,此方法的工作原理是该值具有SQLsorting规则,但不是Windowssorting规则。

答:这是由于Windows归类中0x0000是一个未定义的字符。 在比较,sorting和模式匹配过程中,所有未定义的字符都将被忽略。 所以,查找'a'+ char(0)确实在search'a',而searchchar(0)就等于空string。

处理未定义字符的方式有点令人困惑,但是这是Windows定义的对它们进行sorting的方式,SQL Server符合一般的Windows API。

在SQL整理中,没有未定义字符的概念。 每个代码点都被分配一个权重,这就是为什么我们没有看到问题。

但不幸的是,它仍然是无证的。

所以,似乎唯一的解决scheme是将sortingSQL_Latin1_General_CP1_CI_AS更改为SQLsortingSQL_Latin1_General_CP1_CI_AS (例如,也可以使用SQL_Latin1_General_CP1_CI_AS )。

*我删除了我以前的答案是不必要的

看起来像C风格的终结者也是SQL中的终结者:

 SELECT REPLACE(bad, CHAR(0), ' ') FROM ( SELECT 'a' + CHAR(0) + 'b' AS bad ) AS X 

看起来这也取决于COLLATION:

 SELECT REPLACE(CAST(bad COLLATE SQL_Latin1_General_CP1_CI_AS AS varchar(10)), CHAR(0), ' ') FROM ( SELECT 'a' + CHAR(0) + 'b' AS bad ) AS X 

按预期工作,相比之下:

 SELECT REPLACE(CAST(bad COLLATE Latin1_General_CI_AS AS varchar(10)), CHAR(0), ' ') FROM ( SELECT 'a' + CHAR(0) + 'b' AS bad ) AS X 

我刚刚在我的服务器(2008)上运行了下面的testing,结果很成功。 这可能与ANSI设置有关。 我会尝试翻转一些设置,看看我能否重现你的问题。

 DECLARE @test_null_char VARCHAR(20) SET @test_null_char = 'aaa' + CHAR(0) + 'bbb' SELECT @test_null_char -- Returns "aaa bbb" SET @test_null_char = REPLACE(@test_null_char, CHAR(0), 'ccc') SELECT @test_null_char -- Returns "aaacccbbb" 

你确定他们是空字符? 你是怎么把他们弄到那里的?

它看起来像SQL Server将它们视为string终止符。 这个查询:

 select 'aaa' + char(0) + 'bbb' 

为我返回aaa (在SQL Server 2008上)。

编辑:上面是错误的 – 这只是结果网格,对待他们的方式。 他们以文本模式显示。

VARBINARY应该与任何sorting规则一起工作

 SELECT REPLACE(CAST(CAST(fld AS VARCHAR(5)) AS VARBINARY(5)), 0x0, ',') FROM (SELECT 'QQ' + CHAR(0) + 'WW' COLLATE Latin1_General_CI_AS AS fld) AS T SELECT REPLACE(CAST(CAST(fld AS VARCHAR(5)) AS VARBINARY(5)), 0x0, ',') FROM (SELECT 'QQ' + CHAR(0) + 'WW' COLLATE SQL_Latin1_General_CP1_CI_AS AS fld) AS T >>QQ,WW >>QQ,WW 

我有同样的问题,并使用nullif解决了我。

 Select nullif(field_with_nullchar,'') from FOO where BAR = 20