什么是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