Mysql ошибка insert

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's user avatar

JNK

62.9k15 gold badges121 silver badges138 bronze badges

asked May 26, 2009 at 20:10

The Digital Ninja's user avatar

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

chaos's user avatar

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

alex's user avatar

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.'s user avatar

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

Jason's user avatar

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 Niessner's user avatar

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

DRapp's user avatar

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

Jay's user avatar

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

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Подскажите пожалуйста, что ни так с синтаксисом?
Пишет вот такую ошибку: 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 ‘;., Иванов, Иван, Иванович’ at line 4

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
          mysql_query("INSERT INTO `reg_user`(`login`, `pass`, `surname`, `name`, `patronymic`, `emil`, `phone`, `address`, `datetme`, `ip`) 
                     VALUES (                                          
                          $login,
                          $pass,
                          $surname,
                          $name,
                          $patronymic,
                          $email,
                          $phone,
                          $address,
                          NOW(),
                          $ip)",$link); 
echo mysql_error(),'<br />';



0



Модератор

4204 / 3044 / 581

Регистрация: 21.01.2011

Сообщений: 13,177

03.01.2017, 13:21

2

Цитата
Сообщение от DDim1000
Посмотреть сообщение

‘;., Иванов, Иван, Иванович’

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



0



DDim1000

3 / 3 / 0

Регистрация: 17.12.2011

Сообщений: 506

03.01.2017, 13:46

 [ТС]

3

Цитата
Сообщение от Grossmeister
Посмотреть сообщение

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

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
          $pass = sha1($pass);
          $pass = strrev($pass);
          $pass = "7iy".$pass."76;.";
          
          $ip = $_SERVER['REMOTE_ADDR']; 
          
          mysql_query("INSERT INTO `reg_user`(`login`, `pass`, `surname`, `name`, `patronymic`, `emil`, `phone`, `address`, `datetme`) 
                     VALUES (                                          
                          'ivanko322',
                          '65rfgvftg',
                          'Иванов',
                          'Иван',
                          'Иванович',
                          'ivanov@mail.ru',
                          '89211111111',
                          'ул. Иванова И.И. д. кв. 1',
                          NOW()",$link);



0



3 / 3 / 0

Регистрация: 17.12.2011

Сообщений: 506

03.01.2017, 14:06

 [ТС]

4

И так тоже ошибка… Почему?…….:

Миниатюры

INSERT INTO ошибка синтаксиса
 



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

Цитата
Сообщение от Lord_Voodoo
Посмотреть сообщение

а еще неплохо бы увидеть текст запроса со значениями… хотя есть некая уверенность, что не хватает кавычек для строк и дат…

Что за текст запроса? Где его брать?……



0



Lord_Voodoo

Супер-модератор

8783 / 2536 / 144

Регистрация: 07.03.2007

Сообщений: 11,873

03.01.2017, 17:21

7

DDim1000,

PHP
1
2
3
4
5
6
7
8
9
10
11
 mysql_query("INSERT INTO `reg_user`(`login`, `pass`, `surname`, `name`, `patronymic`, `emil`, `phone`, `address`, `datetme`) 
                     VALUES (                                          
                          'ivanko322',
                          '65rfgvftg',
                          'Иванов',
                          'Иван',
                          'Иванович',
                          'ivanov@mail.ru',
                          '89211111111',
                          'ул. Иванова И.И. д. кв. 1',
                          NOW()",$link);

вот этот запрос приводит к упомянутой выше ошибке?



0



DDim1000

3 / 3 / 0

Регистрация: 17.12.2011

Сообщений: 506

03.01.2017, 17:42

 [ТС]

8

Может кому то пригодиться…
Вот так работает:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
  mysql_query("INSERT INTO reg_user(login,pass,surname,name,patronymic,emil,phone,address,datetme,ip) 
                     VALUES (                                          
                         '$login',
             '$pass',
             '$surname', 
                         '$name', 
                         '$patronymic', 
                         '$email', 
                         '$phone', 
                         '$address', 
                         'NOW()', 
                         '$ip') ",$link);



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

Помогаю со студенческими работами здесь

Ошибка синтаксиса
Выдает ошибку:

Вот сам код:
DELIMITER $$
CREATE FUNCTION `ProfitByBuyer`(`BuyerID` INT)…

Ошибка синтаксиса
Выдается ошибка синтаксиса. Скорее всего, тут она не одна. Помогите пожалуйста ;)

create table…

Ошибка синтаксиса
Сделал запрос

SELECT ‘For the city ‘, city, ‘, the highest rating is ‘, &quot;,
MAX (rating) FROM…

Ошибка синтаксиса в триггере
Создаю триггер before insert

UPDATE `journal` SET (`time_end` = NEW.`time_end`)
WHERE…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

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
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 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 👍

Понравилась статья? Поделить с друзьями:
  • Mysql ошибка 267
  • Mysql ошибка 233
  • Mysql ошибка 2054
  • Mysql ошибка 2003
  • Mysql ошибка 1698