我的 MySQL 数据库可以很好地存储欧元符号(正如我使用本地 MySQL 客户端 (HeidiSQL) 测试过的那样)。但是使用 MySQL .NET 连接器,我的 ASP.NET 应用程序正在使用我无法从数据库中插入或读取它:我只能得到一个 ? 性格回来了。可能的原因是什么?
6 回答
我建议在连接字符串中明确指定编码:
服务器=localhost;数据库=schema;Uid=foo;密码=bar;字符集=utf8 ;
它通常用 MySQL 的 Connector/NET 解决大多数与编码相关的问题。
我会说 MySQL .NET 连接器在连接时设置了一些与排序规则相关的环境变量;在 HeidiSQL 和 .NET 上比较这些查询的输出:
SHOW VARIABLES LIKE "character_set_%";
SHOW VARIABLES LIKE "collation_%";
它们都应该包含 utf8-something。如果没有,您可以在运行时更改它们,如手册中所述。
以下 .Net 命令可以为您的数据库对这些进行编码,然后将它们解码为原始符号...
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