Perché MS SQL Server ha uno scarso supporto per UTF-8 rispetto ad altri RDBMS.
MS SQL Server segue la convenzione, utilizzata all'interno di Windows, che le stringhe "strette" ( char
in C ++ CHAR
o VARCHAR
in SQL) sono codificate in una "code page" legacy. Il problema con le code page è che hanno un numero limitato di caratteri (la maggior parte sono codifiche a byte singolo, che limita il reportoire a 256 caratteri) e sono progettate attorno a una singola lingua (o gruppo di lingue con alfabeti simili). Ciò rende difficile l'archiviazione di dati multilingue. Ad esempio, non è possibile archiviare dati sia russi che ebraici perché il russo utilizza la code page 1251 e l'ebraico utilizza la code page 1255 .
Unicode risolve questo problema utilizzando un singolo set di caratteri in codice gigante con spazio per oltre un milione di caratteri, abbastanza per rappresentare ogni lingua del mondo. Esistono diversi schemi di codifica Unicode; Microsoft preferisce utilizzare UTF-16 , per motivi storici . Poiché UTF-16 rappresenta le stringhe come una sequenza di unità di codice a 16 bit anziché i tradizionali 8 bit, è necessario un tipo di carattere separato. In MSVC ++, questo è wchar_t
. E in MS SQL, è NCHAR
o NVARCHAR
. È l' N
acronimo di "nazionale" , il che mi sembra arretrato perché Unicode riguarda l' internazionalizzazione, ma questa è la terminologia ISO.
Altre implementazioni SQL consentono di archiviare il testo UTF-8 in una VARCHAR
colonna. UTF-8 è una codifica a lunghezza variabile (1-4 byte per carattere) ottimizzata per il caso in cui i dati si trovano principalmente nell'intervallo latino di base (che sono rappresentati con lo stesso 1 byte per carattere di ASCII), ma possono rappresentare qualsiasi carattere Unicode. Pertanto, eviteresti il problema del doppio dello spazio menzionato da bwalk2895.
Sfortunatamente, MS SQL Server non supporta UTF-8VARCHAR
, quindi invece devi utilizzare UTF-16 (e sprecare spazio per il testo ASCII), utilizzare una tabella codici non Unicode (e perdere la capacità di rappresentare caratteri stranieri), o memorizzare UTF-8 in una BINARY
colonna (e gestire inconvenienti come le funzioni della stringa SQL che non funzionano correttamente o che devono visualizzare i dati come dump esadecimale nel proprio gestore DB GUI).