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

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

Ну и код, который пишет в БД, тоже нужен - может, в значении есть символы, требующие экранирования.
...
Рейтинг: 0 / 0
01.09.2021, 13:18
    #40094361
petr12345
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка: #1366 - Incorrect string value
Код: 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
01.09.2021, 15:55
    #40094456
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка: #1366 - Incorrect string value
mysql_query - это ж древняя как дерьмо мамонта библиотека. Переходите на PDO и подготовленные запросы. И MySQL давно пора обновить, а базу перегнать на использование UTF8MB4.
...
Рейтинг: 0 / 0
01.09.2021, 21:35
    #40094620
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка: #1366 - Incorrect string value
petr12345,

Сделайте отладочный вывод переменной $sql в случае возникновения ошибки. В полном запросе будет видно где ошибка.
...
Рейтинг: 0 / 0
01.09.2021, 23:14
    #40094641
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка: #1366 - Incorrect string value
Как вариант, использовать BLOB. Если конечно оно возможно.
...
Рейтинг: 0 / 0
02.09.2021, 07:23
    #40094671
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка: #1366 - Incorrect string value
vkle
использовать BLOB. Если конечно оно возможно.
Да, в MySQL есть и BINARY, и VARBINARY, и BLOB.
...
Рейтинг: 0 / 0
02.09.2021, 09:53
    #40094695
petr12345
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка: #1366 - Incorrect string value
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
02.09.2021, 10:01
    #40094699
peter64
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка: #1366 - Incorrect string value
...
Рейтинг: 0 / 0
02.09.2021, 10:03
    #40094700
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка: #1366 - Incorrect string value
Если MySQL-сервер не поддерживает UTF8MB4, то ни хрена Вы никакими настройками ничего не сделаете.

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

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

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

И это тоже?

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

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

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

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

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

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

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

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

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

Из Utf-8 в Utf-8? Это не займёт много времени. Считайте 2 гигабайта в секунду.
...
Рейтинг: 0 / 0
17.09.2021, 08:29
    #40098188
petr12345
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка: #1366 - Incorrect string value
Как я и предполагал операция перекодировки совсем не легкая. На 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
17.09.2021, 17:45
    #40098383
machetero
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка: #1366 - Incorrect string value
Есть функция в пхп mysqli_set_charset(). Она устанавливает кодировку клиента.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ошибка: #1366 - Incorrect string value / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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