镜头功能:Unicode字符计为2

时间:2019-04-29 04:48:40

标签: sql-server tsql unicode

请为我解释为什么下面的字符串的长度是9而不是8?

DECLARE @nstring NVARCHAR(100)

SET @nstring =N'Không có'

Print len(@nstring) -- 9 

SET @nstring =N'Không co'

Print len(@nstring) -- 8 

2 个答案:

答案 0 :(得分:2)

对于某些字符,有几种方法可以将它们编码为Unicode。
在这种情况下,“ó”可以是U + 00F3(一个16位值)或U + 006F U + 0301(两个16位值)。这些形式在规范上是等效的。

如果您想阅读更多,请使用Microsoft的Using Unicode Normalization to Represent Strings

不幸的是,在T-SQL中无法将字符串从一种形式转换为另一种形式。另请参阅类似Normalize unicode string in SQL Server?

的问题

但是好消息是,因为它们在规范上是等效的,所以它们在T-SQL中进行了比较(您可以编写N'Không có'=N'Không có'并且结果为true),所以这并不是您认为的那么大的问题首先。

答案 1 :(得分:1)

您的最后一个字符为两个

DECLARE @nstring NVARCHAR(100)
SET @nstring =N'Không có'

print unicode(substring(@nstring,8,1))
print ascii(substring(@nstring,8,1))

print unicode(substring(@nstring,9,1))
print ascii(substring(@nstring,9,1))

结果显示在下图中。

enter image description here