Мое основное веб-приложение asp.net попадает в базу данных MySQL. Я создаю базу данных миграции и обновления, а затем вижу сортировку таблицы, которая отличается на разных машинах. На моей машине это latin1 - сортировка по умолчанию, а на другой - utf8 - сортировка по умолчанию.
Поэтому из-за такого поведения я получаю исключение при вставке японского или другого языка, например 日本語, Español México или 简体 中文, в таблицу со столбцом varchar (64). Он отлично работает на другом компьютере с utf8 - сортировка по умолчанию в этой таблице.
Версия EF Core: 2.0.1
MySql: 5.7.22 **
Это проблема с EF Core? Или есть обходной путь для создания базы данных с правильной сортировкой или кодировкой?





Это не проблема EF Core, если у вас настроена сортировка по умолчанию в MySql, тогда она будет выбрана MySql. Таким образом, сопоставление - это конфигурация системы базы данных. Возможно, вам придется изменить параметры сортировки по умолчанию на вашем компьютере.
Другой вариант - добавить после создания оператора таблицы в миграции:
Sql('alter table <some_table> convert to character set utf8 collate utf8_unicode_ci');
Настройте каждый столбец вручную на определенный CharSet и Collation, Если вы не можете изменить CharSet или Collation по умолчанию для сервера / схемы (вы не являетесь администратором сервера)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Pomelo.EntityFrameworkCore.MySql.Extensions;
using Pomelo.EntityFrameworkCore.MySql.Infrastructure;
namespace Data
{
public static class Extensions
{
internal static PropertyBuilder<string> TextField(this PropertyBuilder<string> string_column, int max_length)
{
string_column.TextField(CharSet.Utf8Mb4, "utf8mb4_unicode_ci", max_length);
return string_column;
}
internal static PropertyBuilder<string> TextField(this PropertyBuilder<string> string_column, CharSet char_set, string collation, int max_length)
{
string_column.HasColumnType($"VARCHAR({max_length}) CHARACTER SET {char_set} COLLATE {collation}");
return string_column;
}
}
}
Установить набор символов для каждого свойства
protected override void OnModelCreating(ModelBuilder builder)
{
...
builder.Entity<TABLE>().Property(t => t.Name).TextField(1024);
...
}
Проверьте результат по параметрам сортировки столбца запроса
> mysql.exe --login-path=mysql1 --database=test1 -e "select column_name, character_set_name, collation_name from information_schema.columns where table_name = 'TABLE';"
+-------------+--------------------+--------------------+
| column_name | character_set_name | collation_name |
+-------------+--------------------+--------------------+
| Id | NULL | NULL |
| Name | utf8mb4 | utf8mb4_unicode_ci |
| CreatedTime | NULL | NULL |
| UpdatedTime | NULL | NULL |
+-------------+--------------------+--------------------+
Моя библиотека проекта Entity Framework с MySQL 5.7.21.
<ItemGroup>
...
<PackageReference Include = "Microsoft.EntityFrameworkCore.Tools" Version = "5.0.1">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include = "Pomelo.EntityFrameworkCore.MySql" Version = "5.0.0-alpha.2" />
</ItemGroup>
Отмечено, что следующее может установить CharSet, но Collation фиксируется на utf8mb4_general_ci.
services.AddPooledDbContextFactory<ApplicationDbContext>(
options => options
.UseMySql(
Configuration["ConnectionString"],
new MySqlServerVersion(new Version(5, 7, 21)),
mySqlOptions =>
{
mySqlOptions
.CharSetBehavior(CharSetBehavior.AppendToAllColumns);
mySqlOptions.CharSet(CharSet.Utf8Mb4);
})
.EnableSensitiveDataLogging()
.EnableDetailedErrors()
);
Не могли бы вы сообщить мне запрос для SQL Server?