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也可以使用).
*我删除了以前的答案,因为没必要
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)