Оскільки MS SQL Server має слабку підтримку UTF-8 порівняно з іншими RDBMS.
MS SQL Server дотримується домовленості, що використовується в самій Windows, що "вузькі" рядки ( char
в C ++ CHAR
або VARCHAR
в SQL) кодуються в застарілу "кодову сторінку". Проблема сторінок коду полягає в тому, що вони мають обмежену кількість символів (більшість - це однобайтові кодування, що обмежує репортаж на 256 символів) і розроблені навколо однієї мови (або групи мов з подібними алфавітами). Це ускладнює зберігання багатомовних даних. Наприклад, ви не можете зберігати і російські, і єврейські дані, оскільки російська використовує кодову сторінку 1251, а іврит використовує кодову сторінку 1255 .
Unicode вирішує цю проблему, використовуючи один гігантський набір закодованих символів, в якому розміщено більше мільйона символів, достатньо для представлення кожної мови у світі. Існує кілька схем кодування Unicode; Microsoft вважає за краще використовувати UTF-16 з історичних причин . Оскільки UTF-16 представляє рядки як послідовність 16-бітних одиниць коду замість традиційних 8-бітових, потрібен окремий тип символів. У MSVC ++ це так wchar_t
. А в MS SQL це NCHAR
чи NVARCHAR
. Поняття N
"національне" , що мені здається назад, тому що Unicode - це питання про інтернаціоналізацію , але це термінологія ISO.
Інші реалізації SQL дозволяють зберігати текст UTF-8 у VARCHAR
стовпці. UTF-8 - кодування змінної довжини (1-4 байти на символ), яке оптимізоване для випадку, коли ваші дані здебільшого знаходяться в базовому діапазоні латинської ланки (які представлені тим самим 1 байтом на символ, що й ASCII), але можуть представляти будь-який символ Unicode. Таким чином, ви уникнете проблеми "вдвічі більше місця", згаданої bwalk2895.
На жаль, MS SQL Server не підтримує UTF-8VARCHAR
, тому замість цього вам доведеться або замість цього використовувати UTF-16 (і витрачати простір для тексту ASCII), використовувати кодову сторінку, яка не використовується Unicode (і втрачати здатність представляти іноземні символи), або зберігати UTF-8 у BINARY
стовпці (і вирішувати незручності, такі як функції струнних функцій SQL, які не працюють належним чином, або потребувати перегляду даних як шістнадцятковий дамп у вашому диспетчері даних GUI).