Почему явное COLLATE не переопределяет сортировку базы данных? - PullRequest
2 голосов

Я использую SQL Server 2008 R2, параметры сортировки по умолчанию для сервера: Cyrillic_General_CI_AS

Выполнение в SSMS
SELECT 'éÉâÂàÀëËçæà' COLLATE Latin1_General_CS_AS
или

SELECT 'éÉâÂàÀëËçæà' COLLATE Latin1_General_CI_AI   

  • eEaAaAeEc? A on (в тексте / использовать dbName) базы данных с параметрами сортировки по умолчанию Cyrillic_General_CI_AS
  • éÉâÂàÀëËçæà в базе данных с параметрами сортировки по умолчанию Latin1_General_CI_AS

Ответы [ 2 ]

6 голосов
/ 18 ноября 2010

Эти символьные литералы в ваших запросах сначала преобразуются в строки varchar при любом сопоставлении, для которого установлена ​​база данных, а затем вступает в силу приведение сопоставления .

Если вы хотите передать такоесимвольные литералы и убедитесь, что все символы точно представлены, лучше передать их в виде литералов nvarchar:

create database CollTest collate Cyrillic_General_CI_AS
go
use CollTest
go
SELECT 'éÉâÂàÀëËçæà' COLLATE Latin1_General_CS_AS   
SELECT 'éÉâÂàÀëËçæà' COLLATE Latin1_General_CI_AI
go
SELECT N'éÉâÂàÀëËçæà' COLLATE Latin1_General_CS_AS   
SELECT N'éÉâÂàÀëËçæà' COLLATE Latin1_General_CI_AI
go

Вывод:

-----------
eEaAaAeEc?a

(1 row(s) affected)


-----------
eEaAaAeEc?a

(1 row(s) affected)


-----------
éÉâÂàÀëËçæà

(1 row(s) affected)


-----------
éÉâÂàÀëËçæà

(1 row(s) affected)
1 голос
/ 18 ноября 2010

Согласно эта таблица символов Cyrillic_General_CI_AS не содержит символ æ.Это объясняет, почему вы видите ? на своем месте, если вы действительно используете значения по умолчанию вместо того, что вы используете в своих операторах выбора.

...