在 SQL table 中查找双字节空格
Finding double-byte white spaces in SQL table
我的 SQL table 中有些行包含单字节 space 字符,有些行包含双字节 space 字符。我需要识别具有双字节字符的行以在用户界面中修复它们。
我的第一个想法是使用 charindex
和 substring
将 space 与文本的其余部分隔离开来 (SUBSTRING(@SomeField, charindex(' ', @SomeField),1))
然后使用 DataLength
来查看它是双字节还是单字节,但它似乎不起作用。它似乎为单字节和双字节 spaces 提供了相同的值。
SELECT DATALENGTH(' ') --double byte space
, DATALENGTH(' ') --single byte space
, LEN(' ') --double byte space
, LEN(' ') --single byte space
字符 U+3000 或 select cast(0x0030 as nchar(1))
显然称为 "Ideographic Space"。
在代码中使用它时,您只需要使用 unicode 文字即可。 like
和 charindex
都可以正常工作。但由于它在语义上只是一个 space,大多数排序规则不会区分 U+0020(常规 space)和 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
我的 SQL table 中有些行包含单字节 space 字符,有些行包含双字节 space 字符。我需要识别具有双字节字符的行以在用户界面中修复它们。
我的第一个想法是使用 charindex
和 substring
将 space 与文本的其余部分隔离开来 (SUBSTRING(@SomeField, charindex(' ', @SomeField),1))
然后使用 DataLength
来查看它是双字节还是单字节,但它似乎不起作用。它似乎为单字节和双字节 spaces 提供了相同的值。
SELECT DATALENGTH(' ') --double byte space
, DATALENGTH(' ') --single byte space
, LEN(' ') --double byte space
, LEN(' ') --single byte space
字符 U+3000 或 select cast(0x0030 as nchar(1))
显然称为 "Ideographic Space"。
在代码中使用它时,您只需要使用 unicode 文字即可。 like
和 charindex
都可以正常工作。但由于它在语义上只是一个 space,大多数排序规则不会区分 U+0020(常规 space)和 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