我有一个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
答案 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
(请在测试环境中进行实验,而不是在生产环境中进行实验。)