TSQL中的Null Character文字是什么?

t3r*_*rse 20 sql t-sql sql-server

我想知道NQL字符的文字(例如'\ 0')在TSQL中是什么.

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

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

select REPLACE(field_with_nullchar, char(0), ',') from FOO where BAR = 20
Run Code Online (Sandbox Code Playgroud)

Ale*_*lex 17

Cade Roux的答案中有两种不同的行为:替换成功(使用SQL排序规则时)并且不成功(使用Windows排序规则).原因在于使用的整理类型.

这种行为是在近4年前提交给微软的:

问:尝试使用replace()替换NUL字符时,这有效的值是SQL排序规则,但不是Windows排序规则.

答:这是因为0x0000是Windows排序规则中未定义的字符.在比较,排序和模式匹配期间,将忽略所有未定义的字符.因此,搜索'a'+ char(0)实际上是在搜索'a',而搜索char(0)相当于空字符串.

处理未定义字符的方法有点令人困惑,但这是Windows定义的排序方式,而SQL Server符合常规Windows API.

在SQL排序规则中,没有未定义字符的概念.每个代码点都分配一个权重,这就是我们没有看到问题的原因.

但不幸的是,它仍然没有记录.

因此,似乎唯一的解决方案是将排序规则更改为SQL排序规则(例如SQL_Latin1_General_CP1_CI_AS也可以使用).

*我删除了以前的答案,因为没必要

  • 究竟.他嵌入了字符串终止符(C语义中的​​NULL,而不是SQL),并希望修复它们. (5认同)

Cad*_*oux 10

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

SELECT  REPLACE(bad, CHAR(0), ' ')
FROM    (
         SELECT 'a' + CHAR(0) + 'b' AS bad
        ) AS X
Run Code Online (Sandbox Code Playgroud)

看起来它也依赖于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
Run Code Online (Sandbox Code Playgroud)

按预期工作,与以下相比:

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