c#mysql AddWithValue unicode

时间:2015-04-25 19:23:03

标签: c# mysql unicode

我现在正在使用C#和MySQL。我试图在互联网上搜索一天,找出为什么我不能使用AddWithValue方法添加unicode字符,因为当我在MySQL中手动添加它时,它的工作原理!但是回到带有MySQL连接器的C#代码中,它不起作用。除了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 =“ສະບາຍດີ”,它将是“???????”在数据库中。 请T ^ T

3 个答案:

答案 0 :(得分:2)

此链接可以帮助您吗?

read/write unicode data in MySql

基本上它说,你应该用charset = utf8附加你的连接字符串;

像这样: ID = my_user;密码= MY_PASSWORD;数据库= some_db123;字符集= UTF8;

答案 1 :(得分:0)

您必须确保进程的每个级别都支持unicode字符,从输入到C#到存储在MySql中的列。

C#级别很简单,因为默认情况下字符串已经是utf-16。只要您不使用某些奇怪的gui工具包,从错误的文件或网络流中读取,或在没有unicode支持的奇怪的控制台应用环境中运行,您就会处于良好的状态。

下一层是参数定义。无论如何,你在这里better off avoiding the AddWithValue() method。该链接属于Sql Server,但同样的推理也适用于MySql,即使MySql对您的数据的严格程度要低于应有的数据。您应该使用Add()覆盖,让您明确声明参数类型为NVarChar,而不是让ADO.Net提供程序尝试猜测。

接下来是应用程序和数据库之间的连接。在这里,您希望make sure to include the charset=utf8 clause(或更好)作为连接字符串的一部分。

然后我们需要考虑数据库本身的整理。您必须确保MySql中的NVarChar列能够支持您的数据。上一个链接问题的答案之一也包括如何处理这个问题。

最后,请确保使用NVarChar类型定义列,而不是VarChar

答案 2 :(得分:0)

是的,utf8在所有阶段 - 客户端中的字节编码,线路上的转换(charset = utf8)以及列上。我不知道C#在暴露字符之前是否从utf16转换为utf8;如果没有,那么charset = utf16(或没有设置)可能是正确的步骤。

由于您有多个?,可能的原因是尝试将非latin1字符转换为CHARACTER SET latin1列。由于latin1没有老挝代码,?被替换。可能你没有对该列说什么,但依赖于表和/或数据库上的DEFAULT,这恰好是latin1。

ສະບາຍດີ丢失,无法从???????恢复。

更改内容后,请执行SELECT col, HEX(col) ...检查是否已正确存储。对于字符串ສະບາຍດີ,您应该获得十六进制E0BAAAE0BAB0E0BA9AE0BAB2E0BA8DE0BA94E0BAB5。注意那是E0BAxx的组,这是老挝语的utf8值的范围。

如果您仍然遇到麻烦,请提供HEX以便进一步分析。