Ok I have a very simple mysql database but when i try to run this query via mysql-admin i get weird errors
INSERT INTO customreports (study,
type, mode, select, description)
VALUES (‘1’, ‘2’, ‘3’, ‘4’, ‘5’);
Error:
1064 — You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘select, description) VALUES (‘1’, ‘2’, ‘3’, ‘4’, ‘5’)’ at line 1
JNK
62.9k15 gold badges121 silver badges138 bronze badges
asked May 26, 2009 at 20:10
You’re having problems because you’re using SQL reserved words as column names and not escaping them. Try like this:
INSERT INTO `customreports`
(`study`, `type`, `mode`, `select`, `description`)
VALUES
('1', '2', '3', '4', '5');
answered May 26, 2009 at 20:12
2
Yeah, I would rewrite as:
INSERT INTO [customreports] ([study], [type], [mode], [select], [description]) VALUES (‘1’, ‘2’, ‘3’, ‘4’, ‘5’);
answered May 26, 2009 at 20:14
alexalex
9435 silver badges7 bronze badges
just a guess, but is reserved word «select» (listed as a column name) causing a problem?
answered May 26, 2009 at 20:13
KM.KM.
101k34 gold badges178 silver badges212 bronze badges
2
«SELECT» is a reserved word in SQL… use a different word than «select»
answered May 26, 2009 at 20:13
JasonJason
51.3k37 gold badges133 silver badges185 bronze badges
The word ‘select’ is reserved in sql. The interpreter thinks you’re trying to use a SELECT statement inside the INSERT INTO statement. You need to enclose the field names so that the interpreter doesn’t read them as commands.
Update for MySQL:
insert into customreports ('study','type','mode','select','description') values...
answered May 26, 2009 at 20:14
Justin NiessnerJustin Niessner
241k40 gold badges406 silver badges536 bronze badges
Correct per Chaos… but the critical thing to remember is you should do your best to NOT use RESERVED words as column names in a table… such as SELECT and TYPE…. not positive of the other three, but that’s where your conflict is. Yes, by being explicit with quotes around the fields will tell the SQL you mean the field within, but its also best to know WHY its failing, and not just a work-around resolution… helps prevent similar issues in the future.
answered May 26, 2009 at 20:15
DRappDRapp
47.4k12 gold badges72 silver badges142 bronze badges
Ditto the above, but I believe you need double quotes around the column names, not single quotes. Perhaps some flavors of SQL will process the single quotes correctly, but I think the standard says double quotes for field names, single quotes for field values.
answered May 26, 2009 at 20:31
JayJay
26.8k10 gold badges60 silver badges112 bronze badges
1
DDim1000 3 / 3 / 0 Регистрация: 17.12.2011 Сообщений: 506 |
||||
1 |
||||
03.01.2017, 13:03. Показов 2196. Ответов 8 Метки нет (Все метки)
Подскажите пожалуйста, что ни так с синтаксисом?
0 |
Модератор 4204 / 3044 / 581 Регистрация: 21.01.2011 Сообщений: 13,177 |
|
03.01.2017, 13:21 |
2 |
‘;., Иванов, Иван, Иванович’ У тебя ругается на значение переменных, а ты показываешь их названия.
0 |
DDim1000 3 / 3 / 0 Регистрация: 17.12.2011 Сообщений: 506 |
||||
03.01.2017, 13:46 [ТС] |
3 |
|||
У тебя ругается на значение переменных, а ты показываешь их названия.
0 |
3 / 3 / 0 Регистрация: 17.12.2011 Сообщений: 506 |
|
03.01.2017, 14:06 [ТС] |
4 |
И так тоже ошибка… Почему?…….: Миниатюры
0 |
Супер-модератор 8783 / 2536 / 144 Регистрация: 07.03.2007 Сообщений: 11,873 |
|
03.01.2017, 14:39 |
5 |
DDim1000, почитайте про параметризированные запросы… а еще неплохо бы увидеть текст запроса со значениями… хотя есть некая уверенность, что не хватает кавычек для строк и дат… Подготавливаемые запросы
0 |
3 / 3 / 0 Регистрация: 17.12.2011 Сообщений: 506 |
|
03.01.2017, 15:20 [ТС] |
6 |
а еще неплохо бы увидеть текст запроса со значениями… хотя есть некая уверенность, что не хватает кавычек для строк и дат… Что за текст запроса? Где его брать?……
0 |
Lord_Voodoo Супер-модератор 8783 / 2536 / 144 Регистрация: 07.03.2007 Сообщений: 11,873 |
||||
03.01.2017, 17:21 |
7 |
|||
DDim1000,
вот этот запрос приводит к упомянутой выше ошибке?
0 |
DDim1000 3 / 3 / 0 Регистрация: 17.12.2011 Сообщений: 506 |
||||
03.01.2017, 17:42 [ТС] |
8 |
|||
Может кому то пригодиться…
1 |
Супер-модератор 8783 / 2536 / 144 Регистрация: 07.03.2007 Сообщений: 11,873 |
|
03.01.2017, 17:54 |
9 |
DDim1000, вы бы все-таки почитали за параметризированные запросы… ну и про особенности формирования запросов в зависимости от различных типов данных…
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
03.01.2017, 17:54 |
Помогаю со студенческими работами здесь Ошибка синтаксиса Вот сам код: Ошибка синтаксиса create table…
SELECT ‘For the city ‘, city, ‘, the highest rating is ‘, ", Ошибка синтаксиса в триггере UPDATE `journal` SET (`time_end` = NEW.`time_end`) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 9 |
во первых запрос должен иметь примерно такой формат:
INSERT INTO `price` (`N`, `title`, `localsum`, `regionsum`, `rfsum`, `intersum`) VALUES (1,'Poi',2,1000,1500,2000,4000)
обрати внимание, что кол-во полей не то, кол-во данных которые вставляются не соответствует кол-ву полей
во вторых у вас тип данных не правильный
`localsum` char(100) not null,
`regionsum` char(100) not null,
`rfsum` char(100) not null,
`intersum` char(100) not null,
эти поля должны быть int а не char
Если вы хотите именно строку, то цифры (при вставке) нужно оборачивать в кавычки
в третьих, раз `N` int not null auto_increment, то значение N можно или игнорировать при вставке, или передавать NULL
P.S. Строку вставки можно делать так:
INSERT INTO `price` SET `field`=1, `field2`=2, `field3`=3
так визуально понятней что куда вставляется
——
UPD
<?php
// соединение с базой:
chdir(dirname(__FILE__));
$dsn = 'mysql:host=localhost'.
';dbname=temp_development'.
';port='.
';connect_timeout=15';
$user = 'root';
$password = '123qwe#';
$db = new PDO($dsn, $user, $password);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$file = "./price.txt";# 'Poi',2,1000,1500,2000
# в файле я убрал последнее значение, т.к. для него нет соответствующей колонки в ДБ
if($fp = fopen($file, 'r'))
{
$sql = "INSERT INTO `price` (`title`, `localsum`, `regionsum`, `rfsum`, `intersum`) VALUES ";
$prepare = array();
$insert = array();
while($line = fgets($fp))
{
$line = trim($line);
if(!$line)
continue;
# Читаю файл построчно, чтоб память не загадилась если файл содержит оч много данных
// валидацию данных я не делаю
array_push($prepare, implode(",", array_fill(0, 5, "?")));
$insert = array_merge($insert, explode(",", $line));
}
$pr = $db->prepare($sql."( ".implode("), (", $prepare)." )");
$pr->execute($insert);
}
этот код сгенерирует такой вот запрос в бд:
INSERT INTO `price` (`title`, `localsum`, `regionsum`, `rfsum`, `intersum`) VALUES ( ''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000'), (''Poi'','2','1000','1500','2000' )
SQL оператор INSERT используется для вставки записей в существующую таблицу.
Синтаксис этого оператора следующий:
INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES (expression,...),(...),... или INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name [(col_name,...)] SELECT ... или INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name SET col_name=expression, col_name=expression, ...
Создадим тестовую таблицу
Давайте создадим таблицу table1 со столбцами a, b, c в нашей MySQL базе данных:
CREATE TABLE `table1` ( `a` INT(11), `b` INT(11), `c` INT(11) );
Запрос на вставку строки
Простой запрос, который вставляет строку со столбцами 111, 222 и 333 выглядит так:
INSERT INTO table1 (a, b, c) VALUES (111, 222, 333);
Еще один способ сделать то же самое:
INSERT INTO table1 SET a=111, b=222, c=333;
Столбцы, которые вы не перечислите заполняются значениями по умолчанию, которые вы предусматриваете при создании таблицы, даже если это просто NULL.
У таблиц обычно есть поле id
с первичным ключом (PRIMARY KEY) таблицы. Если этому полю установлено значение AUTOINCREMENT т.е. оно заполняется автоматически, то в таком случае вы не должны его перечислять в списке столбцов оператора INSERT.
Вставка без перечисления столбцов
Если количество значений, которые мы вставляем = количеству столбцов в таблице, то можно не перечислять столбцы, и наш запрос может выглядеть так:
INSERT INTO table1 VALUES (111, 222, 333);
Этот способ крайне не рекомендуется. Дело в том, что со временем вы можете менять таблицы, например добавлять в них новые столбцы, а это значит, что все запросы записанные таким способом просто перестанут работать и вам придется менять их по всему вашему приложению.
Поэтому, навсегда забываем этот способ. Я его привел, только чтобы вы так не делали.
Если нам нужно вставить несколько строк, то мы просто перечисляем группы значений через запятую выглядит это так:
INSERT INTO table1 (a, b, c) VALUES (1, 222, 333), (2, 555, 666), (3, 555, 333);
Таким образом мы вставили 3 строки в нашу таблицу table1. Их может быть и больше. В MySQL четкого предела нет, однако он все таки существует и зависит от параметра max_allowed_packet который ограничивает размер запроса. Если вы установите SET GLOBAL max_allowed_packet=524288000;
то размер запроса будет ограничен 500MB но делайте это в очень крайнем случае. Обычно всегда можно найти решение и разделить 1 большой запрос, на несколько более мелких и вставлять например не больше 1000 строк за один цикл.
Как вставить значение из другой таблицы INSERT INTO … SELECT …
Допустим у нас есть еще одна таблица table2
которая по структуре точно такая же как и первая. Нам в таблицу table2 нужно вставить все строки из table1.
Вставляем значения из table1 в таблицу table2:
INSERT INTO table2 (a, b, c) SELECT a, b, c FROM table1;
Вам следует позаботиться об уникальности ключей, если они есть в таблице, в которую мы вставляем. Например при дублировании PRIMARY KEY мы получим следующее сообщение об ошибке:
/* ERROR 1062 (23000): Duplicate entry '100' for key 'PRIMARY' */
Если вы делаете не какую-то единичную вставку при переносе данных, а где-то сохраните этот запрос, например в вашем PHP скрипте, то всегда перечисляйте столбцы.
Как не рекомендуется делать (без перечисления столбцов):
INSERT INTO table2 SELECT * FROM table1;
Если у вас со временем изменится количество столбцов в таблице, то запрос перестанет работать. При выполнении запроса MySQL в лучшем случае просто будет возвращать ошибку:
/* Ошибка SQL (1136): Column count doesn't match value count at row 1 */
Либо еще хуже: значения вставятся не в те столбцы.
Вставка из другой таблицы с условием INSERT INTO … SELECT … WHERE …
А теперь представим, что нам нужно вставить только те строки из table1, у которых столбец «c» равен 333. Тогда наш запрос будет выглядеть так
INSERT INTO table2 (a, b, c) SELECT a, b, c FROM table1 WHERE c = 333;
То есть мы просто вставляем данные в таблицу, которые выбрали из другой таблицы при помощи обычного SELECT запроса
Теперь представим, что у нас в таблице table2 — 4 столбца, а в table1 — 3. При этом четвертый столбец в table2 обязательный. Чтобы выйти из этой ситуации, нужно передать какое-нибудь подходящее значение в этот лишний столбец. У нас чисто абстрактная задача, поэтому давайте передадим туда просто единицу.
INSERT INTO table2 (a, b, c, d) SELECT a, b, c, 1 FROM table1 WHERE c = 333;
Теперь в столбец d у нас записалась единица и проблема решена.
Вставка в определенный раздел INSERT INTO … PARTITION …
Подробнее о разделах: https://dev.mysql.com/doc/refman/5.7/en/partitioning-overview.html
Если вам нужно вставить строки в определенный раздел таблицы, то нужно после таблицы указать PARTITION (название раздела), например так:
INSERT INTO table1 PARTITION (p1) VALUES(1, 2, 3);
Вставка в несколько разделов. Первая строка вставляется в раздел p1, а вторая в p2
INSERT INTO table1 PARTITION (p1, p2) VALUES(1, 2, 3), (4, 5, 6);
Больше примеров для работы с разделами: https://dev.mysql.com/doc/refman/5.6/en/partitioning-selection.html
Вставка строк, некоторые из которых уже существуют в целевой таблице
Существование строк определяется по значению уникальных ключей. В зависимости от ситуации мы можем выбрать разные способы поведения при совпадении значений уникальных столбцов.
Игнорирование INSERT IGNORE INTO
Например если мы вставляем строку с PK = 1, и при этом в таблице уже есть PK = 1 то MySQL выдаст ошибку:
/* ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' */
Выполнение запроса на этом прервется, однако нам в некоторых случаях хотелось бы просто вставить данные, игнорируя ошибки. В этом нам поможет INSERT IGNORE INTO:
INSERT IGNORE INTO table1 (a, b, c) VALUES (1, 222, 333), (2, 555, 666), (3, 555, 333);
Просто добавляем IGNORE в наш запрос и ошибки будут игнорироваться
Вставка с заменой существующих значений REPLACE INTO
REPLACE работает также INSERT, но если совпадают уникальные ключи, то старая строка (или строки!) удаляется до вставки новой.
В таком случае наш пример выглядит следующим образом:
REPLACE INTO table1 (a, b, c) VALUES (1, 222, 333), (2, 555, 666), (3, 555, 333);
Обновление некоторых полей, при существовании строк ON DUPLICATE KEY UPDATE
При совпадении ключей, мы можем также заменить некоторые или все поля в строке.
Наш запрос будет выглядеть так:
INSERT INTO table1 (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=VALUES(c);
В данном примере если у нас какой-то уникальный ключ совпадает, то мы не производим вставку, а обновляем существующую строку или строки путем присваивания столбцу «c» значения, которое у нас перечислено в VALUES.
Иными словами, если ключ совпадает, то мы просто обновим данные столбца «с» а остальные столбцы трогать не будем.
Иногда нам нужно при совпадении ключей обновить все значения. Этом можно сделать просто перечислив все столбцы:
INSERT INTO table1 (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE a=VALUES(a), b=VALUES(b), c=VALUES(c);
При обновлении столбцов мы также можем использовать разные выражения, например:
INSERT INTO table1 (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
Подробнее про ON DUPLICATE KEY UPDATE
Выражения для вставляемых значений в VALUES
При вставке значений, мы можем использовать выражения и даже использовать в своих выражениях значения других столбцов.
Пример использования выражений:
INSERT INTO table1 (a, b, c) VALUES (1, 222, 333 + a), (2, 555, 666 + b);
Таким образом мы для формирования столбца «c» использовали столбцы «a» и «b».
Приоритет вставки INSERT LOW_PRIORITY / HIGH_PRIORITY
Установление приоритета нужно для решение проблем с конкурентными вставками. При вставках происходит блокировка строк и если 2 INSERT запроса требуют блокировки одних и тех же строк, для своего выполнения, то иногда может потребоваться повысить или понизить приоритет некоторых запросов, по отношению к другим. Это можно сделать указав приоритет LOW_PRIORITY или HIGH_PRIORITY
Наш запрос будет выглядеть так для LOW_PRIORITY:
INSERT LOW_PRIORITY INTO table1 (a, b, c) VALUES(1, 2, 3);
HIGH_PRIORITY:
INSERT HIGH_PRIORITY INTO table1 (a, b, c) VALUES(1, 2, 3);
Нашли опечатку или ошибку? Выделите её и нажмите Ctrl+Enter
Помогла ли Вам эта статья?
#1 04.02.2010 14:43:43
- tjslash
- Участник
- Зарегистрирован: 04.02.2010
- Сообщений: 2
Ошибка INSERT INTO
Запрос вида:
INSERT INTO ‘products’ (cat, brends, divisions, article, name, quant, balls, price) VALUES (‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’)
Выдает ошибку:
#1064 — You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near »products’ (cat, brends, divisions, article, name, quant, balls, price) VALUES ‘ at line 1
Подскажите, поджалуйста, что я делаю не так?
Неактивен
#2 04.02.2010 14:45:10
- tjslash
- Участник
- Зарегистрирован: 04.02.2010
- Сообщений: 2
Re: Ошибка INSERT INTO
Спасибо, проблему решил)
INSERT INTO products (cat, brends, divisions, article, name, quant, balls, price) VALUES (‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’)
Неактивен
#3 04.02.2010 14:59:50
- vasya
- Архат
- Откуда: Орел
- Зарегистрирован: 07.03.2007
- Сообщений: 5817
Re: Ошибка INSERT INTO
Если вам нужно заключить имя базы, таблицы или столбца в кавычки, то для этой цели используются обратные кавычки.
INSERT INTO `products` (cat, brends, divisions, article, name, quant, balls, price) VALUES (‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’)
Это бывает необходимо, если имя совпадает с ключевым словом или состоит из нескольких слов или включает в себя спец символы.
Неактивен
- Please check here to see why posting images of text is not a good idea (can’t cut and paste!).
-
Always put the error code in your question’s Title. Easier to search, easier to find!
-
Also, use the «Code sample» tool for code, not the «Block Quote».
-
Finally, and to answer your question, your SQL appears to have an error — the name of the table you are querying is
"9636354343_ whatsapp_friends"
and not"9636354343_whatsapp_friends"
— i.e. your code as posted has a space between the first underscore and the «whatsapp» part.Always give a
SHOW CREATE TABLE my_tableG
(as text) with table definitions.
In MySQL, you can have 64 characters in identifiers! That_is_more_than_enough_dont_you_think? (=40 characters!). I know what you did was an error, but MySQL (and other servers) do allow you to have spaces in identifiers, but putting the names in backticks (`) or double-quotes («) or whatever.
I cannot stress enough what madness this is — hic sunt leones!. Developers will always be asking «[Is that | Should that be] a space? «Is it a typo»? What happens if you accidentally put in two spaces — can be tricky to read and especially debug! Continue as you are doing, and use underscores to split identifiers to make them more readable!
Also, if you are in a multi-developer shop, pick a few conventions (you can Google best practices) and stick to them! Table names (singular or plural). Upper or Lower case — some servers enforce, others don’t (with and/or without escaping).
I (for example, and this is just me) always use singular table names (with the obvious exception of order
) and lower case for my identifiers, UPPER case FOR my SQL;
— it makes it easy to pick out the language parts from your own objects.
Finally, no matter what you do, you should always use the comments facility available for tables and columns to let other developers know what the table/field is for and if they need to know anything special about the name, if it’s not in accord with your convention!
p.s. welcome to the forum! p.p.s you can let people know you’ve replied to them by using @ in the text of your comment, i.e. for me, it’s @Vérace!
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: 'xF0x93x80x80' 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: 'xF0x90x8Dx83' for column 'names' at row 1
Alternatively, you can also pass the hex code (xF0x90x8Dx83
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 👍