В приложении PHP я пытаюсь сохранить содержимое электронного письма в базе данных (таблица utf8mb4 и сопоставление utf8mb4_general_ci). При выполнении тестов в моей среде разработки он работает нормально, но на производствах я продолжаю получать ошибки, подобные этой:
General error: 1366 Incorrect string value: '\xC7ALHO-...' for column 'content_html' at row 1
Я проверил и понял, что у меня MySQL 5.5 на dev и 5.7 на prod, я обновил mysql на своем dev и теперь я получаю ошибку и на dev.
Проблема в том, что я не понимаю, почему я получаю эти ошибки, это очень стандартное электронное письмо, в котором нет ничего, кроме логотипа заголовка.
Любая идея, почему это не работает на 5.7, а не на 5.5, и если есть какие-либо обходные пути по этому поводу?
Обновление: вот ПОКАЗАТЬ ПОЛНЫЕ КОЛОННЫ таблицы
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 | |
+-----------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
заранее спасибо
Я думаю, что это 2 вещи, которые вы можете проверить …
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
Укажите, что ваш клиент имеет latin1
байт. Сделайте это в строке подключения или сразу через SET NAMES latin1
,
MySQL преобразует C7
в эквиваленте utf8 «на проводе».
Не используйте какие-либо функции преобразования, которые могут только усугубить ситуацию или, по крайней мере, затруднить ее раскрытие.