When you try to insert a new record into your MySQL database table, you may encounter an error saying Incorrect string value
along with some UTF-8 hex code for the description.
For example, suppose you create a Test
table with only one column as follows:
CREATE TABLE `Test` (
`names` varchar(255)
)
Next, let’s insert the following Egyptian hieroglyph character into the table:
INSERT INTO Test VALUES('𓀀');
Your MySQL server may respond with the following error:
ERROR 1366 (HY000):
Incorrect string value: '\xF0\x93\x80\x80' for column 'names' at row 1
The error above is because the character 𓀀
requires 4-bytes to be represented in UTF-8 encoding.
By default, MySQL databases and tables are created using a UTF-8 with 3-bytes encoding. You can see the encoding used for your table by using the SHOW CREATE TABLE
statement as follows:
SHOW CREATE TABLE Test \G
Here’s the result from my computer:
*************************** 1. row ***************************
Table: Test
Create Table: CREATE TABLE `Test` (
`names` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
As you can see, the table uses the DEFAULT CHARSET=utf8mb3
and the names
column uses CHARACTER SET utf8
.
The MySQL utf8
or utf8mb3
can’t store string values that contain a UTF-8 4-bytes character.
To store the values, you need to use the utf8mb4
character set.
Here’s the query to alter your database, table, or column to utf8mb4
character set:
-- Change a database
ALTER DATABASE [database_name]
CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
-- Change a table
ALTER TABLE [table_name]
CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- Change a column
ALTER TABLE [table_name]
CHANGE [column_name] [column_name] VARCHAR(255)
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
When you change the character set on the database level, then any new table you create for that database in the future will use that character set as the default encoding.
Returning to the Test
table, you can alter just the names
column to make the INSERT
statement works:
ALTER TABLE `Test`
CHANGE `names` `names` VARCHAR(255)
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Now you should be able to insert the character 𓁴
into the table:
INSERT INTO Test VALUES('𓁴');
-- Query OK, 1 row affected (0.00 sec)
By default, MySQL version 8 should use utf8mb4
encoding and collation for your databases. If you see utf8
or utf8mb3
, then you might be using MySQL version below 8 (MySQL version 5 may default to utf8mb3
).
When you encounter this error, pay attention to the characters that you want to insert into the database.
They may look like normal characters, but if you copy and paste them from some source, then they may have a strange encoding attached to them.
For example, the GOTHIC LETTER SAUIL 𐍃
looks like a normal capital S
but actually a 4-bytes
character:
INSERT INTO Test VALUES('𐍃');
ERROR 1366 (HY000):
Incorrect string value: '\xF0\x90\x8D\x83' for column 'names' at row 1
Alternatively, you can also pass the hex code (\xF0\x90\x8D\x83
in the example above) into Google to look for the exact character that causes the error.
To conclude, the ERROR 1366: Incorrect string value
happens when MySQL can’t insert the value you specified into the table because of incompatible encoding.
You need to modify or remove characters that have 4-bytes
UTF-8 encoding, or you can change the encoding and collation used by MySQL.
Note that utf8
in MySQL always refers to utf8mb3
.
To use the 4-bytes
UTF-8 encoding, it needs to be specified as utf8mb4
.
With this information, you should now be able to resolve this error. Feel free to use the provided ALTER
statements above if you need it 👍
При переносе очередного сайта и разворачивание его на VDS-ке, у меня появилась ошибка:
MySQL Query Error: [[1366] Incorrect string value: ‘\xB1N\xC30\x10\xFD…’ for column ‘COOKIES’ at row 1] |
Она была связана с тем, что не получалось сохраненить в БД куки из-за того что кодировка из скрипта не совпадала с кодировкой в БД.
Что бы это исправить, необходимо сменить кодировку в БД и определить эту кодировку в скриптах битрикса для подключения с базой данных. Т.к. ошибка может возникать из-за того, что пытается записать в БД символы, которые состоят не из 3 байтов, как в UTF-8, а из 4-х, то для хранения поля необходимо использовать utf8mb4. Поменять кодировку можно с помощью скрипта php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php $dbName = ‘YOUR_DB_NAME’; $user = ‘YOUR_USER_NAME’; $password = ‘YOUR_PASSWORD’; $dsn = ‘mysql:dbname=’.$dbName.‘;host=localhost’; $time_n=time(); try { $dbh = new PDO($dsn, $user, $password); } catch (PDOException $e) { exit(‘Подключение не удалось: ‘ . $e->getMessage()); } $sql = «SELECT distinct CONCAT( ‘alter table ‘, TABLE_SCHEMA, ‘.’, TABLE_NAME, ‘ CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;’ ) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ‘$dbName’;»; $arErrors = []; $cnt = 0; foreach ($dbh->query($sql) as $row) { try { $dbh->exec($row[0]); } catch (PDOException $e) { $arErrors[] = ‘Ошибка: ‘ . $e->getMessage(); } $cnt++; } $time_k=time(); echo ‘Затронуто таблиц: ‘ . $cnt . ‘ Из них с ошибками: ‘ . count($arErrors) . ‘<br>’; echo ‘Время выполнения: ‘ . strftime(‘%M:%S’,$time_k—$time_n) . ‘<br>’; if (count($arErrors) > 0) { echo ‘Список ошибок: <br>’; echo ‘<pre>’; print_r($arErrors); echo ‘</pre>’; } |
Результат выполнения скрипта:
Затем в конфигах битрикса прописать:
— в файле bitrix/php_interface/after_connect_d7.php:
$connection = \Bitrix\Main\Application::getConnection(); $connection->queryExecute(«SET NAMES ‘utf8′»); $connection->queryExecute(‘SET collation_connection = «utf8mb4_unicode_ci»‘); |
— в файле bitrix/php_interface/after_connect.php:
$DB->Query(«SET NAMES ‘utf8′»); $DB->Query(‘SET collation_connection = «utf8mb4_unicode_ci»‘); |
После, если система заработает, следеут сделать проверку системы:
Если будут ошибки, то исправить их следуя подсказкам битрикса.
Если же ошибка не исправилась, значит необходимо поиграться с вариантами кодировки. В моем случае эти действия помогли, но не с первого раза. По итогу оставил кодировку utf8 и utf8_unicode_ci, и она чудо образом стала работать. Почему до этого выпадала ошибка, для меня осталось загадкой 🙂
На локалке стоит:
mysql Ver 14.14 Distrib 8.0.0-dmr, for Linux (x86_64) using EditLine wrapper
PHP 5.6.29
Yii2 2.0.12
Задача: парсинг нескольких сайтов.
Проблема: при записи текста в таблицу MySql выдает:
Error: SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xD1\x82\xD0\xBE \xD0...' for column 'content' at row 1
Единственный толковый ответ, который удалось найти это пост https://mathiasbynens.be/notes/mysql-utf8mb4
После прочтения статьи:
параметры (SHOW VARIABLES WHERE Variable_name LIKE ‘character\_set\_%’ OR Variable_name LIKE ‘collation%’)
*************************** 1. row ***************************
Variable_name: character_set_client
Value: utf8mb4
*************************** 2. row ***************************
Variable_name: character_set_connection
Value: utf8mb4
*************************** 3. row ***************************
Variable_name: character_set_database
Value: utf8mb4
*************************** 4. row ***************************
Variable_name: character_set_filesystem
Value: binary
*************************** 5. row ***************************
Variable_name: character_set_results
Value: utf8mb4
*************************** 6. row ***************************
Variable_name: character_set_server
Value: utf8mb4
*************************** 7. row ***************************
Variable_name: character_set_system
Value: utf8
*************************** 8. row ***************************
Variable_name: collation_connection
Value: utf8mb4_unicode_ci
*************************** 9. row ***************************
Variable_name: collation_database
Value: utf8mb4_unicode_ci
*************************** 10. row ***************************
Variable_name: collation_server
Value: utf8mb4_unicode_ci
10 rows in set (0.00 sec)
таблица (SHOW CREATE TABLE)
Table: post
Create Table: CREATE TABLE `post` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`created_at` int(11) NOT NULL,
`updated_at` int(11) NOT NULL,
`url` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`title` varchar(2048) COLLATE utf8mb4_unicode_ci NOT NULL,
`content` text COLLATE utf8mb4_unicode_ci NOT NULL,
`status` smallint(6) DEFAULT '10',
PRIMARY KEY (`id`),
UNIQUE KEY `post_url_unq` (`url`),
) ENGINE=InnoDB AUTO_INCREMENT=164 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
Ошибка никуда не делась, так теперь еще и мускул уходит в даун. Если я правильно понимаю то это и есть обычные UTF8 символы, но мускул что-то чудит, или я. Как с этим жить?
UPD 1:
параметры (SHOW VARIABLES WHERE Variable_name LIKE ‘%char%’\)
*************************** 1. row ***************************
Variable_name: character_set_client
Value: utf8mb4
*************************** 2. row ***************************
Variable_name: character_set_connection
Value: utf8mb4
*************************** 3. row ***************************
Variable_name: character_set_database
Value: utf8mb4
*************************** 4. row ***************************
Variable_name: character_set_filesystem
Value: binary
*************************** 5. row ***************************
Variable_name: character_set_results
Value: utf8mb4
*************************** 6. row ***************************
Variable_name: character_set_server
Value: utf8mb4
*************************** 7. row ***************************
Variable_name: character_set_system
Value: utf8
*************************** 8. row ***************************
Variable_name: character_sets_dir
Value: /usr/share/mysql/charsets/
UPD 2:
Нашел решение в объявлении колонки как LONGBLOB, остальные, хотя вроде и разумные методы, не работают
https://stackoverflow.com/a/15945126
Спасибо ThunderCat за наводку.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Активные темы Темы без ответов
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
1 2008-07-03 18:20:42
- fog!
- Редкий гость
- Неактивен
- Зарегистрирован: 2008-06-28
- Сообщений: 4
Тема: Ошибка #1366
Ошибка
SQL-запрос:
INSERT INTO `cities` ( `id` , `city_name` , `latitude` , `longitude` , `population` , `country_code` )
VALUES (
», ‘Sherbrooke’, ’45 23 59.00′, ‘-71 46 11.00’, 125000, ‘ca’
)
Ответ MySQL: Документация
#1366 — Incorrect integer value: » for column ‘id’ at row 1
Здравствуйте. Как видно из запроса — MySQL недоволен пустым значением в поле id. Но разве не так должно быть при автоматическом индексировании? При создании таблицы по отношению к полю id использовалась функция auto_increment. Кстати пример из статьи Марка Делисла, приведенной на этом сайте;).
Обьясните новичку что не так.
Заранее благодарен.
2 Ответ от Hanut 2008-07-03 21:33:31
- Hanut
- Модератор
- Неактивен
- Откуда: Рига, Латвия
- Зарегистрирован: 2006-07-02
- Сообщений: 9,726
Re: Ошибка #1366
fog!
Это не совсем ошибка, скорее уведомление о несоответствии синтаксиса стандарту. Обычно подобная ошибка не выводится, но так как сервер устанавливается в целях обучения, то при настройке MySQL был задан режим жесткого соответствия SQL запросов стандарту (Strict Mode). В конфигурационном файле MySQL за данную настройку отвечает директива sql-mode, но я бы крайне не рекомендовал ее менять.
Для соответствия стандарту запрос можно заменить двумя способами.
-- В данном случае мы вовсе убираем поле id при вставке данных.
INSERT INTO `cities` ( `city_name` , `latitude` , `longitude` , `population` , `country_code` )
VALUES ( 'Sherbrooke', '45 23 59.00', '-71 46 11.00', 125000, 'ca' );
-- Либо назначаем полю id значение NULL.
INSERT INTO `cities` ( `id` , `city_name` , `latitude` , `longitude` , `population` , `country_code` )
VALUES ( NULL, 'Sherbrooke', '45 23 59.00', '-71 46 11.00', 125000, 'ca' );
3 Ответ от fog! 2008-07-04 19:43:45
- fog!
- Редкий гость
- Неактивен
- Зарегистрирован: 2008-06-28
- Сообщений: 4
Re: Ошибка #1366
спасибо) я тоже подумал про НУЛЛ)
4 Ответ от Vital 2015-07-05 11:51:57 (изменено: Vital, 2015-07-05 12:35:50)
- Vital
- Редкий гость
- Неактивен
- Зарегистрирован: 2015-04-20
- Сообщений: 2
Re: Ошибка #1366
Добрый день, уважаемый Hanut.
Нужна помощь.
Вылезает такая же ошибка, когда пытаюсь поменять тип поля.
Сейчас поле year. Его тип CHAR. Количество символов — 4.
Меняю на тип SMALLINT с количеством символов 6 и выводится ошибка 1366.
Чем, по вашему мнению, недоволен MySQL и как попробовать его удовлетворить?
Ссылки на скрины:
https://yadi.sk/i/0-AjKqU-hfzRL
https://yadi.sk/i/vUEzb824hfzfG
https://yadi.sk/i/Se5E0TDBhfzfr
Уверен, что в очередной раз сможете помочь.
Заранее спасибо большое за помощь!!!
Сообщения 4
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
I am facing issues with my table structure :
My_Table_Name1
CREATE TABLE `My_Table_Name1` ( `twitter_id_str` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `twitter_screen_name` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL, UNIQUE KEY `twitter_id_str` (`twitter_id_str`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
For database I also have same charset and collation:
CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
I’m trying to insert an emoji into this table:
insert into My_Table_Name1 values("2","😀")
However, I get an error:
Error Code: 1366. Incorrect string value: ‘\xF0\x9F\x98\x80’ for column ‘twitter_screen_name’ at row 1 0.00027 sec
How to solve this?
Thanks in advance.
dbdemon
6,2014 gold badges19 silver badges38 bronze badges
asked May 11, 2018 at 11:51
5
The problem appears to be in the Client.
When the client connects to the MySQL server, it needs to announce that the bytes in the client are utf8mb4
. This can be done in several ways:
- In the connection parameters (client-dependent).
SET NAMES utf8mb4
.
\U+1F600
is the Unicode representation for that Emoji.
\xF0\x9F\x98\x80
is the equivalent Hex.
F09F9880
is the UTF-8 (utf8mb4) in Hex.
Avoid the Unicode representation.
answered May 24, 2018 at 23:28
Rick JamesRick James
76.1k5 gold badges45 silver badges109 bronze badges
This seems like a problem with mysql-workbench (tested with version 6.3.9 on Fedora and MySQL 5.7 (CentOS)) where emojis are not converted to the correct unicode.
In the command-line mysql
client the emojis get converted to codes when they’re pasted in, so the query
INSERT INTO My_Table_Name1 values("2","😀");
becomes:
INSERT INTO My_Table_Name1 values("4","\U+1F600");
which works fine.
However, in mysql-workbench, the emoji is not converted as you paste it in, and the query result is:
Error Code: 1366. Incorrect string value: ‘\xF0\x9F\x98\x80’ for column ‘twitter_screen_name’ at row 1
answered May 12, 2018 at 16:28
dbdemondbdemon
6,2014 gold badges19 silver badges38 bronze badges