2016-12-12 2 views
3

Cette question est purement théorique pour envelopper ma tête autourComment les données Unicode (UTF-16) hors collation sont-elles stockées dans la colonne varchar?

Disons que je Unicode cyclone (1F300) symbole. Si je tente de le stocker dans varchar colonne qui a le classement par défaut Latin1_General_CI_AS, symbole de cyclone ne peut pas entrer dans un octet qui est utilisé par symbole dans varchar ...

Les façons que je peux voir ce faire:

  1. Comme javascript fait pour les symboles hors du plan de base (BMP) où il les stocke comme 2 symboles (paires de substitution), puis un traitement supplémentaire est nécessaire pour put them back together ...
  2. Juste tronquer le symbole, stocker le premier octet et déposez le deuxième .... (les données sont toast - vous auriez dû lire le manuel ....)
  3. Les données sont détruites et rien d'utilisé n'est sauvegardé ... (les données sont toast - vous auriez dû lire le manuel ....)
  4. Une autre option qui est en dehors de ma capacité mentale .....

je l'ai fait quelques recherches après l'insertion ou deux symboles différents unicode

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

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

puis de les lire en octets SELECT cast (field1 as varbinary(10)) dans les deux cas que j'ai eu 0x3F3F.

enter image description here

3F dans ascii est ? (question mark) deux marques par exemple question (??) que je vois aussi quand faire normale select * ce que cela signifie que les données sont du pain grillé et pas même 1ère morsure est stockée?

Comment les données Unicode hors collation sont-elles stockées dans la colonne varchar?

Répondre

4

Les données sont griller et sont exactement ce que vous voyez, 2 x 0x3F octets. Cela se produit pendant la conversion de type avant l'insertion et est effectivement le même que cast('' as varbinary(2)) qui est également 0xF3F3 (par opposition à la coulée N'').

Lorsque les données Unicode doivent être insérées dans des colonnes non-Unicode, les colonnes sont converties en interne Unicode en utilisant l'API WideCharToMultiByte et la page de code associé à la collation. Si un caractère ne peut pas être représenté sur la page de code donnée, le caractère est remplacé par un point d'interrogation (?) Ref.

+1

Salut Alex, merci pour la réponse. Je me demande pourquoi deux '??' au lieu de 1 '?', Se sent comme une insulte à la blessure, lol ... –

1

Oui, les données ont disparu.

Varchar nécessite moins d'espace, comparé à NVarchar. Mais cette réduction a un coût. Il n'y a pas de place pour un Varchar pour stocker des caractères Unicode (à 1 octet par caractère, la recherche interne n'est pas assez grande).

De Microsoft's Developer Network:

... pensez à utiliser la nchar Unicode ou types de données nvarchar pour minimiser les problèmes de conversion de caractères.

Comme vous l'avez remarqué, les caractères non pris en charge sont remplacés par des points d'interrogation.

+0

Ce n'est pas la taille qui pose problème; C'est la définition et le comportement du type, en particulier les conversions implicites. nchar est une unité de code UTF-16; Certains codes Unicode nécessitent un, deux ou deux. Certains systèmes de base de données peuvent être stockés en Unicode sous la forme UTF-8, où un code requiert une, deux, trois ou quatre unités de code à 8 bits. –