2012-02-02 1 views
2

У меня есть база данных с комплектовке CI (по умолчанию) French_CI_ASКак я могу сделать свой чужие ключи чувствительными к регистру в базе данных без учета регистра без учета регистра?

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

у меня есть, вероятно, около двадцати varchar и первичных ключи сотни ФКСА на этих varchar первичных ключей (да, я знаю, с использованием только bigint, как первичные ключи во избежание проблемы в первую очередь, но переход от varchar к bigint здесь не является вариантом)

Какой самый простой способ разобраться в этом? Я использую SQL Server 2008.

+1

Вы не можете. Если сопоставление базы данных нечувствительно к регистру, то все сравнения (используемые FK-> PK-ссылками) не чувствительны к регистру ... нет «магии», чтобы изменить это .... и ** да ** - используя «varchar 'поскольку PK - это действительно плохая идея ** - это лишь одна из многих причин, почему вы не должны использовать' varchar' как PK ..... –

+0

Не помогло бы COLLATE в определении столбца? 'CREATE TABLE ... column_name COLLATE collation_name'? –

+0

@marc_s: Конечно, могу. Например, я мог бы изменить сортировку всей дебабазы ​​на чувствительный к регистру. Я просто пытаюсь найти как можно больший путь, чтобы достичь своей первоначальной цели ... – Brann

ответ

3

Вы можете попытаться изменить сортировку столбца на регистр, чувствительный к регистру, но тогда вам нужно будет отнести столбец (или другие столбцы к той же коллате), когда вы используете его в соединениях или сравнения.

+0

На самом деле SQL Server потребует, чтобы столбец внешнего ключа и столбец с исправлениями были одинаковыми, поэтому для объединения не требуется , – mdisibio

0

Если вы сравниваете поля, вы можете наложить pk и fk на varbinary (varchar length).

Что-то вроде:

Where CAST(yourPK As VarBinary(20)) = CAST(yourFK As VarBinary(20))