MySQL :: Connector/Net欧元符号

4

我的MySQL数据库可以存储欧元符号(如我使用原生MySQL客户端(HeidiSQL)测试过)。但是,使用的MySQL .NET连接器时,我的ASP.NET应用程序无法从数据库中插入或读取它:我只能得到一个?字符。可能的原因是什么?


也许这里已经有答案了:https://dev59.com/f0rSa4cB1Zd3GeqPUjgs - Gonzalo
6个回答

5
我建议在连接字符串中明确指定编码方式:

Server=localhost;Database=schema;Uid=foo;Pwd=bar;CharSet=utf8;

这通常可以解决MySQL Connector/NET中的大多数与编码相关的问题。

charset参数仅影响从应用程序发送的查询;返回结果的字符集不受影响。您确定包含欧元符号的表的排序规则正确吗?如果您将欧元符号放入标记为UTF-8的表中作为不正确的单字节,则MySQL不会发出警告(它只是无法正确排序)。一个Unicode-naïve客户端(也许是HeidiSQL?)可以正常检索字节并错误地将其视为欧元,但Connector/NET会尝试并失败将其视为UTF-8。 - bobince

2

我认为MySQL .NET连接器在连接时设置了一些与排序规则相关的环境变量; 在HeidiSQL和.NET上比较这些查询的输出:

SHOW VARIABLES LIKE "character_set_%"; 
SHOW VARIABLES LIKE "collation_%";

所有的内容都应该包含utf8-something。如果没有,你可以在运行时按照手册中的指示进行更改。


0
以下的 .Net 命令可以对它们进行编码,然后将其解码为原始符号,适用于数据库。
System.Web.HttpUtility.HtmlEncode()

System.Web.HttpUtility.HtmlDecode()

6
将HTML编码的字符串存储在数据库中是一个非常糟糕的想法。类似截取和比较的数据库级别的字符串操作将失败。此外,HtmlEncode无法对Latin-1范围以外的Unicode字符进行实体编码。 - bobince

0

假设您正在将欧元符号插入到 NVARCHAR 类型的字段中,否则您将无法使用其他客户端正确地插入和检索欧元符号?

您在 SQL 语句中使用了正确的语法来插入和检索 Unicode 数据吗?

要做到这一点,您必须在任何 Unicode 字符串之前使用 N 指定符字符,否则它将被静默转换为单字节编码并成为不可读的字符,例如:

//Inserting Unicode data
MySqlCommand cmd = new MySqlCommand();
cmd.CommandText = "INSERT INTO SOME_TABLE (someField) VALUES (N'@text')";
cmd.Parameters.Add("text", "Some Unicode Text");
cmd.Connection = conn;
cmd.ExecuteNonQuery();

//Selecting Unicode data
MySqlCommand select = new MySqlCommand();
select.CommandText = "SELECT * FROM SOME_TABLE WHERE someField=N'@text'";
cmd.Parameters.Add("text", "Some Unicode Text");
cmd.Connection = conn;
//Execute your query and process your Results...

0

我曾经遇到过类似的问题,尝试从Sybase 12.5导入数据到MS SQL Server 2005。

基本上,如果正确编码,MSSQL可以在varchar中很好地存储£和欧元符号,这很棒,但我没有意识到的是,Sybase将数据输出为windows-1252(西欧)而不是UTF-8,这导致像£和欧元符号这样的数据被导入程序翻译成“?”。告诉导入程序传入的数据是以1252编码的就可以解决这个问题。

例如:

如果你在读取时将DB的输出编码为1252,你应该能得到正确的符号。

System.Text.Encoding enc = System.Text.Encoing.GetEncoding(1252);
MySqlDataReader msdr = command.ExecuteReader();
while(msdr.Read())
{
    ...
    string val = enc.GetString(enc.GetBytes(msddr.GetString(mssdr.GetOrdinal("varhcar_field"))));
    ...
}

-1
你在输出页面中正确设置了字符集吗?例如像这样的代码:<META http-equiv="Content-Type" content="text/html; charset=UTF-8"> 或者 charset=iso-8859-15,而不是charset=iso-8859-1

在 iso-8859-1 Unicode 下,€ 将显示为 "€",这绝对不是 "?"。 - sanmai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接