11

我们有一个旧的 5.1 Mysql 服务器在服务器 2003 上运行。最近我们使用 Mysql 5.6 和服务器 2008 迁移到一个新的环境。现在在新服务器上,当插入特殊字符(如“Ô)时,我们不断收到错误消息。

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

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

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

是否有一些可以在旧环境中打开的选项来处理这个问题?我不确定是否存在类似的东西。我确实比较了 mysql 管理工具中的设置,除了默认的字符集之外,它看起来是一样的。

编辑:

显示像'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 的超集,我认为这不应该给编码带来问题,因为它们在编码上基本相同,对吧?

4

4 回答 4

2
  1. 首先,由于旧环境可以正常工作,因此首选是在新环境中使用相同的“字符集”设置。如果您仍然可以访问 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;设置三个标记的行。

ÃC3是latin1 和C383utf8 中的十六进制。更多编码在这里。执行此操作以查看表中当前的内容:

SELECT col, HEX(col) FROM table WHERE ...
  1. 另一种可能性是“移动”破坏了数据。如果你可以SELECT在两台机器上做同样的事情,并且如果它们的结果不同,那么迁移就很糟糕。由于有很多方法可以移动数据,请提供迁移的详细信息,以便我们剖析可能出了什么问题。

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

于 2015-06-29T16:38:45.187 回答
2

MySQL的旧 UTF-8不是真正的 UTF-8。如果您尝试使用“特殊”字符(日语或中文),您可能会在旧服务器上看到方块或问号。

您的新服务器现在真正使用 UTF-8(mb4 代表多字节 4)。服务器接收 UTF-8 字符,但显然不能存储 UTF-8 字符,因为您的表未使用 UTF-8。将所有表转换为 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;

之前不要忘记备份。

来源:https ://stackoverflow.com/a/6115705/1980659

于 2015-07-03T15:02:18.770 回答
1

其中重要的部分是您的旧服务器具有:

| character_set_database   | latin1 

当你的新服务器有

| character_set_database   | utf8 

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

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

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

于 2015-07-05T01:53:25.100 回答
0

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

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

于 2015-06-23T14:37:23.837 回答