A partire da SQL Server 2019 (attualmente in versione beta / "Community Tech Preview"), esiste un supporto nativo per UTF-8 tramite una nuova serie di regole di confronto UTF-8. TUTTAVIA, avere la possibilità di usare UTF-8 non significa che dovresti. Ci sono alcuni svantaggi nell'uso di UTF-8, come ad esempio:
- Solo i primi 128 punti di codice sono 1 byte (ovvero il set ASCII standard a 7 bit)
- I successivi quasi 2000 punti di codice sono 2 byte, quindi nessun risparmio di spazio su UTF-16 /
NVARCHAR
- I rimanenti 63k punti di codice nel BMP (ovvero l'intervallo U + 0800 - U + FFFF) sono tutti e 3 byte, quindi 1 byte più grande dello stesso carattere in UTF-16 /
NVARCHAR
.
- Basta affermarlo: i caratteri supplementari sono 4 byte in entrambe le codifiche, quindi nessuna differenza di spazio lì
- Mentre potresti risparmiare spazio usando UTF-8, ci sono ottime possibilità che tu possa fare un colpo sulle prestazioni per farlo.
Ciò che si riduce davvero a questo è: UTF-8 è un progetto di formato di archiviazione che consente ai sistemi a 8 bit (che erano in genere progettati attorno a ASCII e ASCII Extended - Code Pages) di utilizzare Unicode senza interrompere nulla o richiedere alcuna modifica di esistenti file per mantenere le cose in esecuzione. UTF-8 è meraviglioso per i file system e la rete, ma i dati archiviati in SQL Server non lo sono. Il fatto che i dati che si trovano per lo più (o interamente) all'interno dell'intervallo ASCII standard richiede meno spazio rispetto agli stessi dati se archiviati come UTF-16 / NVARCHAR
è un effetto collaterale. Certo, è un effetto collaterale che può rivelarsi utile, ma quella decisione deve essere presa da qualcuno che comprenda sia i dati sia le conseguenze / gli svantaggi di questa decisione. Questo ènon una funzionalità per uso generale.
Inoltre, il caso d'uso principale per UTF-8 (in SQL Server) è per il codice dell'app che già utilizza UTF-8, possibilmente già con un altro RDBMS che lo supporta, e non c'è desiderio o capacità di aggiornare il codice dell'app / schema DB per utilizzare NVARCHAR
tipi di dati (per tabelle, variabili, parametri, ecc.) o per aggiungere il valore letterale stringa con una "N" maiuscola. L'obiettivo è lo stesso del motivo per UTF-8 esistente: abilitare il codice dell'app per utilizzare Unicode senza modificare la struttura generale o rendere i dati esistenti non validi. Se questo descrive la tua situazione, usa UTF-8, ma tieni presente che ci sono ancora alcuni bug / problemi.
Se non hai un'esigenza esplicita di far funzionare Unicode senza usare NVARCHAR
letterali di stringa con prefisso "N" maiuscoli, l'unico altro scenario in cui UTF-8 è un vantaggio è se hai MOLTO di dati ASCII principalmente standard che devono consentire Caratteri Unicode e tu stai usando NVARCHAR(MAX)
(il che significa che la compressione dei dati non funzionerà) e la tabella viene aggiornata frequentemente (quindi l'indice Columnstore Clustered probabilmente non sarà veramente d'aiuto).
Per i dettagli completi, vedere il mio post:
Supporto nativo UTF-8 in SQL Server 2019: Salvatore o Falso profeta?