Неправильные символы utf8 при чтении базы данных MySQL через c # / Dapper - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть база данных MySQL, насколько я могу сказать utf8 насквозь.Эта база данных изначально использовалась исключительно приложением Ruby on Rails, у которого нет проблем с записью и чтением символов utf8.

Однако при попытке чтения через приложение ac # с помощью Dapper я вижу много плохих символовНапример:

Ожидаемый: 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  |
+-----------------------------+

Итак, база данных - латиноамериканская, по умолчанию используется соединение utf8, клиент по умолчанию - utf8, столбец - utf8.

Если я запрашиваю столбец непосредственно в mysql, произойдет сбой, пока я не установлю набор символов в latin1.

Делаем то же самое в C # с помощью Execute для установки набора символов и ExecuteReader для чтения столбцавсе еще производит плохих персонажей.Попытка разобраться в разнице.

Обновление 3 - Скриншот для @BradleyGrainger, это от SequelPro

enter image description here

1 Ответ

0 голосов
/ 13 февраля 2019

ОК, это просто Моджибаке.

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

Инструкции по предотвращению в "Моджибаке" Проблема с символами UTF-8;я вижу не то, что хранил

После того, как предотвратил это, один из способов "исправить" данные включал бы UPDATE для изменения содержимого столбца таким образом:

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

Вы можете увидеть это через:

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

(Пожалуйста, экспериментируйте в тестовой среде, а не на производстве.)

...