Mais la définition de varchar indique qu'elle autorise les données de chaîne non unicode . Mais les symboles des marques (™) et enregistré (®) sont Unicode caractères . La définition contredit-elle la propriété du type de données varchar?
Bien que les autres réponses ne soient pas incorrectes, je pense qu'il serait utile de signaler une confusion dans la terminologie de base. J'ai souligné deux mots dans la citation ci-dessus de la question comme exemple de cette confusion. Lorsque la documentation SQL Server parle d'Unicode et non-Unicode des données , ils ne parlent des personnages . Ils parlent des séquences d'octets qui représentent certains caractères. La principale différence entre les types Unicode ( NCHAR
, NVARCHAR
, XML
et le dépréciée / mal NTEXT
) et les types non-Unicode ( CHAR
, VARCHAR
et le dépréciée / mal TEXT
) est ce que les types de séquences d'octets qu'ils peuvent stocker.
Les types non Unicode stockent l'un des nombreux codages 8 bits, tandis que les types Unicode stockent un seul codage Unicode 16 bits: UTF-16 Little Endian. Comme les autres réponses l'ont mentionné, quels caractères peuvent être stockés dans un codage 8 bits / non Unicode dépend de la page de codes, qui est déterminée par le classement. Alors que d'autres ont noté que la valeur en octets d'un "caractère" peut varier selon les pages de codes sur lesquelles il se trouve, la valeur en octets peut même varier au sein de la même page de codes lorsqu'il s'agit de l'une des plusieurs pages de codes EBCDIC (variations de Windows- 1252), qui ne se trouvent que dans les anciennes versions de SQL Server, ne devraient pas vraiment être utilisées (c'est-à-dire celles dont le nom commence par SQL_
).
Par conséquent, la définition est précise: tous les caractères que vous pouvez gérer pour stocker dans un type non Unicode sont toujours 8 bits (même s'ils utilisent deux valeurs 8 bits en combinaison comme un seul "caractère", ce qui est ce que le Double- Le jeu de caractères octet / les pages de codes DBCS le permettent). Et les types de données Unicode sont toujours 16 bits, même s'ils utilisent parfois deux valeurs 16 bits en combinaison comme un seul "caractère" (c'est-à-dire une paire de substitution qui à son tour représente un caractère supplémentaire).
ET, en raison de la prise en charge native de SQL Server pour le codage UTF-8 VARCHAR
et les CHAR
types de données à partir de SQL Server 2019,
VARCHAR
ne peut plus être appelé "non-Unicode". Donc, à partir de la première version bêta publique de SQL Server 2019 en septembre 2018, nous devrions nous référer à VARCHAR
un "type de données 8 bits", même lorsque nous parlons en termes de versions antérieures à SQL Server 2019. Cette terminologie est vraie pour les 4 types d'encodages utilisables avec VARCHAR
:
- ASCII étendu
- Jeux de caractères codés sur deux octets (DBCS)
- EBCDIC
- UTF-8 (Unicode)
Seul le TEXT
type de données (obsolète à partir de SQL Server 2005, donc ne l'utilisez pas) est "non-Unicode", mais ce n'est qu'une technicité, et le qualifier de "type de données 8 bits" est exact.
NVARCHAR
,, NCHAR
et NTEXT
peut être appelé "UTF-16" ou "type de données 16 bits". Oracle, je crois, utilise la terminologie de "Unicode uniquement" pour NVARCHAR
, mais cela n'exclut pas clairement la possibilité d'utiliser UTF-8 (également un encodage Unicode), qui ne fonctionnera pas, donc il vaut probablement mieux s'en tenir à les deux premières options.
Pour plus de détails sur les nouveaux encodages UTF-8, veuillez consulter mon article:
Prise en charge native UTF-8 dans SQL Server 2019: Sauveur ou faux prophète?
PS Je progresse lentement vers la mise à jour de la documentation SQL Server pour refléter ces changements.
PPS Microsoft a déjà mis à jour certaines pages avec des informations UTF-8, y compris la documentation char et varchar référencée dans la question. Il ne contient plus l'expression "non-Unicode". Mais ce n'est qu'un FYI; cela ne change pas la question car il s'agit d'encodages non Unicode contenant des caractères qui étaient à tort pensés être uniquement Unicode.