使用实体框架和MySQL读取时将VARCHAR作为二进制访问

本文关键字:VARCHAR 访问 二进制 读取 实体 框架 MySQL | 更新日期: 2023-09-27 18:16:36

问题的基础:

双关语。

问题开始于一个非常旧的dBase数据库,其中文本信息直接编码为DOS西里尔文(CP-866),因为这还不够一个问题,它也被转移到MySQL数据库每天晚上,我可以访问。

我已经安装了MySQL提供程序,并与实体框架连接到数据库,这是我的主要数据访问方法,然后出于纯ADO的实验原因。

一切都比预期的要好,直到我试图将数据库中的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读过一次。

由于当时不知道和现在不太知道的原因,不起作用。在阅读了一些关于编码和字符串值的重要文章之后,我已经确定,由于字符串变量本身的性质,不可能将这种转换应用于数据库中varchar字段的字符串等效。

敲击键盘几下之后,我终于用ADO实现了。. NET MySQL提供程序并通过添加CONVERT(varcharColumn, Binary)到我正在测试的列来定制我的查询。

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

是的,它工作,但感觉不正确,即使是我没有经验的自己。



<标题>问题:

1:我可以指定实体框架应该如何选择特定的字段吗?

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

2:是否有办法使ADO。. NET MySQL提供程序获得varchar字段的字节,而不把它作为一个字符串吗?

GetBytes方法在与varchar和通常存在于ADO中的GetSqlBytes方法一起使用时抛出异常。. NET提供程序在MySQL版本中缺失。我真的不想在我需要正确读取的每个字段上编写二进制转换。

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

今天的阅读后,我的脑海中仍然有很多关于编码主题的混乱。我仍然相信可能有一些我遗漏的东西,并且可以从cp-866编码的varchar字段中读取字符串,例如:

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

. .然后将其转换为UTF-8,同时记住数据库中的字段是用CP-866编码的。从我所读到的,只要它是一个字符串,它是unicode和字符串是不可变的。我试过获得它的byre数组表示,将其更改为cp866,然后更改为utf8,我尝试使用它,因为它是cp866本身,但没有成功。

使用实体框架和MySQL读取时将VARCHAR作为二进制访问

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

@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;

在这些之后,你知道,它们是你的数据库和/或表在count中的确切编码。


我的解决方案来修复发现的问题只是一个链接到一个有趣的源代码。请看看这篇文章是否有什么相关的东西要讲:

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


p。是的,我可以读取url,它表示转换latin1 -> utf8,但对于我的理解相同的技巧也将适用于其他字符编码对