Pero la definición de varchar dice que permite datos de cadena no unicode . Pero los símbolos Trademark (™) y Registered (®) son caracteres Unicode . ¿La definición contradice la propiedad del tipo de datos varchar?
Si bien las otras respuestas no son incorrectas, creo que ayudaría señalar una confusión en la terminología básica. He enfatizado dos palabras en la cita anterior de la pregunta como un ejemplo de esta confusión. Cuando la documentación de SQL Server habla de no Unicode Unicode y datos , que están no hablan de los personajes . Están hablando de las secuencias de bytes que representan ciertos caracteres. La principal diferencia entre los tipos Unicode ( NCHAR
, NVARCHAR
, XML
, y el desuso / malos NTEXT
) y los tipos no Unicode ( CHAR
, VARCHAR
y el desuso / mal TEXT
) es lo que los tipos de secuencias de bytes que pueden almacenar.
Los tipos no Unicode almacenan una de varias codificaciones de 8 bits, mientras que los tipos Unicode almacenan una sola codificación Unicode de 16 bits: UTF-16 Little Endian. Como las otras respuestas han mencionado, qué caracteres se pueden almacenar en una codificación de 8 bits / no Unicode depende de la página de códigos, que está determinada por la Clasificación. Mientras que otros han notado que el valor de byte de un "carácter" puede variar entre las páginas de códigos en las que se encuentra, el valor de byte incluso puede variar dentro de la misma página de códigos cuando se trata de una de las varias páginas de códigos EBCDIC (variaciones de Windows- 1252), que solo se encuentran en las clasificaciones de SQL Server más antiguas, no deberían usarse realmente (es decir, aquellas que tienen nombres que comienzan con SQL_
).
Por lo tanto, la definición es precisa: los caracteres que puede almacenar en un tipo que no sea Unicode son siempre de 8 bits (incluso si usan dos valores de 8 bits en combinación como un solo "carácter", que es lo que el Double- El conjunto de caracteres de bytes / las páginas de códigos DBCS lo permiten). Y los tipos de datos Unicode son siempre de 16 bits, incluso si a veces usan dos valores de 16 bits en combinación como un solo "carácter" (es decir, un par sustituto que a su vez representa un carácter suplementario).
Y, debido a que SQL Server admite de forma nativa la codificación UTF-8 VARCHAR
y los CHAR
tipos de datos a partir de SQL Server 2019,
VARCHAR
ya no puede denominarse "no Unicode". Entonces, comenzando con la primera versión beta pública de SQL Server 2019 en septiembre de 2018, deberíamos referirnos VARCHAR
como un "tipo de datos de 8 bits", incluso cuando se habla en términos de versiones anteriores a SQL Server 2019. Esta terminología es válida para los 4 tipos de codificaciones que se pueden usar con VARCHAR
:
- ASCII extendido
- Conjuntos de caracteres de doble byte (DBCS)
- EBCDIC
- UTF-8 (Unicode)
Solo el TEXT
tipo de datos (en desuso a partir de SQL Server 2005, así que no lo use) es "no Unicode", pero eso es solo un tecnicismo, y referirse a él como un "tipo de datos de 8 bits" es exacto.
NVARCHAR
, NCHAR
y NTEXT
puede denominarse "UTF-16" o "tipo de datos de 16 bits". Oracle, creo, usa la terminología de "Unicode-only" para NVARCHAR
, pero eso no descarta claramente la posibilidad de usar UTF-8 (también una codificación Unicode), que no funcionará, así que probablemente sea mejor quedarse con Las dos primeras opciones.
Para obtener detalles sobre las nuevas codificaciones UTF-8, consulte mi publicación:
Soporte nativo de UTF-8 en SQL Server 2019: ¿Salvador o falso profeta?
PD: Estoy trabajando lentamente para actualizar la documentación de SQL Server para reflejar estos cambios.
PPS Microsoft ya ha actualizado algunas páginas con información de UTF-8, incluida la documentación de char y varchar a la que se hace referencia en la pregunta. Ya no contiene la frase "no Unicode". Pero eso es solo un FYI; no cambia la pregunta, ya que se trata de codificaciones no Unicode que contienen caracteres que se pensaban erróneamente que eran solo Unicode.