我想知道Null character(例如'\ 0')的文字在TSQL中是什么。
注意:不是NULL字段值,而是空字符(see link)。
我有一个混合了典型字符和空字符的列。我正在尝试用不同的值替换空字符。我原以为以下方法可行,但不成功:
select REPLACE(field_with_nullchar, char(0), ',') from FOO where BAR = 20
答案 0 :(得分:16)
Cade Roux's answer中有两种不同的行为:替换成功(使用SQL排序规则时)并且不成功(使用Windows排序规则)。原因在于使用的整理类型。
近四年前,微软的这种行为是submitted:
问:尝试更换NUL字符时 使用replace(),这是有效的 value有一个SQL排序规则,但不是 Windows排序规则。
A:这是因为0x0000 是Windows中未定义的字符 排序规则。所有未定义的字符 在比较期间被忽略,排序, 和模式匹配。如此灼热 'a'+ char(0)正在寻找 'a',搜索char(0)是 相当于空字符串。
处理未定义字符的方法 有点混乱,但这是 Windows定义的排序方式, 和SQL Server符合 一般的Windows API。
在SQL排序规则中,没有概念 未定义的字符。每个代码 点被赋予权重,这就是原因 我们没有看到问题。
但不幸的是,它仍然没有记录。
因此,似乎唯一的解决方案是将排序规则更改为SQL排序规则(例如,也可以使用SQL_Latin1_General_CP1_CI_AS
)。
* 我删除了以前的答案
答案 1 :(得分:9)
看起来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
答案 2 :(得分:2)
VARBINARY
强制转换应适用于任何归类
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
答案 3 :(得分:0)
你确定他们是空字符吗?你是怎么把它们带到那里的?
看起来SQL Server将它们视为字符串终止符。这个查询:
select 'aaa' + char(0) + 'bbb'
为我返回aaa
(在SQL Server 2008上)。
编辑:以上是错误的 - 只是结果网格以这种方式对待他们。它们以文本模式显示。
答案 4 :(得分:0)
我刚刚在我的服务器上运行了下面的测试(2008)并且它成功了。它可能与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"
答案 5 :(得分:0)
我遇到了同样的问题,并使用nullif
为我解决了这个问题。
Select nullif(field_with_nullchar,'') from FOO where BAR = 20