Как избежать изменения кода с помощью Microsoft SQLServer и Unicode

Как вы можете заставить сервер MSSQL принимать данные Unicode по умолчанию в столбец VARCHAR или NVARCHAR?

Я знаю, что вы можете сделать это, поместив N перед строкой, которая будет помещена в поле, но, честно говоря, это кажется немного архаичным в 2008 году, особенно при использовании SQL Server 2005.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
2 864
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Если это веб-приложение, вы, вероятно, можете заставить свой веб-сервер использовать UTF8 в качестве кодировки по умолчанию. Таким образом, все данные в браузере будут передаваться в формате UTF8, который можно вставить в поля VARCHAR. UTF8 - хороший способ заставить приложения, не поддерживающие Unicode, справляться с ним.

Ответ принят как подходящий

Синтаксис N - это то, как вы указываете строковый литерал Unicode в SQL Server.

N'Unicode string'
'ANSI string'

SQL Server будет автоматически преобразовывать между ними, когда это возможно, используя либо сортировку столбца, либо сортировку базы данных.

Поэтому, если ваши строковые литералы на самом деле не содержат символов Юникода, вам не нужно указывать префикс N.

Но если ваши строковые литералы делать содержат символы Unicode, тогда использование префикса N необходимо.

Хотя вы можете просто хранить содержимое UTF8 в поле VARCHAR на сервере MSSQL, если перевод кодировки не выполняется, вы должны знать, что:

  1. Никакие инструменты управления / отчетности / данных вне вашего приложения не смогут понять ваши неанглийские символы.

  2. Обработка, зависящая от языка, такая как сортировка списка имен, может выполняться не в порядке, приемлемом для каждого языка.

  3. Будьте осторожны с усечением данных. Усечение многобайтового символа UTF8 обычно вызывает повреждение данных соответствующего символа. Вы всегда должны отклонять ввод, если он превышает длину поля.

  4. Это может быть не так просто, как вы думаете, отключить преобразование кодировки ... Даже если вы отключите его в своем клиентском драйвере, в некоторых случаях он все равно может быть отменен, если существует значительная разница в локали между клиентской и используемой кодовой страницей СУБД, что мгновенно приводит повреждение данных.

  5. Если вы думаете, что это все, вам придется беспокоиться о том, что вы обманываете себя.

Таким образом, хотя у вас может возникнуть соблазн пойти по этому пути, это не лучшая идея. При переходе к многобайтовой передаче требуется изменение кода.

Им действительно нужен способ отключить префикс N ''. Аргумент «это необходимо для обратной совместимости» не имеет для меня никакого смысла - конечно, сделайте это поведение по умолчанию для старых приложений, но предоставьте мне возможность включить строки Unicode по умолчанию (т.е. префикс N '' не требуется). Я обнаружил, что мне нужно пойти и возиться с большими областями моего приложения, чтобы адаптироваться к Unicode на SQL Server, когда это НЕ является проблемой в Oracle и Postgresql. Да ладно, Microsoft!

Другие вопросы по теме