C# 字符串值不正确:'\xC2\x9Fe 10…&x27;专栏
我们有一个旧的5.1 Mysql服务器运行在Server2003上。最近,我们使用Mysql 5.6和server 2008迁移到了一个更新的环境。现在在新服务器上,我们在插入特殊字符(如“Ô)时不断出错 现在我已经检查了源代码编码,它是UTF-8。但是旧的Mysql服务器被配置为latin1(server/tables/colonms),带有latin_-swedish_-ci排序规则,我们在旧环境中没有收到任何错误 现在我已经做了一些测试,因为我们不是生活在新的环境中。我已尝试将所有表格设置为tables/colonms以及latin1。在这两种情况下,我总是会遇到这些错误 我注意到,在旧服务器上,服务器的默认字符集是latin1,在新服务器上是utf-8。这可能是问题所在吗?我觉得这很奇怪,因为源代码是utf-8 是否有一些可以在旧环境中打开的选项来处理此问题?我不确定是否存在类似的情况。我确实比较了mysql管理工具中的设置,除了默认的字符集,它看起来是一样的 编辑:C# 字符串值不正确:'\xC2\x9Fe 10…&x27;专栏,c#,mysql,character-encoding,mysql-odbc-connector,C#,Mysql,Character Encoding,Mysql Odbc Connector,我们有一个旧的5.1 Mysql服务器运行在Server2003上。最近,我们使用Mysql 5.6和server 2008迁移到了一个更新的环境。现在在新服务器上,我们在插入特殊字符(如“Ô)时不断出错 现在我已经检查了源代码编码,它是UTF-8。但是旧的Mysql服务器被配置为latin1(server/tables/colonms),带有latin_-swedish_-ci排序规则,我们在旧环境中没有收到任何错误 现在我已经做了一些测试,因为我们不是生活在新的环境中。我已尝试将所有表格设
+--------------------------+-----------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------+
| character_set_client | utf8 | *
| character_set_connection | utf8 | *
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 | *
| character_set_server | latin1 |
| character_set_system | utf8 |
+--------------------------+-----------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------+
| character_set_client | utf8mb4 | *
| character_set_connection | utf8mb4 | *
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 | *
| character_set_server | utf8 |
| character_set_system | utf8 |
显示变量,如“char%”
旧服务器:
+--------------------------+-----------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------+
| character_set_client | utf8 | *
| character_set_connection | utf8 | *
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 | *
| character_set_server | latin1 |
| character_set_system | utf8 |
+--------------------------+-----------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------+
| character_set_client | utf8mb4 | *
| character_set_connection | utf8mb4 | *
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 | *
| character_set_server | utf8 |
| character_set_system | utf8 |
新服务器:
+--------------------------+-----------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------+
| character_set_client | utf8 | *
| character_set_connection | utf8 | *
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 | *
| character_set_server | latin1 |
| character_set_system | utf8 |
+--------------------------+-----------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------+
| character_set_client | utf8mb4 | *
| character_set_connection | utf8mb4 | *
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 | *
| character_set_server | utf8 |
| character_set_system | utf8 |
据我从MySQL站点上的文章中了解,utf8mb4是utf8的一个超集,我认为这不会给编码带来问题,因为它们在编码上基本相同,对吧?当我将我的应用程序移动到新环境时,我经历过一次。我在向表中插入与要插入的数据相关的数据时遇到了一些奇怪的事情,我的案例中它抱怨日期为空,因此无法将其插入表中(源代码没有更改。只有新的env(Mysql服务器从5.1到5.6,tomcat 6到tomcat 7,新的Suse服务器版本) 我尝试将mysql连接器驱动程序替换为我的应用程序的更新版本,它解决了这个问题
SHOW VARIABLES;
latin1
;5.6默认为utf8
。这在
mysql> SHOW VARIABLES LIKE 'char%';
+--------------------------+-----------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------+
| character_set_client | utf8 | *
| character_set_connection | utf8 | *
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 | *
| character_set_server | latin1 |
| character_set_system | utf8 |
设置名称utf8;
设置三条标记线
Ã
在拉丁语中是十六进制C3
,在utf8中是C383
。执行此操作可查看表中当前的内容:
SELECT col, HEX(col) FROM table WHERE ...
SELECT
,并且结果不同,则迁移是不好的。由于移动数据的方法很多,请提供迁移的详细信息,以便我们分析可能出现的错误C29F
。这是一个奇怪的问题——它是一个控制代码应用程序命令
,我从未听说过。(注意:它与你后面提到的Ã
无关。)请提供更多的问题示例;这些线索都没有帮助ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
之前别忘了备份
来源:这其中的重要部分是您的旧服务器具有:
| character_set_database | latin1
而您的新服务器
| character_set_database | utf8
连接和客户端是否使用utf8并不重要如果数据库使用latin1,表将默认为latin1,因此数据将存储在latin1中,您将得到错误。当然,您可以显式地将任何表的字符集和排序规则设置为数据库默认值以外的值
我猜在迁移数据库模式时,在运行迁移脚本之前,没有编辑数据库或表的字符编码
现在,您可以手动更改数据库和每个表,也可以编辑迁移脚本并重新运行它。大多数迁移脚本和数据库转储将包括每个表和数据库的特定字符集,即使它们都相同。我刚检查过,但我们有最新的mysql连接器odbc 5.3.4 insta在机器上加载。请参阅我的编辑。我已经添加了来自服务器的两个输出。我在新数据库上有一个测试数据库,并将插入一些测试数据,以便为您获得更多的结果/案例。是的,utf8mb4比utf8“更好”。不过,需要在整个MySQL中保持一致。
C29Fe的“Ô上下文是什么(仍然Ã
在两个字符集中都有效,C29F(我认为)在这两个字符集中都无效。)据我所知,这在新服务器上起作用。但问题仍然没有解决,那就是为什么它在旧服务器上起作用。在脚本中,我说使用与源相同的设置。因此,我认为它将与旧服务器上的工作相同?或者版本之间的编码是否有差异?