2015-11-16 5 views
-1

У меня возникла проблема с записью строки в базу данных mysql, содержащую символ utf-8. Все до того, как персонаж будет записан в таблицу, но персонаж и все, что его там не будет.C# MySql Not Writing utf-8 Characters

Я проверил набор символов базы данных, а значение по умолчанию - utf8_general_ci, а по умолчанию - utf8. Столбец, который записывается, относится к типу longtext со сверткой utf8_general_ci.

Я также попытался добавить SET NAMES utf8; к запросу, но это не изменило результат.

Вот пример кода, запуска:

using (var cmd = new MySqlCommand("insert into tablename (BodyText) values (@p1)", connection as MySqlConnection) { CommandType = CommandType.Text }) 
{ 
    cmd.Parameters.Add("@p1", BodyText); 
    cmd.ExecuteNonQuery(); 
} 

Строка соединения:

"SERVER=xx;DATABASE=xx;USER=xx;PASSWORD=xx;Pooling=true;Validate Connection=true;CHARSET=UTF8" 

И текст, который пытается написать в таблице «Спасибо я! видел его как текст, а то, что написано на столе, - «Спасибо, я видел это как 2».

Любая помощь по этому вопросу будет оценена по достоинству.

Обновление: после дальнейших исследований проблема заключается в том, что базовая кодировка utf8 в MySql не поддерживает 4-байтные символы (из которых). Решения для этого - либо обновить базу данных MySql, чтобы использовать utf8mb4, либо удалить символы из строки перед записью в таблицу. Проблема со вторым решением заключается в большой базе кода, которую эта проверка должна быть выполнена везде, где текст записывается в базу данных. Любые предложения о том, как справиться с этой проблемой, приветствуются.

ответ

0

Вы можете вероятно этого изменения от utf8 к utf8mb4 в таблице без потери или коверкая любые данные:

ALTER TABLE tbl MODIFY COLUMN col ... CHARACTER SET utf8mb4 ...; 

(где «...» является материал, в настоящее время используется для определения столбец, такой как LONGTEXT.) Возможно, вы захотите указать сортировку одновременно.

Если это не удается, это вероятно, будет работать:

ALTER TABLE Tbl MODIFY COLUMN col LONGBLOB ...; 
ALTER TABLE Tbl MODIFY COLUMN col LONGTEXT ... CHARACTER SET utf8mb4 ...; 

Если col в каких-либо индексов, вы можете DROP INDEX в первом Альтера и ADD INDEX во втором. (Это для эффективности и, возможно, для предотвращения ограничений индекса.)