字符串值不正确:第 1 行“DisplayName”列的“\xD8\xA7\xD9\x84\xD8\xB9...”

viv*_*una 3 c# mysql collation asp.net-boilerplate aspnetboilerplate

运行服务器端代码时出现以下异常。

\n\n
\n
FATAL 2018-04-25 14:41:59,757 [1    ] Abp.AbpBootstrapper             \n- Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. --->\nMySql.Data.MySqlClient.MySqlException: Incorrect string value:\n\'\\xD8\\xA7\\xD9\\x84\\xD8\\xB9...\' for column \'DisplayName\' at row 1 --->\nMySql.Data.MySqlClient.MySqlException: Incorrect string value:\n\'\\xD8\\xA7\\xD9\\x84\\xD8\\xB9...\' for column \'DisplayName\' at row 1    at\nSystem.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()    at\nSystem.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task\ntask)    at\nSystem.Runtime.CompilerServices.ConfiguredValueTaskAwaitable`1.ConfiguredValueTaskAwaiter.GetResult()\nat\nMySqlConMyCompanytor.Core.ResultSet.<ReadResultSetHeaderAsync>d__1.MoveNext()\nin\nC:\\projects\\mysqlconMyCompanytor\\src\\MySqlConMyCompanytor\\Core\\ResultSet.cs:line\n43    --- End of inner exception stack trace ---    at\nMySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet(ResultSet\nresultSet) in\nC:\\projects\\mysqlconMyCompanytor\\src\\MySqlConMyCompanytor\\MySql.Data.MySqlClient\\MySqlDataReader.cs:line\n92    at\nMySql.Data.MySqlClient.MySqlDataReader.<ReadFirstResultSetAsync>d__65.MoveNext()\nin\nC:\\projects\\mysqlconMyCompanytor\\src\\MySqlConMyCompanytor\\MySql.Data.MySqlClient\\MySqlDataReader.cs:line\n297\n--- End of stack trace from previous location where exception was thrown ---    at\nSystem.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()    at\nSystem.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task\ntask)    at\nMySql.Data.MySqlClient.MySqlDataReader.<CreateAsync>d__64.MoveNext()\nin\nC:\\projects\\mysqlconMyCompanytor\\src\\MySqlConMyCompanytor\\MySql.Data.MySqlClient\\MySqlDataReader.cs:line\n287\n--- End of stack trace from previous location where exception was thrown ---    at\nSystem.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()    at\nSystem.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task\ntask)    at\nMySqlConMyCompanytor.Core.TextCommandExecutor.<ExecuteReaderAsync>d__3.MoveNext()\nin\nC:\\projects\\mysqlconMyCompanytor\\src\\MySqlConMyCompanytor\\Core\\TextCommandExecutor.cs:line\n70\n--- End of stack trace from previous location where exception was thrown ---    at\nSystem.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()    at\nSystem.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task\ntask)    at\nMySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior\nbehavior) in\nC:\\projects\\mysqlconMyCompanytor\\src\\MySqlConMyCompanytor\\MySql.Data.MySqlClient\\MySqlCommand.cs:line\n172    at\nMicrosoft.EntityFrameworkCore.Storage.Internal.MySqlRelationalCommand.<ExecuteAsync>d__3.MoveNext()\n--- End of stack trace from previous location where exception was thrown ---    at\nSystem.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()    at\nSystem.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task\ntask)    at\nMicrosoft.EntityFrameworkCore.Storage.Internal.MySqlRelationalCommand.Execute(IRelationalConMyCompanytion\nconMyCompanytion, DbCommandMethod executeMethod, IReadOnlyDictionary`2\nparameterValues)    at\nMicrosoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConMyCompanytion\nconMyCompanytion, IReadOnlyDictionary`2 parameterValues)    at\nMicrosoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConMyCompanytion\nconMyCompanytion)    --- End of inner exception stack trace ---    at\nMicrosoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConMyCompanytion\nconMyCompanytion)    at\nMicrosoft.EntityFrameworkCore.Update.Internal.MySqlBatchExecutor.Execute(IEnumerable`1\ncommandBatches, IRelationalConMyCompanytion conMyCompanytion)    at\nMicrosoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChanges(IReadOnlyList`1\nentries)    at\nMicrosoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IReadOnlyList`1\nentriesToSave)    at\nMicrosoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(Boolean\nacceptAllChangesOnSuccess)    at\nMicrosoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean\nacceptAllChangesOnSuccess)    at\nAbp.EntityFrameworkCore.AbpDbContext.SaveChanges() in\nD:\\Github\\aspnetboilerplate\\src\\Abp.EntityFrameworkCore\\EntityFrameworkCore\\AbpDbContext.cs:line\n198    at\nAbp.Zero.EntityFrameworkCore.AbpZeroCommonDbContext`3.SaveChanges() in\nD:\\Github\\aspnetboilerplate\\src\\Abp.ZeroCore.EntityFrameworkCore\\Zero\\EntityFrameworkCore\\AbpZeroCommonDbContext.cs:line\n154    at\nMyCompany.MyProject.EntityFrameworkCore.Seed.Host.DefaultLanguagesCreator.AddLanguageIfNotExists(ApplicationLanguage\nlanguage) in\nC:\\Users\\MyName\\Source\\Workspaces\\Workspace\\FoodKioskSolution\\MyCompany.MyProject\\src\\MyCompany.MyProject.EntityFrameworkCore\\EntityFrameworkCore\\Seed\\Host\\DefaultLanguagesCreator.cs:line\n59    at\nMyCompany.MyProject.EntityFrameworkCore.Seed.Host.DefaultLanguagesCreator.CreateLanguages()\nin\nC:\\Users\\MyName\\Source\\Workspaces\\Workspace\\FoodKioskSolution\\MyCompany.MyProject\\src\\MyCompany.MyProject.EntityFrameworkCore\\EntityFrameworkCore\\Seed\\Host\\DefaultLanguagesCreator.cs:line\n47    at\nMyCompany.MyProject.EntityFrameworkCore.Seed.Host.DefaultLanguagesCreator.Create()\nin\nC:\\Users\\MyName\\Source\\Workspaces\\Workspace\\FoodKioskSolution\\MyCompany.MyProject\\src\\MyCompany.MyProject.EntityFrameworkCore\\EntityFrameworkCore\\Seed\\Host\\DefaultLanguagesCreator.cs:line\n40    at\nMyCompany.MyProject.EntityFrameworkCore.Seed.Host.InitialHostDbBuilder.Create()\nin\nC:\\Users\\MyName\\Source\\Workspaces\\Workspace\\FoodKioskSolution\\MyCompany.MyProject\\src\\MyCompany.MyProject.EntityFrameworkCore\\EntityFrameworkCore\\Seed\\Host\\InitialHostDbBuilder.cs:line\n15    at\nMyCompany.MyProject.EntityFrameworkCore.Seed.SeedHelper.SeedHostDb(MyProjectDbContext\ncontext) in\nC:\\Users\\MyName\\Source\\Workspaces\\Workspace\\FoodKioskSolution\\MyCompany.MyProject\\src\\MyCompany.MyProject.EntityFrameworkCore\\EntityFrameworkCore\\Seed\\SeedHelper.cs:line\n25    at\nMyCompany.MyProject.EntityFrameworkCore.Seed.SeedHelper.WithDbContext[TDbContext](IIocResolver\niocResolver, Action`1 contextAction) in\nC:\\Users\\MyName\\Source\\Workspaces\\Workspace\\FoodKioskSolution\\MyCompany.MyProject\\src\\MyCompany.MyProject.EntityFrameworkCore\\EntityFrameworkCore\\Seed\\SeedHelper.cs:line\n41    at\nMyCompany.MyProject.EntityFrameworkCore.Seed.SeedHelper.SeedHostDb(IIocResolver\niocResolver) in\nC:\\Users\\MyName\\Source\\Workspaces\\Workspace\\FoodKioskSolution\\MyCompany.MyProject\\src\\MyCompany.MyProject.EntityFrameworkCore\\EntityFrameworkCore\\Seed\\SeedHelper.cs:line\n17    at\nMyCompany.MyProject.EntityFrameworkCore.MyProjectEntityFrameworkModule.PostInitialize()\nin\nC:\\Users\\MyName\\Source\\Workspaces\\Workspace\\FoodKioskSolution\\MyCompany.MyProject\\src\\MyCompany.MyProject.EntityFrameworkCore\\EntityFrameworkCore\\MyProjectEntityFrameworkModule.cs:line\n46    at System.Collections.Generic.List`1.ForEach(Action`1 action)   \nat Abp.AbpBootstrapper.Initialize() in\nD:\\Github\\aspnetboilerplate\\src\\Abp\\AbpBootstrapper.cs:line 155\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

