通过c#/ Dapper

时间:2019-02-12 15:39:08

标签: c# mysql utf-8 dapper

我有一个MySQL数据库,据我所知。这是一个最初由Ruby on Rails应用程序单独使用的数据库,编写和读取utf8字符没有问题。

但是,当尝试使用Dapper通过c#应用程序进行读取时,我看到很多不良字符,例如:

预期:FELIZ AÑO 实际:FELIZ AÑO

我的连接字符串如下:

Server=;Database=;Uid=;Pwd=;Port=;SslMode=;charset=utf8;

我已经尝试了字符集和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

enter image description here

1 个答案:

答案 0 :(得分:2)

好,那只是Mojibake。

HEX:  46 45 4C 49 5A 20 41 C383 E28098 4F
      F  E  L  I  Z (sp) A  Ã      ‘   O
Mojibaked:  FELIZ AÑO
Should be:  FELIZ AÑO

预防的说明位于Trouble with UTF-8 characters; what I see is not what I stored的“ Mojibake”中

阻止它之后,一种“修复”数据的方法将涉及UPDATE从而更改列内容:

col = CONVERT(BINARY(CONVERT(col USING latin1)) USING utf8mb4)

您可以通过以下方式查看该信息:

SELECT CONVERT(BINARY(CONVERT('FELIZ AÑO' USING latin1)) USING utf8mb4); -- FELIZ AÑO

(请在测试环境中进行实验,而不是在生产环境中进行实验。)