SQL中的Null Character文字是什么?

时间:2010-05-13 16:05:39

标签: sql sql-server tsql

我想知道Null character(例如'\ 0')的文字在TSQL中是什么。

注意:不是NULL字段值,而是空字符(see link)。

我有一个混合了典型字符和空字符的列。我正在尝试用不同的值替换空字符。我原以为以下方法可行,但不成功:

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

6 个答案:

答案 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