异常位于文件DefaultLanguagesCreator.cs中中:

\n\n
using System.Collections.Generic;\nusing System.Linq;\nusing Microsoft.EntityFrameworkCore;\nusing Abp.Localization;\n\nnamespace MyCompany.MyProject.EntityFrameworkCore.Seed.Host\n{\n    public class DefaultLanguagesCreator\n    {\n        public static List<ApplicationLanguage> InitialLanguages => GetInitialLanguages();\n\n        private readonly SparDbContext _context;\n\n        private static List<ApplicationLanguage> GetInitialLanguages()\n        {\n            return new List<ApplicationLanguage>\n            {\n                new ApplicationLanguage(null, "en", "English", "famfamfam-flags gb"),\n                new ApplicationLanguage(null, "ar", "???????", "famfamfam-flags sa"),\n                new ApplicationLanguage(null, "de", "German", "famfamfam-flags de"),\n                new ApplicationLanguage(null, "it", "Italiano", "famfamfam-flags it"),\n                new ApplicationLanguage(null, "fr", "Fran\xc3\xa7ais", "famfamfam-flags fr"),\n                new ApplicationLanguage(null, "pt-BR", "Portuguese", "famfamfam-flags br"),\n                new ApplicationLanguage(null, "tr", "T\xc3\xbcrk\xc3\xa7e", "famfamfam-flags tr"),\n                new ApplicationLanguage(null, "ru", "???????", "famfamfam-flags ru"),\n                new ApplicationLanguage(null, "zh-CN", "????", "famfamfam-flags cn"),\n                new ApplicationLanguage(null, "es-MX", "Espa\xc3\xb1ol M\xc3\xa9xico", "famfamfam-flags mx"),\n                new ApplicationLanguage(null, "nl", "Nederlands", "famfamfam-flags nl"),\n                new ApplicationLanguage(null, "ja", "???", "famfamfam-flags jp")\n            };\n        }\n\n        public DefaultLanguagesCreator(SparDbContext context)\n        {\n            _context = context;\n        }\n\n        public void Create()\n        {\n            CreateLanguages();\n        }\n\n        private void CreateLanguages()\n        {\n            foreach (var language in InitialLanguages)\n            {\n                AddLanguageIfNotExists(language);\n            }\n        }\n\n        private void AddLanguageIfNotExists(ApplicationLanguage language)\n        {\n            if (_context.Languages.IgnoreQueryFilters().Any(l => l.TenantId == language.TenantId && l.Name == language.Name))\n            {\n                return;\n            }\n\n            _context.Languages.Add(language);\n            _context.SaveChanges();\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

它对阿拉伯语给予例外。

\n

viv*_*una 6

感谢@Dalton 和@Lajos 的建议,它确实有助于解决问题。

在您的建议的帮助下我找到了解决方案。这不是 EF Core 问题,而是我的 MySql 中配置的默认排序规则。因此,您必须更改数据库上的默认排序规则。我的数据库中有latin1 - 默认排序规则“,这对于插入 Unicode 和非英语单词没有用,请运行以下查询来更改数据库中所有表的排序规则。

SELECT CONCAT("ALTER TABLE `", TABLE_NAME,"` convert to character set utf8 collate utf8_unicode_ci;") AS    mySQL
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="<YouDatabaseName>"
AND TABLE_TYPE="BASE TABLE"
Run Code Online (Sandbox Code Playgroud)

如果您不想在 MySQL 中运行此查询,那么您可以在代码迁移中添加上述脚本。