我现在正在使用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
答案 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以便进一步分析。