在mysql中使用实体框架时,unicode字符将替换为基本字符

bz4sfanl  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(369)

背景
我注意到,当通过实体框架从我的mvc网站保存数据时,如果我有类似希腊语的东西α" 它将被转换为“a”。
采取的行动
我越界了 OnModelCreating 并添加了以下代码。

modelBuilder.Properties<string>().Configure(x => { x.HasColumnType("NVARCHAR"); x.IsUnicode(true); });

这最初看起来很有希望,因为新生成的迁移具有这种结构。

AlterColumn("dbo.Item", "Name", c => c.String(maxLength: 800, storeType: "nvarchar"));

运行迁移之后,我看到相关列有排序规则 utf8_general_ci .
长期存在的问题
当通过我的应用程序保存数据时,这一点没有改变。当从网站上传递希腊字符时,它仍然会降级为基本的等效字符。
但是,如果我尝试通过mysql workbench直接添加这些字母,它会很好地存储它们,并且在检索数据时网站会正确显示。
其他信息
使用下面的数据库日志代码,我可以看到sql实体框架正在使用的。

dbContext.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);

看起来不错的sql。

SET SESSION sql_mode='ANSI';INSERT INTO `Item`(
`Name`, 
`Owner_Id`) VALUES (
@gp1, 
@gp2);

-- @gp1: 'The_α_1' (Type = String, IsNullable = false, Size = 7)

-- @gp2: '7a897e05-cc87-410b-bc80-70c75abae95b' (Type = String, IsNullable = false, Size = 36)

有什么想法吗?谢谢你的帮助。

wh6knrhe

wh6knrhe1#

mysql允许配置客户机-服务器通信的几个方面(根据10.4连接字符集和排序规则文档):
源(即客户端)编码: character_set_client 目的地(即服务器)编码: character_set_connection 返回的数据和元数据: character_set_results 我猜,源代码是假定的,来自微软的技术,是utf-16小端码。
对于其他两个,connector/net connection string options参考文档说明:
字符集,字符集
指定应用于对发送到服务器的所有查询进行编码的字符集。结果仍然以结果数据的字符集返回。
到mysql的连接需要被告知目标编码是utf-8(这是mysql列所使用的)。mysql目前假设您发送的是非unicode字符串,实际上与转换为 VARCHAR 在sql server中,假设由当前数据库的默认排序规则指定的代码页是1252(windows代码页1252通常被称为“ansi”,即使这是一个技术上不准确的名称)。
下面通过不在字符串前面加大写“n”来显示sql server中的行为:

SELECT 'α'; -- Database's default Collation = Latin1_General_100_CI_AS_SC
-- a

SELECT 'α'; -- Database's default Collation = Hebrew_100_BIN2
-- ?

请尝试以下方法解决此问题:
第一次尝试应该是将以下内容添加到连接字符串中,以便将字符数据作为utf-8发送到mysql(这应该设置为 character_set_connection ):

CharSet=utf8;

完整连接字符串示例
第二次尝试应该是在初始连接时发送sql命令,以设置控制目标编码的会话级变量:

SET character_set_connection = utf8;

有关更多信息,请参见以下内容:
mysql字符集/校对
根据该页的“utf8排序规则”部分,使用 utf8_unicode_ci 为排序规则而不是 utf8_general_ci (要明确的是,这项建议与这里讨论的字符转换问题无关)。
p、 这个问题/答案有一个关于dba的问答:
在sql server中将base64字符串解码为nvarchar时,为什么会出现不正确的字符?

相关问题