2016-12-12 13 views
3

Это чисто теоретический вопрос, чтобы обернуть мою голову вокругКак данные Unicode (UTF-16), которые находятся вне сортировки, хранятся в столбце varchar?

Скажем, у меня есть Unicode циклонного символ (1F300). Если я пытаюсь сохранить его в varchar столбца, по умолчанию Latin1_General_CI_AS сортировки, символ циклона не может не поместиться в один байт, который используется на символ в varchar ...

способов, я могу видеть это сделать:

  1. Как и javascript для символов из базовой плоскости (BMP), где он хранит их как 2 символа (суррогатные пары), а затем требуется дополнительная обработка для put them back together ...
  2. Просто усечь символ, сохранить первый байт и отбросить второй .... (данные - это тост - вы должны были прочитать руководство ....)
  3. Данные уничтожаются, и ничего не используется ... (данные - это тост - вы должны были прочитать руководство ....)
  4. Некоторые другие варианты, которые находятся вне моей умственной способности .....

Я сделал некоторые исследования после вставки несколько различных юникод символов

INSERT INTO [Table] (Field1) 
VALUES ('') 

INSERT INTO [Table] (Field1) 
VALUES ('') 

, а затем читать их как байты SELECT cast (field1 as varbinary(10)) в обоих случаях я получил 0x3F3F.

enter image description here

3F в ascii является ? (question mark) например два вопросительных знака (??), что я вижу, когда делать нормальный select * значит ли это, что данные тосты и даже не первого укуса хранится?

Как данные Unicode, которые не сортируются, хранятся в столбце varchar?

ответ

4

Данные являются тостами и являются именно тем, что вы видите, 2 байта x 0x3F. Это происходит во время преобразования типа перед вставкой и фактически совпадает с cast('' as varbinary(2)), который также является 0xF3F3 (в отличие от литья N'').

Когда данные Unicode должны быть вставлены в столбцы не-Unicode, столбцы внутренне преобразуются из Unicode с использованием API WideCharToMultiByte и кодовой страницы, связанную с сортировкой. Если символ не может быть представлен на данной кодовой странице, символ заменяется вопросительным знаком (?) Ref.

+1

Привет, Алекс, спасибо за ответ. Интересно, почему два '??' вместо 1 '?', Чувствуют себя как оскорбление раны, lol ... –

1

Да данные ушли.

Varchar требует меньше места, по сравнению с NVarchar. Но это сокращение стоит дорого. В Varchar нет места для хранения символов Unicode (по 1 байт на символ внутренний просмотр просто недостаточно велик).

От Microsoft's Developer Network:

... рассмотреть вопрос об использовании Unicode NCHAR или NVARCHAR типов данных, чтобы минимизировать проблемы преобразования символов.

Как вы заметили, неподдерживаемые символы возвращаются с вопросительными знаками.

+0

Это не размер, в чем проблема; Это определение и поведение типа, особенно неявные преобразования. nchar - один модуль кода UTF-16; Для некоторых кодов Unicode требуется один, два. Некоторые системы баз данных могут хранить как Unicode как UTF-8, где для кодового пункта требуется один, два, три или четыре 8-битных кодовых блока. –

 Смежные вопросы

  • Нет связанных вопросов^_^