powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ошибка: #1366 - Incorrect string value
20 сообщений из 20, страница 1 из 1
Ошибка: #1366 - Incorrect string value
    #40094303
petr12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Проблема такая - в базу пишутся данные которые приходят от пользователей. Стали появляться ошибки #1366 - Incorrect string value.
Все решения которые я нагуглил сводятся к преобразованию кодировки базы/таблицы/поля в utf8mb4.
Для меня этот вариант неприемлим.

Есть ли другие решения этой ошибки?
Может быть какая-то настройка отключает это и в базу запишутся урезанные символы, пусть они будут вопросами - это устраивает.
Или может в пыхе есть волшебная функция которая вырежет эти эмоджи или конвертнет во что-нибудь ?
...
Рейтинг: 0 / 0
Ошибка: #1366 - Incorrect string value
    #40094344
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не видя полной структуры таблицы, настроек (charset/collation) и значения, которое приводит к ошибке, сказать ничего нельзя.

Ну и код, который пишет в БД, тоже нужен - может, в значении есть символы, требующие экранирования.
...
Рейтинг: 0 / 0
Ошибка: #1366 - Incorrect string value
    #40094361
petr12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE IF NOT EXISTS `messages` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `created` timestamp NOT NULL DEFAULT current_timestamp(),
  `user_id` bigint(20) NOT NULL DEFAULT 0,
  `msg` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `created` (`created`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;



Код: php
1.
2.
3.
4.
5.
6.
7.
$msg = $_POST['msg'];
$user_id = (int)$_POST['user_id'];

$msg = mysql_real_escape_string($msg);

$sql = "INSERT INTO `messages` (`user_id`,`msg`) VALUES ({$user_id},'{$msg}')";
mysql_query($sql);



Но это, право, лишнее...
Речь идет о том, что мускуль выдает ошибку, когда в сообщении приходит какой-нибудь эмоджи, который 4-х байтный.
Мне этот эмоджи на хрен не нужен, поэтому и не хочу конвертировать таблицу в другую кодировку.
Можно его выпилить или преобразовать во что-нибудь... по фиг.
Главное - чтоб не валилась ошибка и была какая-то запись в базу.
...
Рейтинг: 0 / 0
Ошибка: #1366 - Incorrect string value
    #40094456
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mysql_query - это ж древняя как дерьмо мамонта библиотека. Переходите на PDO и подготовленные запросы. И MySQL давно пора обновить, а базу перегнать на использование UTF8MB4.
...
Рейтинг: 0 / 0
Ошибка: #1366 - Incorrect string value
    #40094620
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petr12345,

Сделайте отладочный вывод переменной $sql в случае возникновения ошибки. В полном запросе будет видно где ошибка.
...
Рейтинг: 0 / 0
Ошибка: #1366 - Incorrect string value
    #40094641
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант, использовать BLOB. Если конечно оно возможно.
...
Рейтинг: 0 / 0
Ошибка: #1366 - Incorrect string value
    #40094671
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle
использовать BLOB. Если конечно оно возможно.
Да, в MySQL есть и BINARY, и VARBINARY, и BLOB.
...
Рейтинг: 0 / 0
Ошибка: #1366 - Incorrect string value
    #40094695
petr12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

mysql_query тут совершенно ни при чем. mysqli дает ровно такую же ошибку.
я же объясняю еще раз, услышьте меня, проблема в том что добавляются 4-х байтные символы (эмоджи) в базу, у которой кодировка utf8 (3-х байтная)

Таблица очень большая, а эти 4-х байтные емоджи мне не нужны по условиям задачи абсолютно, поэтому ради них перекодировать базу я не буду.

Поэтому мне нужно как-то их или вырезать или подавить эти ошибки в мускуле. Что-то мне подсказывает что такая настройка есть, но я не могу ее найти. Когда я вставляю эмоджи на локале в точно такую же таблицу, то все вставляется и эти эмоджи заменяются знаками вопроса. Но на проде так не происходит - выдает ошибку "#1366 - Incorrect string value: '\xF0\x9F\x98\x80' for column `msg` at row 1"

ps: я, практически, уверен, что эту ошибку любой может воcпроизвести в том же phpMyAdmin. Не обязательно писать код. Добавьте в таблицу у которой кодировка utf8, символ эмоджи в любое текстовое поле.
...
Рейтинг: 0 / 0
Ошибка: #1366 - Incorrect string value
    #40094699
Фотография peter64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Ошибка: #1366 - Incorrect string value
    #40094700
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если MySQL-сервер не поддерживает UTF8MB4, то ни хрена Вы никакими настройками ничего не сделаете.

Для справки - MySQL проверяет типы данных на каждом шаге перед выполнением каждой операции. И конкретно эта ошибка выявляется ещё до начала выполнения запроса. Возможно, на этапе построения плана в момент обработки константных значений, возможно, в момент проверки типов перед точкой выполнения первого BEFORE триггера.

Единственный видимый выход из ситуации без обновления сервера - это передача строки с четырёхбайтовыми символами в виде бинарной строки. И в таком виде её можно либо класть в VARBINARY поле, либо обрабатывать в HEX и выстригать четырёхбайтовые символы (усраться проблема, на самом деле).

Так что Вы подумайте насчёт того, чтобы чистить ввод на стороне PHP, ещё до передачи на MySQL. Там это будет сделать немого проще - одна регулярка...
...
Рейтинг: 0 / 0
Ошибка: #1366 - Incorrect string value
    #40094760
petr12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
peter64,
Эти все советы предполагают изменение кодировки таблицы.
Я же в каждом своем посте повторяю - этот вариант мне не годится
...
Рейтинг: 0 / 0
Ошибка: #1366 - Incorrect string value
    #40094766
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petr12345
Эти все советы предполагают изменение кодировки таблицы.

И это тоже?

Akina
Единственный видимый выход из ситуации без обновления сервера - это передача строки с четырёхбайтовыми символами в виде бинарной строки. И в таком виде её можно либо класть в VARBINARY поле, либо обрабатывать в HEX и выстригать четырёхбайтовые символы

Akina
чистить ввод на стороне PHP, ещё до передачи на MySQL
...
Рейтинг: 0 / 0
Ошибка: #1366 - Incorrect string value
    #40094768
petr12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
На локале тем не менее получается вставить строку с эмоджи в таблицу с такой же кодировкой, там эти эмоджи просто заменяются на знаки вопросов. Значит это какая то настройка делает (которая скорее всего по дефолту есть в старых версиях (у меня на локале) и нет или выключена или наоборот включена... хз.. по дефолту в новых версиях (как на проде)). Это был бы идеальный вариант для меня.

Версия с пыхом как вариант тоже прокатит, подскажите как можно их вырезать?
Но этот вариант придется во многих местах добавлять. С настройкой мускуля было бы лучше.

Как другой пример - в лог 404 ошибок в поле HTTP_REFERRER тоже прилетают эмоджи, и весь лог этой 404 ошибки тоже валится с "#1366 - Incorrect string value "
...
Рейтинг: 0 / 0
Ошибка: #1366 - Incorrect string value
    #40094802
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petr12345
Таблица очень большая, а эти 4-х байтные емоджи мне не нужны по условиям задачи абсолютно, поэтому ради них перекодировать базу я не буду.

Сколько террабайт эта таблица? И в чём проблема с её перекодировкой (которая не требуется, достаточно сменить метаданные)?
...
Рейтинг: 0 / 0
Ошибка: #1366 - Incorrect string value
    #40094950
petr12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Вы уверены, что только метаданные поменяются и вся таблица не заблочится на N часов? Что-то мне подсказывает, что это очень трудоемкая операция
...
Рейтинг: 0 / 0
Ошибка: #1366 - Incorrect string value
    #40095098
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не уверен за MySQL, но таки да, смена чарсета на совместимый обычно не требует трогать данные вообще. А для "несколько часов" требуется террабайтный размер таблицы даже на моём старом ноутбуке. У вас сервером работает кофемолка?..
...
Рейтинг: 0 / 0
Ошибка: #1366 - Incorrect string value
    #40095134
petr12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Даже поверхностное изучение вопроса, говорит о том, что дело не ограничится изменением только метаданных. Потребуется полное перекодирование всего столбца как минимум. Сервера у нас отличные, ттх привести сейчас не могу, но руководство никогда не скупилось на это дело. По опыту могу сказать, что даже обычное удаление пары-тройки миллионов записей наглухо блочит всю таблицу, поэтому перекодирование таблицы с десятками миллионов записей гарантированно отправит ее в блок.

И снова повторюсь - игра не стоит свеч. Если б это было кране необходимо, можно было бы и это сделать. Но это на хрен не нужно!!! Насрать на потерянные эмоджи. Нужно просто убрать ошибку.

На данный момент, в качестве решения рассматривается вырезание этих эмождей в пыхе, но мне он не нравится, т.к. нужно перелопатить весь проект чтоб добавить этот код везде, а таких мест получается немало. Все еще надеюсь на помощь гуру, которые скажут какую настройку надо включить или выключить в мускуле.
...
Рейтинг: 0 / 0
Ошибка: #1366 - Incorrect string value
    #40095279
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petr12345
Потребуется полное перекодирование всего столбца как минимум.

Из Utf-8 в Utf-8? Это не займёт много времени. Считайте 2 гигабайта в секунду.
...
Рейтинг: 0 / 0
Ошибка: #1366 - Incorrect string value
    #40098188
petr12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как я и предполагал операция перекодировки совсем не легкая. На 500 000 записей, такой запрос занял около 5 сек.
Код: sql
1.
ALTER TABLE `log_404` CHANGE `http_referer` `http_referer` VARCHAR( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT ''



Таблица messages на проде с несколькими десятками миллионов записей гарантированно уйдет в блок на несколько минут. Даже и пробовать не буду. Это неприемлимо в моем случае.

На данный момент решил проблему в пыхе вырезанием этих эмоджей. Но это не совсем то, что я хочу, т.к. есть и другие потенциальные места где такое возможно и не хочется везде добавлять этот код.

Поэтому, все еще очень жду от знающих людей совета про настройку мускуля, которая игнорит эти ошибки. Она должна быть.
...
Рейтинг: 0 / 0
Ошибка: #1366 - Incorrect string value
    #40098383
machetero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть функция в пхп mysqli_set_charset(). Она устанавливает кодировку клиента.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ошибка: #1366 - Incorrect string value
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]