The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"MariaDB - ошибка «Incorrect string value»"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Открытые системы на сервере (Др. сетевые сервисы / Linux)
Изначальное сообщение [ Отслеживать ]

"MariaDB - ошибка «Incorrect string value»"  +/
Сообщение от fffrremail (ok), 06-Апр-20, 20:06 
При попытке вставить эмотикон в таблицу mariadb ругается на поле text1:

MySQL answer: Incorrect string value: '\xF0\x9F\x98\x80' for column `my_db`.`pages`.`text_1` at row 1.

При этом структура таблицы pages:

| pages | CREATE TABLE `pages` (
  `id` int(10) unsigned NOT NULL,
  `ng_id` int(5) unsigned NOT NULL,
  `text_1` text COLLATE utf8mb4_unicode_ci NOT NULL,
  `text_2` text COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'NOT NULL',
  `img_text` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `enabled` tinyint(1) unsigned NOT NULL DEFAULT 1,
  PRIMARY KEY (`id`,`ng_id`),
  KEY `fk_ng_id` (`ng_id`),
  CONSTRAINT `pages_ibfk_1` FOREIGN KEY (`id`) REFERENCES `pages_blocks` (`id`) ON DELETE CASCADE,
  CONSTRAINT `pages_ibfk_2` FOREIGN KEY (`ng_id`) REFERENCES `languages` (`ng_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci


В настройках mariadb указано использовать utf8mb4:

> show variables WHERE Variable_name LIKE 'character\_set\_%'  OR Variable_name LIKE 'collation%';

+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+
10 rows in set (0.002 sec)

Чего еще не хватает для корректной работы с эмотиконами в БД?

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по ответам | RSS]

1. Сообщение от Licha Morada (ok), 06-Апр-20, 20:42   +/
> При попытке вставить эмотикон в таблицу mariadb ругается

А говорили, что от осминога ничего не бывает...

> MySQL answer: Incorrect string value: '\xF0\x9F\x98\x80' for column `my_db`.`pages`.`text_1`
> at row 1.
> Чего еще не хватает для корректной работы с эмотиконами в БД?

character set со стороны клиента. Как вставляете?

https://lmgtfy.com/?q=MySQL+answer%3A+Incorrect+string+...


Ответить | Правка | Наверх | Cообщить модератору
Ответы: #2

2. Сообщение от fffrremail (ok), 06-Апр-20, 21:27   +/
> character set со стороны клиента. Как вставляете?
> https://lmgtfy.com/?q=MySQL+answer%3A+Incorrect+string+...

Если бы все было так просто... Сегодня полдня потратил юзая нагугленный правильный туториал https://mathiasbynens.be/notes/mysql-utf8mb4#utf8-to-utf8mb4 - все равно ошибка не исчезает((

Поэтому на форуме и спрашиваю...


Ответить | Правка | Наверх | Cообщить модератору
Родитель: #1 Ответы: #3

3. Сообщение от Licha Morada (ok), 06-Апр-20, 22:29   +/
>> character set со стороны клиента. Как вставляете?
>> https://lmgtfy.com/?q=MySQL+answer%3A+Incorrect+string+...
> Если бы все было так просто...

У меня первым результатом тред в Stack Overflow, по-моему, точное попадание в кейс.
https://stackoverflow.com/questions/35125933/mysql-utf8mb4-e...

Ну и ещё https://stackoverflow.com/questions/47566730/force-mariadb-c...

Я по mysql не эксперт, по опыту выпаса разработчиков, слетание кодировок -- самая распотранённая жалоба на базы данных. Раньше выло latin1 vs utf8. Давно уже не случалось, все дефолты на utf8 переехали. Теперь, судя по всему, начинается utf8 vs utf8mb4.
Как правило, рабочим решением было скрупулёзно проверить и пере-проверить ВСЕ места где в каком-либо виде релевантна кодировка строк. На клиенте, на фронте, на бэке и на DBMS.

> Сегодня полдня потратил юзая нагугленный правильный
> туториал https://mathiasbynens.be/notes/mysql-utf8mb4#utf8-to-utf8mb4 - все равно
> ошибка не исчезает((

Версия v5.5.3+ правильная?
Даже из mysqlclient CLI не работает?

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #2 Ответы: #4, #5

4. Сообщение от Pahanivo (ok), 07-Апр-20, 07:53   +/
Пишуть, что utf8 в мускуле реально максимум 3х байтная. А вот utf8mb4 - настоящий utf8 с поддержкой 4х байтовых символов.

> эмотикон \xF0\x9F\x98\x80

по этим кейвордам гуглится гора аналогичных ошибок.
И по всему остальному тоже - афтору бы не лениться с гуглежкой.
А также не забывать, что переменные видимые с консольного клиента
character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
могут отличаться скажем при работе php скрпта.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #3

5. Сообщение от fffrremail (ok), 07-Апр-20, 09:06   +/

> Версия v5.5.3+ правильная?
> Даже из mysqlclient CLI не работает?

версия правильная
# mysql -v
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 40
Server version: 10.3.22-MariaDB-0+deb10u1 Debian 10


Если я правильно такой запрос делаю в CLI
> INSERT INTO pages SET `id`='449',`enabled`='1',`text_1`='df\xF0\x9F\x98\x80',`text_2`='',`id`='1';

он без ошибок... но на странице эмотикона не видно...


Ответить | Правка | Наверх | Cообщить модератору
Родитель: #3 Ответы: #6

6. Сообщение от Licha Morada (ok), 08-Апр-20, 03:35   +/

> Если я правильно такой запрос делаю в CLI
>> INSERT INTO pages SET `id`='449',`enabled`='1',`text_1`='df\xF0\x9F\x98\x80',`text_2`='',`id`='1';
> он без ошибок... но на странице эмотикона не видно...

То есть от "Incorrect string value" оно излечилось?
Я не уверен, правильно ли сказано 'df\xF0\x9F\x98\x80'. Возможно, надо 'df\U+1F600'. Сходу не нашёл подтверждения того или другого.

Удостоверьтесь, что оно у вас как следует сохранилось в базе. Отсутствие ошибки это необходимое условие, но не достаточное.
Если у вас терминал умеет utf8, то может быть оно сможет показать рожицу прямо в mysqlclient, или дампом в текстовой файл.

Потом дрючте ваше веб приложение и конфигурацию его клиента mysql.
Например, если приложение шлёт или принимает utf8 "как есть", то, скорее всего, ему понадобится это обозначить в конструкторе клиента 'SET NAMES utf8mb4'.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #5


Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру