【问题标题】:MySQL incorrect string value error on MySQL 5.7 but not on 5.5MySQL 5.7 上的 MySQL 不正确的字符串值错误,但 5.5 上没有
【发布时间】:2024-04-29 23:10:03
【问题描述】:

在 PHP 应用程序中,我试图将电子邮件的内容保存在数据库中(表是 utf8mb4 和排序规则 utf8mb4_general_ci)。在我的开发环境中进行测试时,它运行良好,但在生产中我不断收到类似这样的错误:

General error: 1366 Incorrect string value: '\xC7ALHO-...' for column 'content_html' at row 1

我检查了一下,我意识到我在 dev 上安装了 MySQL 5.5,在 prod 上安装了 5.7,我在我的 dev 上升级了 mysql,现在我在 dev 上也遇到了错误。 问题是我不明白为什么我会收到这个错误,内容是一个非常标准的电子邮件,只有一个标题标志。 知道为什么这在 5.7 而不是 5.5 上失败了,是否有任何解决方法?

更新:这里是表格的 SHOW FULL COLUMNS

ysql> SHOW FULL COLUMNS FROM received_email;
+-----------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| Field           | Type         | Collation          | Null | Key | Default | Extra          | Privileges                      | Comment |
+-----------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| id              | int(11)      | NULL               | NO   | PRI | NULL    | auto_increment | select,insert,update,references |         |
| skill_id        | int(11)      | NULL               | YES  | MUL | NULL    |                | select,insert,update,references |         |
| agent_id        | int(11)      | NULL               | YES  | MUL | NULL    |                | select,insert,update,references |         |
| message_id      | longtext     | utf8mb4_unicode_ci | NO   |     | NULL    |                | select,insert,update,references |         |
| received_date   | datetime     | NULL               | NO   |     | NULL    |                | select,insert,update,references |         |
| downloaded_date | datetime     | NULL               | NO   |     | NULL    |                | select,insert,update,references |         |
| from_name       | varchar(255) | utf8mb4_unicode_ci | YES  |     | NULL    |                | select,insert,update,references |         |
| from_email      | varchar(255) | utf8mb4_unicode_ci | NO   |     | NULL    |                | select,insert,update,references |         |
| subject         | longtext     | utf8mb4_unicode_ci | NO   |     | NULL    |                | select,insert,update,references |         |
| content_html    | longtext     | utf8mb4_unicode_ci | YES  |     | NULL    |                | select,insert,update,references |         |
| content_plain   | longtext     | utf8mb4_unicode_ci | YES  |     | NULL    |                | select,insert,update,references |         |
| recipient       | varchar(255) | utf8mb4_unicode_ci | NO   |     | NULL    |                | select,insert,update,references |         |
| created_at      | datetime     | NULL               | YES  |     | NULL    |                | select,insert,update,references |         |
| updated_at      | datetime     | NULL               | YES  |     | NULL    |                | select,insert,update,references |         |
| case_detail_id  | int(11)      | NULL               | YES  | MUL | NULL    |                | select,insert,update,references |         |
+-----------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+

提前致谢

【问题讨论】:

标签: php mysql utf-8 character-encoding


【解决方案1】:

我认为这是你可以检查的两件事......

1) 电子邮件内容字符集

  • 电子邮件内容字符集是什么... utf-8?

  • 如果没有,您是否尝试将其转换为 utf-8?

2) sql 模式 - 从 MySql 5.5 到 5.7 有一些默认更改

您可以找到更多信息: - https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html - https://serverpilot.io/community/articles/how-to-disable-strict-mode-in-mysql-5-7.html

【讨论】:

  • 禁用 serverpilot 上指出的严格模式对我有用!
  • @petekaner 唯一的问题是具有严格 SQL 模式 启用 的服务器是 正确 的服务器。数据无效,您掩盖了真正的问题(并且该列实际上可能是空白的)。 0xC7 不是 utf8 中的有效字符表示,但它是 Ç 的 latin1 表示。问题出在您的代码中,而不是您的服务器上。
【解决方案2】:

声明您的客户端latin1字节。在连接字符串中执行此操作,或之后通过SET NAMES latin1 执行此操作。

MySQL 会将C7 转换为“在线”等效的 utf8。

不要使用任何转换函数,这可能只会让事情变得更糟,或者至少更难解开。

【讨论】: