Преобразование набора символов выполняется неявно на уровне соединения с базой данных. Вы можете принудительно отключить автоматическое преобразование в строке подключения ODBC или ADODB с помощью параметра «Auto Translate = False». Это НЕ рекомендуется.
Смотри: https://msdn.microsoft.com/en-us/library/ms130822.aspx
В SQL Server 2005 была несовместимость кодовых страниц, когда база данных и клиентская кодовая страница не совпадали.
https://support.microsoft.com/kb/KbView/904803
SQL-Management Console 2008 и выше является приложением UNICODE. Все введенные или запрошенные значения интерпретируются как таковые на уровне приложения. Разговор с сопоставлением столбцов выполняется неявно. Вы можете проверить это с помощью:
SELECT CAST(N'±' as varbinary(10)) AS Result
Это вернет 0xB100
, который является символом Unicode U + 00B1 (как введено в окне консоли управления). Вы не можете отключить «Автоматический перевод» для Management Studio.
Если вы укажете другую сортировку в выборе, вы в конечном итоге окажетесь в двойном преобразовании (с возможной потерей данных), пока «Автоматический перевод» все еще активен. Оригинальный символ сначала преобразуется в новое сопоставление во время выбора, который, в свою очередь, получает «Автоматический перевод» на «правильную» кодовую страницу приложения. Вот почему ваши различные тесты COLLATION показывают одинаковый результат.
Вы можете проверить, что указание параметров сортировки влияет на выбор, если вы приведете результат как VARBINARY
вместо VARCHAR
, поэтому преобразование SQL Server не будет аннулировано клиентом до его представления:
SELECT cast(columnName COLLATE SQL_Latin1_General_CP850_BIN2 as varbinary(10)) from tableName
SELECT cast(columnName COLLATE SQL_Latin1_General_CP1_CI_AS as varbinary(10)) from tableName
Это даст вам 0xF1
или 0xB1
соответственно, если columnName
содержит только символ '±'
Вы все еще можете получить правильный результат и неправильный символ, если используемый вами шрифт не обеспечивает правильный глиф.
Пожалуйста, дважды проверьте фактическое внутреннее представление вашего персонажа, приведя запрос к VARBINARY
на соответствующем образце и убедитесь, что этот код действительно соответствует определенной сортировке базы данных SQL_Latin1_General_CP850_BIN2
SELECT CAST(columnName as varbinary(10)) from tableName
Различия в сопоставлении приложений и сопоставлении баз данных могут остаться незамеченными, если преобразование всегда выполняется одинаково и обратно. Проблемы возникают, как только вы добавляете клиента с другим сопоставлением. Тогда вы можете обнаружить, что внутреннее преобразование не может правильно сопоставить символы.
При всем этом вы должны иметь в виду, что Management Studio обычно не является окончательной ссылкой при интерпретации наборов результатов. Даже если это выглядит бессмысленно в MS, это все равно может быть правильным выводом. Вопрос в том, правильно ли отображаются записи в ваших приложениях.