c# mysql AddWithValue unicode

c# mysql AddWithValue unicode

我现在正在使用 C# 和 MySQL。我试图在互联网上搜索一天,以找出为什么我不能使用 AddWithValue 方法添加 unicode 字符,因为当我在 MySQL 中手动添加它时,它起作用了!但是回到带有 MySQL .NET 连接器的 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

这个link对你有帮助吗?

read/write unicode data in MySql

基本上它是说,您应该在连接字符串后附加 charset=utf8;

像这样: id=my_user;密码=my_password;数据库=some_db123;字符集=utf8;

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

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

下一层是参数定义。无论如何,你是 better off avoiding the AddWithValue() method。 link 适用于 Sql 服务器,但同样的推理适用于 MySql,即使 MySql 对您的数据没有应有的那么严格。您应该使用 Add() 覆盖,让您明确地将参数类型声明为 NVarChar,而不是让 ADO.Net 提供者尝试猜测。

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

然后我们需要考虑数据库本身的排序规则。您必须确保 MySql 中的 NVarChar 列能够支持您的数据。上一个 link 问题的答案之一也涵盖了如何处理此问题。

最后,确保列是用 NVarChar 类型定义的,而不仅仅是 VarChar.

是的,在所有阶段都是 utf8 -- 客户端中的字节编码、线上转换 (charset=utf8) 和列上。我不知道 C# 是否在公开字符之前从 utf16 转换为 utf8;如果没有,则 charset=utf16(或无设置)可能是正确的步骤。

因为您有多个 ?,可能的原因是试图将非 latin1 字符转换为 CHARACTER SET latin1 列。由于 latin1 没有老挝代码,因此 ? 被替换。可能你对专栏什么也没说,而是依赖于 table and/or 数据库上的 DEFAULT,它恰好是 latin1.

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

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

如果您仍然遇到问题,请提供HEX以供进一步分析。