SQL Server 2005/2008 UTF-8 зіставлення / діаграма


16

Я не можу знайти параметр (и) безпосередньо для встановлення UTF-8відновлених даних Collations/Charsetsу SQL Server 2005/2008, як це можливо встановити в інших SQL-движках, але в SQL Server 2005/2008 є лише латинські та SQL-зібрання.

Чи є можливість встановити / встановити ці зіставлення / схеми в двигуні SQL Server (для обох версій) 2005/2008 в ОС Win2008

Відповіді:


13

Ні, немає. SQL Server не підтримує UTF-8.

Вам потрібно визначити свої стовпці як nvarchar / nchar, якщо ви хочете, щоб дані Unicode. Зауважте, внутрішньо SQL Server зберігає це як UCS-2.

Зауважте, що це вимагає від MS на Connect і є старіша стаття KB . І трохи інформації в цьому блозі


6
крім того, якщо ви збираєтеся будь-який текст узгоджувати на nvarchar із іноземними символами, вам потрібно зіставити рядок, відформатований N перед рядком (наприклад, N'οἰκονόμον ').
swasheck

Чи змінилася така поведінка в будь-якому нещодавному випуску сервера SQL?
Сейрія

@Seiyria: ні, така ж поведінка
gbn

Кожен, хто знайде шлях до цієї відповіді, перейдіть на сторінку MS Connect і голосуйте за те, що MS підтримує UTF-8 на SQL Server. Дякую: D
DarcyThomas

@DarcyThomas Це стає реальністю у SQL Server 2019, хоча це все ще не те, що слід використовувати, якщо у них немає явної потреби в цьому. Будь ласка, дивіться мою відповідь для деталей.
Соломон Руцький

2

Ви не можете встановити UTF-8 як набір символів, оскільки це не набір символів, це кодування.

Якщо ви хочете зберігати текст Unicode, ви використовуєте nvarcharтип даних.

Якщо ви хочете зберігати текст, закодований за допомогою UTF-8, ви зберігаєте його як бінарні дані ( varbinary).


1

Починаючи з SQL Server 2019 (зараз у бета-версії / «Community Tech Preview»), існує вбудована підтримка UTF-8 через нову серію зібрань UTF-8. ЯКЩО мати можливість використовувати UTF-8 не означає, що слід. Існують певні недоліки використання UTF-8, такі як:

  1. Тільки перші 128 кодових точок мають 1 байт (тобто стандартний 7-бітний набір ASCII)
  2. Наступні майже 2000 кодових пунктів - 2 байти, отже, економія місця на UTF-16 / NVARCHAR
  3. Решта 63k кодових точок у BMP (тобто діапазон U + 0800 - U + FFFF) - всі 3 байти, отже, на 1 байт більше, ніж той самий символ у UTF-16 / NVARCHAR.
  4. Просто зазначайте: Додаткові символи - це 4 байти в обох кодуваннях, тому різниці у просторі немає
  5. Незважаючи на те, що ви можете заощадити місце за допомогою UTF-8, є дуже хороший шанс, що ви скористаєтеся його ефективністю.

Що насправді зводиться до цього: UTF-8 - це формату формату пам’яті, яка дозволяє 8-бітовим системам (як правило, розробленим навколо ASCII та ASCII Extended - Code Pages) використовувати Unicode, не порушуючи нічого і не вимагаючи будь-яких змін існуючих файли, щоб зберегти роботу. UTF-8 чудовий для файлових систем та мереж, але дані, що зберігаються всередині SQL Server, не є жодним. Той факт, що дані, які просто трапляються в основному (або цілком) у стандартному діапазоні ASCII, вимагають менше місця, ніж ті самі дані, коли вони зберігаються як UTF-16 /, NVARCHARє побічним ефектом. Звичайно, це може бути корисним побічний ефект, але це рішення повинен прийняти той, хто розуміє як дані, так і наслідки / недоліки цього рішення. Цене є функцією для загального користування.

Крім того, основний випадок використання UTF-8 (на SQL Server) - це код програми, який вже використовує UTF-8, можливо, вже з іншою RDBMS, яка його підтримує, і немає бажання чи можливості оновити код програми / схему БД використовувати NVARCHARтипи даних (для таблиць, змінних, параметрів тощо) або префікс рядкових літералів з великого регістру "N". Мета така ж, як і причина існування UTF-8: увімкнути код програми для використання Unicode без зміни загальної структури або надання існуючих даних недійсними. Якщо це описує вашу ситуацію, тоді використовуйте UTF-8, але пам’ятайте, що в ньому є ще кілька помилок / проблем.

Якщо у вас немає явної потреби в роботі Unicode без використання NVARCHARлітери-літери з префіксом рядка "N", то єдиний інший сценарій, де UTF-8 є перевагою, - якщо у вас є багато здебільшого стандартних даних ASCII, для яких потрібно враховувати Unicode символи, які ви використовуєте NVARCHAR(MAX)(це означає, що стискання даних не буде працювати), і таблиця оновлюється часто (тому індекс кластерних стовпців, ймовірно, не допоможе по-справжньому).

Для отримання детальної інформації, будь ласка, дивіться мій пост:

Рідна підтримка UTF-8 у SQL Server 2019: рятівник чи помилковий пророк?


0

У моєму випадку, мені довелося відображати арабські символи, і моя база даних про розвиток була в 2014 році, тут все спрацювало добре. Тут у запиті я міг бачити символи арабської мови, і мій показник: SQL_Latin1_General_CP1256_CI_AS

Але моє виробництво було на SQL сервері 2008 року, і врешті воно не підтримувало UTF-8 набір. Тут я міг побачити все ??????????? оскільки UTF-8 не підтримується в SQL 2008.

Все, що я зробив, - це змінив весь варчар на нварчар, і я міг правильно бачити арабську мову. Також я змінюю зібрання бази даних 2008 на SQL_Latin1_General_CP1256_CI_AS

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.