0

我的 SQL 表中有一些行包含单字节空格字符,有些行包含双字节空格字符。我需要用双字节字符识别行以在用户界面中修复它们。

我的第一个想法是使用charindex并将substring空间与文本的其余部分隔离(SUBSTRING(@SomeField, charindex(' ', @SomeField),1)),然后使用DataLength它来查看它是双字节还是单字节,但似乎这不起作用。看来它为单字节和双字节空间提供了相同的值。

SELECT  DATALENGTH(' ') --double byte space
, DATALENGTH(' ') --single byte space
, LEN(' ') --double byte space
, LEN(' ') --single byte space
4

1 回答 1

0

那个字符 U+3000 或者select cast(0x0030 as nchar(1))显然被称为“表意空间”。

在代码中使用它时,您只需要使用 unicode 文字。两者都like工作charindex正常。但由于它在语义上只是一个空格,因此大多数排序规则不会区分 U+0020(常规空格)和 U+3000。因此,您还需要使用二进制排序规则(或将您的数据库或列设置为使用一个)。例如

select 1 where N'原田 潮' like N'% %' collate SQL_Latin1_General_CP437_BIN2

select charindex(N' ' collate SQL_Latin1_General_CP437_BIN2, N'原田 潮') 


select 1 where N'原田 潮' like N'% %' collate SQL_Latin1_General_CP437_BIN2

select charindex(N' ' collate SQL_Latin1_General_CP437_BIN2 , N'原田 潮')

输出

-----------
1


-----------
3


-----------


-----------
0
于 2019-08-30T20:44:01.343 回答