簡體   English   中英

Entity Framework Core 的 MySQL 整理問題

[英]MySQL collation issue with Entity Framework Core

我的 asp.net 核心 Web 應用程序命中的是 MySQL 數據庫。 我生成遷移和更新數據庫,然后我看到不同機器上不同的表的排序規則。 在我的機器上,它是latin1 - 默認排序規則,而在另一台機器上,它是utf8 - 默認排序規則

因此,由於這種行為,我在將日語或其他語言作品(如日本語、Español México 或簡體中文)插入具有 varchar(64) 列的表時遇到異常。 它在另一台具有utf8 的機器上運行良好-此表上的默認排序規則

EF 核心版本: 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 和 Collat​​ion,以防您無法更改服務器/模式默認 CharSet 或 Collat​​ion(您不是服務器管理員)

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               |
+-------------+--------------------+--------------------+

我的實體框架項目庫與 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>

注意以下可以設置CharSetCollation固定為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()
            );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM