不正确的字符串值:“\xC2\x9Fe 10...”列

Incorrect string value: '\xC2\x9Fe 10...' for column

我们在服务器 2003 上有一个旧的 5.1 Mysql 服务器 运行。最近我们搬到了一个更新的环境 Mysql 5.6 和服务器 2008。现在我们在新服务器上保留插入特殊字符如 'Ã' 时出错。

现在我检查了源编码,是UTF-8。但是旧的 Mysql 服务器被配置为 latin1(Server / tables / colonms) with collat​​ion latin_swedish_ci 并且我们在旧环境中没有收到任何错误。

现在我已经做了一些测试,因为我们不在新环境中。我尝试将所有表设置为表/冒号以及 latin1。在这两种情况下,我都不断收到这些错误。

我注意到,在旧服务器上,服务器默认字符集是 latin1,在新服务器上是 utf-8。这可能是问题所在吗?我觉得这很奇怪,因为来源是 utf-8。

是否有一些可以在旧环境中打开的选项来处理这个问题?我不确定是否存在类似的东西。我确实比较了 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                                          |

新服务器:

+--------------------------+-----------------------------------------------+
| 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 的超集,我认为这不应该对编码造成问题,因为它们在编码方面基本相同,对吗?

当我将我的应用程序移动到新环境时,我得到了一个经验。在插入与要插入到 table 的数据相关的数据时,我遇到了一些奇怪的事情,我的情况是它抱怨日期为空,因此无法插入到 table(源代码没有变化。只有新的env(Mysql 服务器从 5.1 到 5.6,tomcat 6 到 tomcat 7,新的 Suse 服务器版本。

我尝试将 mysql 连接器驱动程序替换为我的应用程序的较新版本,它解决了问题。

  1. 首先,由于旧环境运行正常,首选是在新环境中使用相同的 "character set" 设置。如果您仍然可以访问 5.0 服务器,请获取 SHOW VARIABLES;.

5.0默认为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                                          |

SET NAMES utf8; 设置三个标记行。

à 在 latin1 中是十六进制 C3,在 utf8 中是 C383More encodings here。执行此操作以查看当前在 table:

中的内容
SELECT col, HEX(col) FROM table WHERE ...
  1. 另一种可能性是 "move" 破坏了数据。如果您可以在两台机器上执行相同的操作 SELECT,并且它们的结果不同,那么迁移就很糟糕。由于移动数据的方法有很多,请提供迁移的详细信息,以便我们分析可能出了什么问题。

  2. 在您的标题中,您有 C29F。那是一个奇怪的 -- 它是一个我从未听说过的控制代码 APPLICATION PROGRAM COMMAND。 (注:与你后面提到的Ã没有关系。)请多提供问题的例子;这些线索都没有帮助。

old UTF-8 of MySQL 不是真正的 UTF-8。如果您尝试 "special" 个字符(日文或中文),您可能会在旧服务器上看到方块或问号。

您的新服务器现在真正使用 UTF-8(mb4 代表多字节 4)。服务器接收 UTF-8 字符,但显然无法存储 UTF-8 字符,因为您的 table 未使用 UTF-8。将所有 table 转换为 UTF-8 并将数据库转换为 UTF-8,您将解决问题。

您可以使用:

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 

如果数据库使用 latin1,连接和客户端使用 utf8 并不重要,tables 将默认为 latin1,因此数据将存储在 latin1 中,您将收到错误消息.您当然可以将任何 table 的字符集和排序规则显式设置为不同于数据库默认值的字符集和排序规则。

我想当您迁移数据库架构时,您没有编辑数据库的字符编码,或者 运行 迁移脚本之前的 tables。

现在您可以手动更改数据库和每个 table,或者您可以编辑迁移脚本并重新运行它。大多数迁移脚本和数据库转储将包含每个 table 以及数据库的特定字符集,即使它们完全相同。