我的MySQL数据库可以存储欧元符号(如我使用原生MySQL客户端(HeidiSQL)测试过)。但是,使用的MySQL .NET连接器时,我的ASP.NET应用程序无法从数据库中插入或读取它:我只能得到一个?字符。可能的原因是什么?
我的MySQL数据库可以存储欧元符号(如我使用原生MySQL客户端(HeidiSQL)测试过)。但是,使用的MySQL .NET连接器时,我的ASP.NET应用程序无法从数据库中插入或读取它:我只能得到一个?字符。可能的原因是什么?
这通常可以解决MySQL Connector/NET中的大多数与编码相关的问题。Server=localhost;Database=schema;Uid=foo;Pwd=bar;CharSet=utf8;
我认为MySQL .NET连接器在连接时设置了一些与排序规则相关的环境变量; 在HeidiSQL和.NET上比较这些查询的输出:
SHOW VARIABLES LIKE "character_set_%";
SHOW VARIABLES LIKE "collation_%";
所有的内容都应该包含utf8-something。如果没有,你可以在运行时按照手册中的指示进行更改。
System.Web.HttpUtility.HtmlEncode()
System.Web.HttpUtility.HtmlDecode()
假设您正在将欧元符号插入到 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...
我曾经遇到过类似的问题,尝试从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"))));
...
}
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
或者 charset=iso-8859-15
,而不是charset=iso-8859-1
。