Ma la definizione di varchar dice che consente dati di stringa non unicode . Ma i simboli Marchio (™) e Registrato (®) sono caratteri Unicode . La definizione contraddice la proprietà del tipo di dati varchar?
Mentre le altre risposte non sono errate, penso che sarebbe utile sottolineare una confusione nella terminologia di base. Ho sottolineato due parole nella citazione sopra dalla domanda come esempio di questa confusione. Quando la documentazione di SQL Server parla di non Unicode Unicode e dati , sono non parlando dei personaggi . Stanno parlando delle sequenze di byte che rappresentano determinati caratteri. La differenza principale tra i tipi Unicode ( NCHAR
, NVARCHAR
, XML
, e la deprecata / cattivi NTEXT
) ed i tipi non Unicode ( CHAR
, VARCHAR
e la deprecata / maligno TEXT
) è ciò tipi di sequenze di byte possono immagazzinare.
I tipi non Unicode memorizzano una delle numerose codifiche a 8 bit, mentre i tipi Unicode memorizzano una singola codifica Unicode a 16 bit: UTF-16 Little Endian. Come hanno già detto le altre risposte, quali caratteri possono essere memorizzati in una codifica a 8 bit / non Unicode dipende dalla tabella codici, che è determinata dal confronto. Mentre altri hanno notato che il valore in byte di un "carattere" può variare attraverso le code page su cui si trova, il valore in byte può persino variare all'interno della stessa code page quando si ha a che fare con una delle numerose code page EBCDIC (varianti di Windows- 1252), che si trovano solo nelle versioni precedenti, non dovrebbero essere realmente utilizzate le regole di confronto di SQL Server (ovvero quelle che hanno nomi che iniziano con SQL_
).
Quindi, la definizione è accurata: qualunque carattere tu riesca a memorizzare in un tipo non Unicode è sempre a 8 bit (anche se usano due valori a 8 bit in combinazione come un singolo "carattere", che è quello che Double- Set di caratteri byte / Le tabelle codici DBCS lo consentono). E i tipi di dati Unicode sono sempre a 16 bit, anche se a volte usano due valori a 16 bit in combinazione come un singolo "carattere" (cioè una coppia surrogata che a sua volta rappresenta un carattere supplementare).
E, grazie al supporto nativo di SQL Server della codifica UTF-8 per VARCHAR
e CHAR
tipi di dati a partire da SQL Server 2019,
VARCHAR
non può più essere definito "non Unicode". Quindi, a partire dalla prima beta pubblica di SQL Server 2019 a settembre 2018, dovremmo fare riferimento a VARCHAR
un "tipo di dati a 8 bit", anche quando si parla in termini di versioni precedenti a SQL Server 2019. Questa terminologia vale per tutti e 4 i tipi di codifiche che possono essere utilizzate con VARCHAR
:
- ASCII esteso
- Set di caratteri a doppio byte (DBCS)
- EBCDIC
- UTF-8 (Unicode)
Solo il TEXT
tipo di dati (obsoleto a partire da SQL Server 2005, quindi non utilizzarlo) è "non Unicode", ma è solo un tecnicismo e il riferimento ad esso come "tipo di dati a 8 bit" è accurato.
NVARCHAR
, NCHAR
e NTEXT
può essere indicato come "UTF-16" o "tipo di dati a 16 bit". Oracle, credo, utilizza la terminologia di "Solo Unicode" per NVARCHAR
, ma ciò non esclude chiaramente la possibilità di utilizzare UTF-8 (anche una codifica Unicode), che non funzionerà, quindi probabilmente è meglio attenersi a le prime due opzioni.
Per i dettagli sulle nuove codifiche UTF-8, vedere il mio post:
Supporto nativo UTF-8 in SQL Server 2019: Salvatore o Falso profeta?
PS Sto lentamente lavorando sulla mia strada aggiornando la documentazione di SQL Server per riflettere queste modifiche.
PPS Microsoft ha già aggiornato alcune pagine con le informazioni UTF-8, inclusa la documentazione char e varchar a cui fa riferimento la domanda. Non contiene più la frase "non Unicode". Ma questo è solo un FYI; non cambia la domanda poiché si tratta di codifiche non Unicode contenenti caratteri che erroneamente si pensava fossero solo Unicode.