Как указать COLLATE для столбца таблицы?

166
19 мая 2017, 12:26

Имеется проект EF6 (code-First). В сущности File имеется свойство FullPath, содержащее полный путь к файлу в верхнем регистре. Проблема в том, что при поиске файла содержащего в своем пути символ ß он прозрачно меняется на ss, другими словами возвращается не то что ищем:

SELECT FullPath 
FROM File
WHERE FullPath = '\\SERVER\SHARE\FOLDER\STOß.TXT'
--      returns: '\\SERVER\SHARE\FOLDER\STOSS.TXT'

Поэтому, при наличии путей отличающихся написанием ß и 'ss' происходят ошибки.

Можно ли каким-либо образом установить COLLATE для определенного столбца? Каким образом решается эта проблема?

Answer 1

Из коробки EF не поддерживает COLLATION.

Если вы хотите указать -- тогда в поправьте метод Up() миграции, создающей столбец SQL-запрос с ALTER COLUMN, как-то так:

public partial class DisplayNameInUser : DbMigration
{
    public override void Up()
    {
        this.AddColumn("dbo.AspNetUsers", "DisplayName", c => c.String(nullable: false, maxLength: 70));
        this.Sql("ALTER TABLE dbo.AspNetUsers ALTER COLUMN DisplayName nvarchar(70) COLLATE Latin1_General_CS_AS");
        this.Sql("UPDATE dbo.AspNetUsers SET DisplayName = UserName");
        this.CreateIndex("dbo.AspNetUsers", "DisplayName", unique: true, name: "DisplayNameIndex");
    }
    public override void Down()
    {
        this.DropIndex("dbo.AspNetUsers", "DisplayNameIndex");
        this.DropColumn("dbo.AspNetUsers", "DisplayName");
    }
}

Насчёт того, какую кодировку ставить мммм.... я бы рекомендовал поэкспериментировать самостоятельно, в помощь могу посоветовать этот топик на EnSO: http://stackoverflow.com/questions/42871959

Возможно, вам подойдёт SQL_Latin1_General_CP437_BIN2, проверил только что на SQL 11:

INSERT INTO [dbo].[AspNetUsers]
([Id] , [Email],[EmailConfirmed],[PasswordHash],[SecurityStamp],[PhoneNumber],[PhoneNumberConfirmed],[TwoFactorEnabled],[LockoutEndDateUtc],[LockoutEnabled],[AccessFailedCount],[UserName],[DisplayName])
VALUES
('1', 'mail1@gmail.com', 0, '123','123',null, 0, 0, 1, 1, 0, 'Masse', 'Masse')
INSERT INTO [dbo].[AspNetUsers]
([Id] , [Email],[EmailConfirmed],[PasswordHash],[SecurityStamp],[PhoneNumber],[PhoneNumberConfirmed],[TwoFactorEnabled],[LockoutEndDateUtc],[LockoutEnabled],[AccessFailedCount],[UserName],[DisplayName])
VALUES
('2', 'mail2@gmail.com', 0, '123','123',null, 0, 0, 1, 1, 0, 'Maße', 'Maße')
SELECT TOP 10 
* 
FROM [dbo].[AspNetUsers] 
WHERE 1 = 1
-- AND DisplayName like '%ss%'
AND DisplayName like '%ß%'
READ ALSO
How to bind datagrid to a List [требует правки]

How to bind datagrid to a List [требует правки]

I have a datagrid and I want to save information , which was updated in datagrid

153
Отложенный session_start()

Отложенный session_start()

Хочу, чтобы запоминалась ссылка, если пользователь находится на странице некоторое времяВ отдельном файле находится session_start(); $_SERVER['REQUEST_URI'];...

191
Woocommerce вариации не меняют изображение в теме Nitro

Woocommerce вариации не меняют изображение в теме Nitro

Я добавил нужный атрибут и в админ панеле, добавил фото к каждой вариацииНо в данной теме Nitro не меняется основное изображение при выборе...

418
Найти email на странице simple html dom

Найти email на странице simple html dom

ЗдравствуйтеНа страницах, которые парсятся по simple html dom (список компаний), иногда встречаются email'ы

280