Функция Len: символ Юникода считается за 2 - PullRequest
0 голосов
/ 29 апреля 2019

Пожалуйста, объясните мне, почему длина строки ниже 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 ]

2 голосов
/ 29 апреля 2019

Для некоторых символов их можно закодировать как Unicode несколькими способами.
В этом случае «-» может быть либо U + 00F3 (одно 16-битное значение), либо U + 006F U + 0301 (два 16-битных значения).Эти формы канонически эквивалентны.

Если вам хочется прочитать немного больше, Использование нормализации Unicode для представления строк от Microsoft.

К сожалению, в T нет никакого способа-SQL для преобразования строки из одной формы в другую.См. Также такие вопросы, как Нормализация строки Юникода в SQL Server?

Но хорошая новость заключается в том, что, поскольку они канонически эквивалентны, они сравнивают то же самое в T-SQL (вы можете написать N'Không có'=N'Không có'и результат верный) так что это не такая большая проблема, как вы можете подумать поначалу.

1 голос
/ 29 апреля 2019

Ваш последний символ считается двумя

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...