Предотвращение изменения кода с помощью Microsoft SQLServer и Unicode

StackOverflow https://stackoverflow.com/questions/167152

Вопрос

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

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

Это было полезно?

Решение

Синтаксис N - это способ указания строкового литерала Юникода в SQL Server.

N'Unicode string'
'ANSI string'

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

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

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

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

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

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

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

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

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

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

  • Может быть не так просто, как вы думаете, отключить преобразование кодировки. Даже если вы отключите его в своем клиентском драйвере, его все равно можно будет переопределить в некоторых случаях, если между клиентом и RDBMS существует значительная языковая разница используемая кодовая страница, которая немедленно приводит к повреждению данных.

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top