MS SQL и русский текст в Unicode

В веб-приложении на ASP.NET WebAPI используется база данных MS SQL, генерируемая с использованием Entity Framework 6 Code First. Collation этой базы данных – unicode. Однако, если создавать записи в этой БД с кириллическими символами, используя методы WebAPI-контроллера, русский текст заменяется на вопросительные знаки.

База содержит таблицу Articles:

{ text: ntext, summary: nvarchar }

В приложении есть ASP.NET WebAPI-контроллер для работы с этой сущностью с автосгенерированными CRUD-операциями.

Записи пытался создавать различными способами:

  1. Создаю запись запросом в SQL Server Management Studio:
    ​insert into Articles values (1, 'текст', 'еще много текста')
    

    В БД колонки text и summary отображаются вопросительными знаками

  2. Создаю запись запросом:
    ​insert into Articles values (1, N'текст', N'еще много текста')
    

    В БД колонки text и summary отображаются нормально

  3. Создаю запись ajax-запросом из браузера:

    $.post("api/articles", {
      summary: "текст",
      text: "еще много текста"
    }).always(function(res) {
      console.log(res)
    });​
    

    В консоли отображается нормальное значение, но если посмотреть в БД или выполнить GET-запрос к этой записи – вернутся вопросительные знаки как в случае 1.
    Данные отправляются в Unicode.

Для решения этой задачи необходимо в методе OnModelCreating DbContext-а добавить явное указание, что в колонке хранится Unicode-значение:

modelBuilder
.Entity<article>() // Выбираем сущность...
.Property(c=> c.Text) // ... и свойство, которое будем настраивать
.HasColumnType("NTEXT") // Означим тип поля
.IsUnicode(true); // Укажем еще раз, что поле - Unicode.

PS: Если есть возможность, то не используйте тип данных ntext, text и image. В ближайшем версии MS SQL Server эти типы данных будут удалены.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s