2015-04-25 3 views
1

Я работаю с C# и MySQL сейчас. Я попытался найти по всему Интернету целый день, чтобы узнать, почему я не могу использовать метод AddWithValue для добавления символов Юникода, потому что, когда я вручную добавляю его в MySQL, он работает! Но вернувшись в код C# с соединителем MySQL для .NET, он не работает. За исключением символов Юникода, все в порядке.C# mysql AddWithValue unicode

cmd.CommandText = "INSERT INTO tb_osm VALUES (@id, @timestamp, @user)"; 
cmd.Parameters.AddWithValue("@id", osmobj.ID); 
cmd.Parameters.AddWithValue("@timestamp", osmobj.TimeStamp); 
cmd.Parameters.AddWithValue("@user", osmobj.User); 
cmd.ExecuteNonQuery(); 

Например: osmbj.User = "ສະ ບາຍ ດີ", это будет "???????" в базе данных. Please T^T

+0

Какая у вас база данных charset, вы указываете эту кодировку в строке соединения? – GSerg

ответ

2

Эта ссылка поможет вам?

read/write unicode data in MySql

В основном это говорит, вы должны добавить строку соединения с chatset = utf8;

Нравится так: id = my_user; password = my_password; database = some_db123; charset = utf8;

+0

Большое спасибо, это очень меня спасает :) –

0

Вы должны быть уверены, что символы Юникода поддерживаются в на каждом уровне процесса, полностью от входа в C# до столбца, хранящегося в MySql.

Уровень C# прост, потому что строки уже utf-16 по умолчанию. Пока вы не используете какой-то странный набор инструментов gui, читаете из плохого файла или сетевого потока или работаете в странной среде приложений консоли без поддержки юникода, вы будете в хорошей форме.

Следующий уровень - это определение параметра. Здесь, во всяком случае, вы better off avoiding the AddWithValue() method. Ссылка относится к серверу Sql, но те же рассуждения относятся к MySql, даже если MySql менее строг с вашими данными, чем должен быть. Вы должны использовать переопределение Add(), которое позволяет явно объявить тип ваших параметров как NVarChar, вместо того, чтобы провайдер ADO.Net попытался угадать.

Далее следует соединение между вашим приложением и базой данных. Здесь вы хотите использовать make sure to include the charset=utf8 clause (или лучше) как часть строки подключения.

Тогда нам нужно подумать о сортировке самой базы данных. Вы должны быть уверены, что столбец NVarChar в MySql сможет поддерживать ваши данные. Один из ответов на вопрос по предыдущей ссылке также описывает, как справиться с этим.

Наконец, убедитесь, что столбец определен с помощью типа NVarChar, а не только VarChar.

+0

да, charset = utf8; это то, что я хочу. Спасибо за вашу поддержку :) –

0

Да, utf8 на всех этапах - байт-кодирование в клиенте, преобразование на провод (charset = utf8) и в столбце. Я не знаю, преобразует ли C# из utf16 в utf8, прежде чем подвергать символы; если это не так, то правильный шаг - charset = utf16 (или отсутствие настройки).

Поскольку вы получили несколько ?, вероятная причина заключается в том, чтобы преобразовать символы не-latin1 в столбец CHARACTER SET latin1. Поскольку latin1 не имеет кодов для Лао, ? был заменен. Вероятно, вы ничего не сказали о столбце, но зависели от DEFAULT от таблицы и/или базы данных, которая оказалась латинской.

ສະບາຍດີ утерян и не может быть восстановлен с ???????.

Как только вы изменили ситуацию, убедитесь, что она сохранена правильно, выполнив SELECT col, HEX(col) .... Для строки ສະບາຍດີ вы должны получить hex E0BAAAE0BAB0E0BA9AE0BAB2E0BA8DE0BA94E0BAB5. Обратите внимание, что это группы из E0BAxx, которые являются диапазоном значений utf8 для Lao.

Если у вас все еще есть проблемы, предоставьте HEX для дальнейшего анализа.

+0

благодарит за помощь и дает мне новые знания, но это charset = utf8; спасает меня :) –

Смежные вопросы