gpt4 book ai didi

c# - 在使用 Entity Framework 和 MySQL 读取期间将 VARCHAR 作为 BINARY 访问?

转载 作者:可可西里 更新时间:2023-11-01 06:38:36 25 4
gpt4 key购买 nike

问题的根源:

双关语。

问题始于一个非常古老的 dBase 数据库,其中文本信息直接编码到 DOS Cyrillic (CP-866) 中。 ,而且因为这还不够,它还每天晚上被传输到我可以访问的 MySQL 数据库。

我已经安装了 MySQL 提供程序并使用 Entity Framework 连接到数据库,这是我的主要数据访问方法,然后出于实验原因也使用纯 ADO.NET。

一切都比预期的要好,直到我尝试将假定的 CP-866 值从数据库转换为 UTF-8,如下所示:

var cp866 = Encoding.GetEncoding(866);
var utf8 = Encoding.UTF8;

string source = "some unreadable set of characters from the database";
byte[] cp866bytes = cp866.GetBytes(source);
byte[] utf8bytes = Encoding.Convert(cp866, utf8, cp866bytes);
string result = utf8.GetString(utf8bytes);

我用 EntityFramework 读过一次,用 ADO.NET 读过一次,结果相同。

由于当时未知的和现在不太为人所知的原因,它没有用。在阅读了一些关于编码和字符串值的重要文章后,我确定由于字符串变量本身的性质,不可能将此类转换应用于数据库中与 varchar 字段等效的字符串。

后来,我终于通过使用 ADO.NET MySQL Provider 并通过将 CONVERT(varcharColumn, Binary) 添加到我正在测试的列来自定义我的查询来实现它。

从那时起,我使用上面的代码,唯一的区别是我已经从转换中获得了 cp866 字节数组。我最初打算做类似的事情,但 MySQL 提供程序无法直接从 varchar 字段读取字节,我也没有找到使用 Entity Framework 来完成它的方法。

是的,它有效,但即使是我没有经验的自己也感觉不对。



问题:

1:我能否指定 Entity Framework 应如何选择特定字段?

我想以某种方式解释我心爱的 ORM,它应该在读取期间将特定的 varchar 字段转换为二进制,根本不返回字符串表示,因为它把一切都搞砸了。

2:有没有办法让 ADO.NET MySQL 提供程序获取 varchar 字段的字节,而无需先将其作为字符串提取?

GetBytes 方法在与 varchar 一起使用时会抛出异常,而通常存在于 ADO.NET 提供程序中的 GetSqlBytes 方法在 MySQL 版本中缺失。我真的不想在我需要正确阅读的每个字段上编写 Binary Convert。

3:奖励问题:是否可以像我一样将 CP-866 编码的 varchar 字段作为字符串读取,但这次正确地将编码更改为 UTF-8?

今天读完后,关于编码的话题,我脑子里还是一片困惑。我仍然相信我可能遗漏了一些东西,并且可以从 cp-866 编码的 varchar 字段中读取一个字符串,例如:

string cp866EncodedValue = "Œ€„‹… Œ‹€„…Ž‚€ Šš…‚€"; //actual copy-pasted value

.. 然后将其转换为 UTF-8,同时请记住数据库中的字段是使用 CP-866 编码的。根据我的阅读,只要它在字符串中,它就是 unicode 并且字符串是不可变的。我尝试获取它的 byre 数组表示,将其更改为 cp866,然后更改为 utf8,我尝试使用它,因为它是 cp866 本身,但没有成功。

最佳答案

首先我会检查您的数据库和/或您的相关表的当前编码。

@eggyal 指向链接,其中有用于设置某些变量的这些命令:

SET character_set_client = charset_name;
SET character_set_results = charset_name;
SET character_set_connection = charset_name;

要检查这些,请使用以下内容:

SHOW VARIABLES LIKE 'character_set_client';
SHOW VARIABLES LIKE 'character_set_results';
SHOW VARIABLES LIKE 'character_set_connection';

然后对于数据库默认的字符编码,使用:

SHOW CREATE DATABASE databaseName;

然后对于那个特定的表,请检查:

show create table TABLE_IN_QUESTION;

在这些之后,您知道哪些是您的数据库和/或表的确切编码。


我解决所发现问题的解决方案只是指向一个有趣来源的链接。请看看这篇文章是否有相关内容要讲述:

http://nicj.net/mysql-converting-an-incorrect-latin1-column-to-utf8/


附言。 ,我可以读取 url,它说明转换 latin1 -> utf8,但据我了解,相同的提示也适用于其他字符编码对。

关于c# - 在使用 Entity Framework 和 MySQL 读取期间将 VARCHAR 作为 BINARY 访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16907636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com