MySql的异常:变量'character_set_client'不能设置为'utf16'的值

时间:2011-06-19 14:01:13

标签: c# asp.net mysql

以前我使用 sql server 2005 作为我的网站数据库,一切运作良好。 现在我已经改为 MySql server 5.5 数据库,因为它是开源的。

我使用Navicat Premium将我的数据从sql server传输到mysql。我使用mysql workbench和navicat来管理我的数据库。当我声明与mysql数据库的连接时出现问题。这是我的代码:

    MySqlCommand cmdselect;
    MySqlConnection conNDB;
    MySqlDataReader Mydtr;
    string server = "localhost";
    string database = "maindb";
    string uid = "root";
    string password = "abc123";
    string strCon = "SERVER=" + server + ";" + "DATABASE=" +
    database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";";
    string strSelect = "SELECT * FROM announcement"; 

    conNDB = new MySqlConnection(strCon);
    conNDB.Open();
    cmdselect = new MySqlCommand(strSelect, conNDB);
    Mydtr = cmdselect.ExecuteReader();

    rptAnnounce.DataSource = Mydtr;
    rptAnnounce.DataBind();

    Mydtr.Close();
    conNDB.Close();

已设置MySql.Data的引用。在这里我收到此错误消息:

  

异常详细信息:   MySql.Data.MySqlClient.MySqlException:   变量'character_set_client'不能   设置为'utf16'的值   错误消息说明在connection.Open();

期间发生此错误

当我继续刷新错误页面时,我有时会收到另一个错误。这是它:

  

异常详细信息:MySql.Data.MySqlClient.MySqlException:数据包的预期结束   错误消息声明在Mydtr = cmdselect.ExecuteReader();

期间发生此错误

我是mysql的新手。我不知道这是什么问题。我想这个问题来自数据库的设置或数据,而不是我的源代码。

有谁知道解决方案?非常感谢您的帮助。我一直试着4天但是无法解决。

4 个答案:

答案 0 :(得分:3)

解决!!感谢@Etienne Rached和@jeremi

所有问题都来自字符集问题。

解决方案:下载navicat,更改数据库和每个表的字符集。

您需要检查两个地方:

1)右键单击数据库,例如。 MYDB。然后选择属性并设置字符集

2)右键单击表格并选择设计表格。单击每一行以更改字符集,最后转到“选项”选项卡并更改字符集。

您的信息:这是非常罕见的情况。我google它几乎找不到解决方案。我在安装Mysql时创建了这个错误,我选择了utf16格式><

顺便说一句,简单的连接字符串将起作用。喜欢

"server=localhost;database=maindb;uid=root;pwd=abc123;CharSet=utf8; port=3306";

答案 1 :(得分:3)

嗨,加上以上几点。

从MySQL 5.5版本开始,它不支持utf16或utf32字符集编码。

有两件事需要从两个方面来看待

  1. 与DB建立连接的客户
  2. DB本身
  3. 在客户端,它使用以特定格式编码的查询调用DB查询,服务器必须完整地理解这些查询并以特定格式响应,客户端可以依次理解。

    第1点:所以我们需要在客户端级别设置charset,在连接字符串中设置为

    Charset=utf8;
    

    反过来,您必须检查数据库和表(您正在寻求查询事务)charset和collat​​ion

    MySQL服务器上有四级编码charset和collat​​ion用于灵活性

    1. 整个服务器server_character_set的Charset
    2. Charset for Database
    3. Charset for Table
    4. Table列的Charset以及
    5. 您可以使用以下查询检查这些值

      show variables like 'character%';
      show variables like '%collation%';
      

      因此,重点是DB服务器以连接字符串中指定的编码读取这些查询。

      第2点除了在连接字符串中指定字符集外,还可以在打开连接后在查询中设置客户端(服务器中断)的字符集

      set names 'charset';
      Ex: set names 'utf8';
      

      从客户端到服务器的charset特定问题中,有3个服务器参数很重要 character_set_client - 服务器为客户端设置指定的字符集 - 传递给的查询 character_set_connection - 服务器为连接事务设置指定的字符集 character_set_results - 服务器为返回的结果设置指定的字符集,从DB到客户端的错误消息

      第3点您可以在DB中设置这些变量,而不是第1点和第2点,以确保正确的客户端服务器事务

      基本上,客户端和DB(服务器,数据库表,列)编码和排序规则类型必须类似,以避免数据库事务期间的数据丢失。

      希望这会有所帮助.....

答案 2 :(得分:2)

可能是你正在尝试与utf16交谈,但数据库只是改编了utf8或其他一些。

尝试将此添加到您的连接字符串中:

Character Set=utf8

我的连接字符串如下所示:

"server=" + settings.DatabaseHost + 
";User Id=" + settings.DatabaseUsername +
";password="+ settings.DatabasePassword +
";database="+ settings.DatabaseName+
";Persist Security Info=True" +
";Connect Timeout=5;Default Command Timeout=10" +
";Character Set=utf8";

如果不起作用,请尝试ASCII或latin1

答案 3 :(得分:1)

如果在将连接字符串字符集升级为utf8mb4后尚未升级MySql客户端库,则可能会出现此错误“异常详细信息:System.Collections.Generic.KeyNotFoundException:”

请将MySql.data.dll库版本更新为最新的6.6.5.0

希望这可以解决未找到密钥的异常。