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

Posted

技术标签:

【中文标题】MySql 的异常:变量 \'character_set_client\' 不能设置为 \'utf16\' 的值【英文标题】:MySql's Exception : Variable 'character_set_client' can't be set to the value of 'utf16'MySql 的异常:变量 'character_set_client' 不能设置为 'utf16' 的值 【发布时间】:2011-09-18 04:03:57 【问题描述】:

以前我使用 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”的值 错误消息指出此错误发生在连接期间。Open();

当我不断刷新错误页面时,有时会出现另一个错误。就是这样:

异常详细信息:MySql.Data.MySqlClient.MySqlException:预期数据包结束 错误消息指出此错误发生在 Mydtr = cmdselect.ExecuteReader();

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

有人知道解决办法吗?非常感谢您的帮助。我已经尝试了 4 天,但无法解决。

【问题讨论】:

能否请您检查并告诉我们您的数据库中的 character_set_client 变量值是什么,您可以使用 mysql 查询来查看它:SHOW VARIABLES LIKE "character%" 嗨 Etienne Rached,我已经检查过 ^^ 它们都在 utf8 中。我已经在您的教程中发布了您的回复^^。这是链接:codeproject.com/Messages/3932728/Re-i-got-some-bugs.aspx 我遇到了类似的问题,我的字符集是 latin1,在过去是默认的。我在有问题的查询中的表和列上更改为 utf8,问题就消失了。不知道为什么 latin1 会导致问题,除了可能有些表是 utf8 而其他表是 latin1 并且它不喜欢混合 【参考方案1】:

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

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

解决方法:下载navicat,修改数据库和每张表的字符集。

您需要检查 2 个地方:

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

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

供您参考:这是非常罕见的情况。我谷歌它几乎找不到解决方案。我在安装Mysql的时候出现了这个错误,我选择了utf16格式>

顺便说一句,简单的连接字符串就可以了。喜欢

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

【讨论】:

【参考方案2】:

您好,以上几点。

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

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

    客户端连接数据库 数据库本身

在客户端,它使用以特定格式编码的查询调用对 DB 的查询,并且完整的服务器必须理解这些查询并以客户端可以依次理解的特定格式响应。

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

Charset=utf8;

反过来,您必须检查数据库和表(您正在寻求查询事务的)字符集和排序规则

为了灵活性,MySQL 服务器上有四级编码字符集和排序规则

    整个服务器 server_character_set 的字符集 数据库字符集 表格字符集 表格列的字符集也是如此

您可以使用以下查询检查这些值

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

所以,关键是数据库服务器以连接字符串中指定的编码读取这些查询。

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

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

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

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

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

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

【讨论】:

【参考方案3】:

可能是您尝试与 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

【讨论】:

感谢您的帮助..我已经尝试过了,但我得到了另一个错误。我已经用谷歌搜索过了。但找不到任何解决方案:异常详细信息:System.Collections.Generic.KeyNotFoundException:字典中不存在给定的键。【参考方案4】:

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

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

希望这能解决 key not found 异常。

【讨论】:

以上是关于MySql 的异常:变量 'character_set_client' 不能设置为 'utf16' 的值的主要内容,如果未能解决你的问题,请参考以下文章

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

mysqldump恢复数据库不成功

MySQL异常总结

用户变量问题

MySQL安装详细说明

莫名奇妙的异常009:mysql row size too large>8126