【发布时间】:2019-07-06 07:31:33
【问题描述】:
我有一个 MySQL 数据库,据我所知,它可以通过和通过 utf8 进行判断。它是一个最初仅由 Ruby on Rails 应用程序使用的数据库,在写入和读取 utf8 字符时没有问题。
但是,当尝试使用 Dapper 通过 c# 应用程序读取时,我看到了很多错误字符,例如:
预期:FELIZ AÑO
实际:FELIZ AÑO
我的连接字符串如下所示:
Server=;Database=;Uid=;Pwd=;Port=;SslMode=;charset=utf8;
我尝试了几种 charset 和 utf8 大写的组合,但到目前为止都没有奏效。我在一个线程中读到,连接字符串中的字符集只影响 SQL 查询语言,所以如果这是正确的,那就是它没有帮助的原因!
还有什么我可能遗漏的吗?或者我可以做些什么来正确读取字符?
更新:来自 MySQL 的一些信息:
mysql> SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME, COLUMN_TYPE
-> FROM information_schema.columns
-> WHERE TABLE_NAME = 'pages'
-> AND COLUMN_NAME = 'title';
| TABLE_NAME | COLUMN_NAME | CHARACTER_SET_NAME | COLLATION_NAME | COLUMN_TYPE |
| pages | title | utf8 | utf8_general_ci | varchar(255) |
更新 2: 更多信息,看来我的字符集有点混乱..
mysql> show variables like "character_set_%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
mysql> select collation_name from information_schema.columns where table_name = 'pages' and column_name = 'title';
+-----------------+
| collation_name |
+-----------------+
| utf8_general_ci |
+-----------------+
mysql> select title from pages where id = 3660;
+--------------------------------+
| title |
+--------------------------------+
| FELIZ AÑO |
+--------------------------------+
mysql> set character set 'latin1';
mysql> select title from pages where id = 3660;
+-----------------------------+
| title |
+-----------------------------+
| FELIZ AÑO |
+-----------------------------+
所以,数据库是latin1,默认连接是utf8,默认客户端是utf8,列是utf8。
如果我直接在mysql中查询该列,直到我将字符集设置为latin1才会出现错误。
在 C# 中使用 Execute 设置字符集并使用 ExecuteReader 读取列执行完全相同的操作,但仍会产生错误字符。试图找出差异。
更新 3 - @BradleyGrainger 的屏幕截图,来自 SequelPro
【问题讨论】:
-
Dapper 只是向 ADO.NET 询问来自数据读取器的值,这是 MySQL 特定的 - 它不做任何解释,所以:如果特定提供者的数据读取器无法解释数据,这将影响位于 ADO.NET 之上的任何工具
-
是的;我认为当您尝试修复配置时,您可能只想使用使用
ExecuteScalar的基本DbCommand进行测试 - 直到获得正确的值,所有赌注都关闭;遗憾的是,我对 MySQL 配置了解不多(无论是在列级别,还是在连接字符串中),所以我不能直接建议 -
您能否粘贴来自 MySQL Workbench 的屏幕截图,显示表中的值已正确编码?您的数据库实际上可能包含
FELIZ AÑO(以 UTF-8 编码)并且 Ruby on Rails 正在双重对其进行解码以获得所需的字符串。 -
您正在遭受 Mojibake 的困扰,或者可能是“双重编码”。
-
请提供`select HEX(title) from pages where id = 3660;