Перейти к содержимому

Ошибка 1064 mysql как исправить

  • автор:

ERROR 1064 в MySQL Workbench при создании таблицы

Цель была: продолжить работу над проектом на языке Java, в котором используется база данных.
Ход действий:
1. Установка MySQL Community Server и IntellJ IDEA.
2. Создание в MySQL Workbench тестовой схемы и создание там тестовой таблицы. Все прошло успешно.
3. Настройка IDE с БД.
4. Импорт дампа БД в MySQL Workbench.
5. Импорт проекта на Java в IDE.
6. Компиляция проекта и запуск, проверка работы приложения с БД. Прошло успешно.
7. Попытка создать новую таблицу рядом с уже существующими, получение ошибки:

Operation failed: There was an error while applying the SQL script to the database.
Executing:
CREATE TABLE test . new_table ( ); 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 ‘)’ at line 2
SQL Statement:
CREATE TABLE test . new_table ( )

8. Создание новой тестовой схемы, не касающейся проекта, попытка создать там тестовую таблицу. Также ошибка та же. В чем может быть проблема? Операции просмотра записей в таблицах, добавление новой записи происходят без проблем.

Отслеживать
задан 18 янв 2017 в 15:35
55 1 1 серебряный знак 9 9 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

По факту всё написано в ответе MySQL.

У Вас ошибка в синтаксисе.

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 2

Для наглядности я решил протестировать Ваш запрос и воспроизвести ошибку. и да. она абсолютно аналогична Вашей.

В ошибке говорится что, что-то не так у вас возле закрывающей скобочки и что Вам нужно сверить Ваш запрос с документацией.

Вопрос: Что же может там быть?

Идём в документацию и смотрим синтаксис запроса CREATE:

CREATE TABLE table_name ( column_name1 data_type(size), column_name2 data_type(size), column_name3 data_type(size), . ); 

Из него видно что MySQL ожидает, что между скобками будет описание полей таблицы, которых нет и это он считает ошибкой.

Попробуем добавить поле:

CREATE TABLE `test`.`new_table` ( `id` INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ); 

И всё отлично работает!

Вам нужно добавить описание полей в запрос.

Ваш запрос неверный.

По поводу создания схемы могу сказать только одно:

Дайте Ваш запрос и сообщение об ошибке!

Я подозреваю, что ответ находится именно в них!

Учитесь читать сообщения об ошибках! Как правило они отражают суть проблемы.

MySQL error 1064

Статья ориентирована на новичков. В ней объясняется, что означает ошибка сервера MySQL №1064, рассматриваются типичные ситуации и причины возникновения этой ошибки, а также даются рекомендации по исправлению.

Рассмотрим простейший пример.

SELECT mid , time , title, artist, download, view_count, rating, vote_num FROM dle_mservice WHERE category = ‘1’ AND approve = ‘1’ ORDER BY time DESC LIMIT -10 , 10 ;
ERROR 1064 ( 42000 ) : 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 ‘-10,10’ at line 1

Сервер MySQL сообщает, что в первой строке нашего SQL запроса имеется синтаксическая ошибка, и в одинарных кавычках цитирует часть запроса с того места где начинается ошибка. Это очень полезное свойство, так как позволяет сразу определить место, которое сервер счел ошибочным. В данном случае это ‘-10,10’, ошибка возникает из-за того, что параметр LIMIT не может быть отрицательным числом.

Однако, бывает и так, что цитируемый кусок запроса не содержит синтаксической ошибки. Это означает, что данная часть запроса находится не на своем месте из-за чего весь запрос становится синтаксически неверным. Например, отсутствует разделитель между двумя запросами, пропущен кусок запроса, невидимый символ в дампе и т.д. Неудобством таких ситуаций является то, что сообщение об ошибке не содержит исходный запрос. Действия по исправлению зависят от контекста возникновения ошибки. Таковых всего 3:

1. Запрос в редакторе.

Самый простейший случай — вы пишите свой запрос в редакторе. Если причина не опечатка, то:

    Смотреть в документации синтаксис команды для вашей версии сервера MySQL.

Обратите внимание: речь идет о версии сервера MySQL, а не клиента (phpmyadmin, workbench и т.д.). Версию сервера можно узнать выполнив команду select version ( ) ;

select order from test;
ERROR 1064 ( 42000 ) : 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 ‘order from test’ at line 1
MariaDB [ test ] > select ` order ` from test;
+ ——-+
| order |
+ ——-+
| NULL |
+ ——-+

delimiter //
create procedure test ( )
begin
set @a= 1 ;
select @a;
end //

  • mysql_query() выполняет содержимое как одну команду, добавление delimiter приведет к error 1064 с цитатой, начинающейся со слова delimiter
  • phpmyadmin удаляет слово delimiter из-за чего возникает error 1064 с цитатой, начинающейся с переопределенного разделителя
  • в MysqlQueryBrowser напротив необходимо использовать delimiter.

2. Перенос базы на другой сервер.

У вас есть дамп (т.е. файл с расширением .sql) и при попытке его импортировать вы получаете ошибку 1064. Причины:

    В различных версиях набор ключевых слов и синтаксис может немного отличаться. Наиболее распространенный случай: команда create table, в которой ключевое слово type было заменено на engine. Например, если вы получаете ошибку:

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 ‘TYPE=MyISAM CHARACTER SET `utf8`’ at line 29

Это означает, что вы переносите базу в пятую версию сервера MySQL, в котором ключевое слово TYPE не поддерживается и его нужно заменить на ENGINE. Редко бываю случаи, когда перенос идет на старый (~3.23) сервер, который кодировки не поддерживает. Тогда ошибка будет иметь вид:

#1064 — You have an error in your SQL syntax near ‘DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci’ at line 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 ‘
CREATE TABLE `jos_banner` (
`bid` int ( 11 ) NOT NULL auto_increment ,
`ci ‘ at line 1

3. Некорректная работа сайта.

Если во время работы сайта появляются ошибки синтаксиса, то, как правило, причина в установке вами сомнительных модулей к вашей cms. Лучшее решение — отказаться от их использования. Еще лучше предварительно проверять их работу на резервной копии.

Пример. Движок dle 7.2, поставили модуль ,вроде бы все Ок, но:

MySQL Error!
————————
The Error returned was:
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 ‘AND approve=’ 1 ‘ AND date < ' 2008 -10 -04 04 : 34 : 25 ' LIMIT 5' at line 1

Error Number:
1064
SELECT id, title, date , category, alt_name, flag FROM dle_post WHERE MATCH ( title, short_story, full_story, xfields, title ) AGAINST ( ‘Приобретение и оплата скрипта ‘ ) AND id != AND approve= ‘1’ AND date < '2008-10-04 04:34:25' LIMIT 5

В данном примере мы видим, что причина ошибки в отсутствии значения после «id ! php» style=»font-family: monospace;»> $db -> query ( «SELECT id, title, date, category, alt_name, flag FROM » . PREFIX . «_post WHERE MATCH (title, short_story, full_story, xfields, title) AGAINST (‘$body’) AND id != » . $row [ ‘id’ ] . » AND approve=’1′» . $where_date . » LIMIT » . $config [ ‘related_number’ ] ) ;

Далее можно искать откуда взялась переменная $row и почему в ней нет элемента ‘id’ и вносить исправления, но лучше отказаться от использования такого модуля (неизвестно сколько сюрпризов он еще принесет).

P.S. Если после прочтения статьи ваш вопрос с MySQL Error 1064 остался нерешенным, то задавайте его на форуме SQLinfo

Дата публикации: 25.11.2013

© Все права на данную статью принадлежат порталу SQLInfo.ru. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в бумажных изданиях допускается только с разрешения редакции.

SQL error 1064 – что делать?

img

Вам когда-нибудь приходилось видеть ошибку 1064 при работе с MySQL? Причем она указывает на некие синтаксические ошибки в SQL запросе, и эти ошибки могут быть совсем неочевидны – подробнее расскажем ниже.

Использование зарезервированных слов

У каждой версии MySQL есть свой список зарезервированных слов – эти слова используются для особых задач или особых функций внутри движка MySQL. При попытке использовать какие-то из них, вы получите ту самую ошибку 1064. К примеру, ниже пример SQL запроса, который использует зарезервированное слово в качестве имени таблицы.

CREATE TABLE alter (first_day DATE, last_day DATE);

Как этого избежать? Просто! Только потому что слово alter зарезервировано, это не значит, что его нельзя использовать – нужно просто по-особенному приготовить! Чтобы движок MySQL не воспринимал это слово как команду, мы будем просто использовать кавычки и оно взлетит:

CREATE TABLE ‘alter’ (first_day DATE, last_day DATE);
Недостающая информация в таблице

Иногда какой-то части информации в таблице нет и это может вызвать эту ошибку, если запрос обращался к этим данным. К примеру, если в таблице был список сотрудников, и каждому был присвоен ID, было бы логично предположить, что запрос будет вызывать запись сотрудника вместе с номером ID, например:

SELECT * from employees WHERE employeeID = $id

Если пресловутый $id никогда не был правильно указан, запрос будет выглядеть для MySQL сервера следующим образом:

SELECT * from employees WHERE employeeID =

Т.к запрос по сути пустой, движок MySQL будет выдавать ту самую ошибку 1064. Исправляется это следующим образом – вам нужно каким-то образом вызвать конкретную запись и добавить недостающую информацию, причем сделать это не так просто: если пытаться вызвать запись по уникальному номеру, скорее всего вы увидите точно такую ошибку. Можно с помощью phpMyAdmin вручную выбрать необходимую строку и добавить нужную информацию.

Опечатки в командах

 SQL error 1064 – что делать

Одной из самых частых причин ошибки 1064 являются опечатки. И иногда можно десять раз посмотреть на команду и не увидеть опечатки – как пример ниже с командой UPDATE:

UDPATE table1 SET

Соответственно, проверяйте команды свежим взглядом и старайтесь не пропускать такого. Правильный вариант будет выглядеть так:

UPDATE table1 SET >
Устаревшие команды

Некоторые команды устарели, и в новых версиях MySQL начинают выдавать хорошо знакомую нам ошибку. К примеру, команда ‘TYPE’ была признана устаревшей в MySQL 4.1 и была полностью удалена в MySQL 5.1, где при попытке использовать ее вы можете видеть ту самую ошибку. Вместо нее необходимо использовать команду ‘ENGINE’.

Ниже неверный вариант:

CREATE TABLE merionet (i INT) TYPE = INNODB;

А вот правильный, модный и современный вариант (как оно должно быть, чтобы не было ошибки):

CREATE TABLE merionet (i INT) ENGINE = INNODB;
Заключение

Как можно видеть, для одной несчастной ошибки, указывающей на синтаксис, может быть целый ряд разных причин. Так что когда вы видите подобную ошибку – вспомните эту статью и проверьте все возможные варианты ?

Форум пользователей MySQL

Комментарий модератора.
В статье ERROR 1064 (42000) объясняется, что означает ошибка сервера MySQL №1064, рассматриваются типичные ситуации и причины возникновения этой ошибки, а также даются рекомендации по исправлению.

Отредактированно NewUse (22.11.2010 05:31:34)

#2 22.11.2010 06:42:48

vasya Архат Откуда: Орел Зарегистрирован: 07.03.2007 Сообщений: 5823

Re: ERROR 1064 (42000) Я Полный чайник

#3 23.11.2010 01:50:30

NewUse Участник Зарегистрирован: 22.11.2010 Сообщений: 9

Re: ERROR 1064 (42000) Я Полный чайник

Да, спасибо, заработало, помогите, пожалуйста исправить ещё одну ошибочку такого же типа (несовместимость версий):
Сайтик под предположительно php4+MySQL — версия ранняя 2004г или ранее:

while ( $row = $query -> fetchRow ( ) )
unset ( $ROW ) ;
$row [ packet ] = «$row[packet] \n » ;
$TMP_ROW = «\" \n » ;
if ( $row [ action ] > 0 )
$TMP_ROW .= »
$TMP_ROW .= »
$ROW [ ] = array ( VARS => $val ,
TD_PAR => «align=middle» ,
TD_CLR => DEF_CLR ) ;
}
if ( $HEADER ) {
$HEADER = false ;
$ARRAY [ ] = $TMP_HEADER ;
}
$ARRAY [ ] = $ROW ;

PHP Fatal error: Call to a member function fetchRow() on a non-object in /usr/local/www/data/index.php on line 13

#4 23.11.2010 01:59:31

paulus Администратор Зарегистрирован: 22.01.2007 Сообщений: 6756

Re: ERROR 1064 (42000) Я Полный чайник

Как следует из текста ошибки — Вы пытаетесь вызвать метод у сущности,
не являющейся объектом. Задавайте, пожалуйста, вопросы по PHP на
webew.ru.

#5 23.11.2010 15:28:00

NewUse Участник Зарегистрирован: 22.11.2010 Сообщений: 9

Re: ERROR 1064 (42000) Я Полный чайник

Спасибо, а такой синтаксис в MySQL5 допустим?

SELECT packet, num as num_users,gid,tos as action FROM packets order by num

#6 23.11.2010 16:17:12

paulus Администратор Зарегистрирован: 22.01.2007 Сообщений: 6756

Re: ERROR 1064 (42000) Я Полный чайник

#7 24.11.2010 17:01:53

NewUse Участник Зарегистрирован: 22.11.2010 Сообщений: 9

Re: ERROR 1064 (42000) Я Полный чайник

Не подскажите, ещё один тупой вопрос от полного чайника?:
почему (и в каких случаях) в MySQL 5 на запрос:

SELECT packet, num as num_users,gid,tos as action FROM packets order by num

Может вернуться ошибка, или тип, не соответствующий стандартному?
В результате к ответу при попытки применить функцию:

function FetchRow ( )
{
if ( $this -> EOF ) {
$false = false ;
return $false ;
}
$arr = $this -> fields ;
$this ->_currentRow++;
if ( ! $this ->_fetch ( ) ) $this -> EOF = true ;
return $arr ;
}

Вываливается ошибка

PHP Fatal error: Call to a member function fetchRow ( ) on a non-object in /usr/local/www/data/index.php on line 13

Я правда чайник, но с помощью выше рекомендованного сайта определил, что ошибка именно в результате запроса MySQL.

#8 24.11.2010 17:37:09

paulus Администратор Зарегистрирован: 22.01.2007 Сообщений: 6756

Re: ERROR 1064 (42000) Я Полный чайник

Не-а, ошибка в сценарии PHP, который не проверяет, что вернулся объект,
а просто дергает его метод. Ищите название объекта на 13 строке, а потом
смотрите, где он определяется. Ошибка где-то там.

#9 24.11.2010 17:56:57

NewUse Участник Зарегистрирован: 22.11.2010 Сообщений: 9

Re: ERROR 1064 (42000) Я Полный чайник

так ошибка то и возникает из-за невернго формата возврата запроса из БД:

Ошибка возникает в:

query ( $sql )
$sql = «SELECT packet, num as num_users,gid,tos as action FROM packets order by num»

при попытки применить к нему функцию FetchRow (описание выше) в php это выглядит так:
$query -> fetchRow ( )

Вот от сюда и вопрос, в каких случаях БД может выдавать разный ответ (вернее разный формат ответа), сейчас проверил вручную:
вот ответ:

ERROR 1054 (42S22): Unknown column ‘num’ in ‘field list’

Отредактированно NewUse (24.11.2010 18:13:33)

#10 24.11.2010 18:17:37

paulus Администратор Зарегистрирован: 22.01.2007 Сообщений: 6756

Re: ERROR 1064 (42000) Я Полный чайник

Ура. Нет такого столбца. Наконец-то Вы добрались до проблемы

ALTER TABLE packets ADD num INT;

#11 24.11.2010 18:41:19

NewUse Участник Зарегистрирован: 22.11.2010 Сообщений: 9

Re: ERROR 1064 (42000) Я Полный чайник

Угу, походу схема БД была не верной, ща переправлю и инструкташку под фриНИБС с Веб-мордой накатаю, там уже пришлось кое-что поменять

Подскажите, пожалуйста, как подредактировать схему, чтоб этой ошибки не возникало:

DROP TABLE IF EXISTS packets;
CREATE TABLE `packets` (
`gid` bigint ( 15 ) unsigned NOT NULL auto_increment ,
`packet` varchar ( 128 ) NOT NULL default » ,
`deposit` double ( 16 , 6 ) NOT NULL default ‘0.000000’ ,
`credit` double ( 16 , 6 ) NOT NULL default ‘0.000000’ ,
`tos` tinyint ( 1 ) unsigned NOT NULL default ‘0’ ,
`do_with_tos` tinyint ( 1 ) unsigned NOT NULL default ‘1’ ,
`direction` tinyint ( 1 ) unsigned NOT NULL default ‘0’ ,
` fixed ` tinyint ( 1 ) unsigned NOT NULL default ‘0’ ,
`fixed_cost` double ( 16 , 6 ) NOT NULL default ‘0.000000’ ,
`activated` tinyint ( 1 ) unsigned NOT NULL default ‘1’ ,
`activation_time` int ( 10 ) NOT NULL default ‘2678400’ ,
`blocked` tinyint ( 1 ) unsigned NOT NULL default ‘0’ ,
`total_time_limit` bigint ( 15 ) unsigned NOT NULL default ‘0’ ,
`month_time_limit` bigint ( 15 ) unsigned NOT NULL default ‘0’ ,
`week_time_limit` bigint ( 15 ) unsigned NOT NULL default ‘0’ ,
`day_time_limit` bigint ( 15 ) unsigned NOT NULL default ‘0’ ,
`total_traffic_limit` bigint ( 15 ) unsigned NOT NULL default ‘0’ ,
`month_traffic_limit` bigint ( 15 ) unsigned NOT NULL default ‘0’ ,
`week_traffic_limit` bigint ( 15 ) unsigned NOT NULL default ‘0’ ,
`day_traffic_limit` bigint ( 15 ) unsigned NOT NULL default ‘0’ ,
`total_money_limit` double ( 16 , 6 ) NOT NULL default ‘0.000000’ ,
`month_money_limit` double ( 16 , 6 ) NOT NULL default ‘0.000000’ ,
`week_money_limit` double ( 16 , 6 ) NOT NULL default ‘0.000000’ ,
`day_money_limit` double ( 16 , 6 ) NOT NULL default ‘0.000000’ ,
`login_time` varchar ( 254 ) NOT NULL default » ,
`huntgroup_name` varchar ( 64 ) NOT NULL default » ,
`simultaneous_use` smallint ( 3 ) unsigned NOT NULL default ‘0’ ,
`port_limit` smallint ( 3 ) unsigned NOT NULL default ‘0’ ,
`session_timeout` bigint ( 15 ) unsigned NOT NULL default ‘0’ ,
`idle_timeout` bigint ( 15 ) unsigned NOT NULL default ‘0’ ,
`framed_ip` varchar ( 16 ) NOT NULL default » ,
`framed_mask` varchar ( 15 ) NOT NULL default » ,
`no_pass` tinyint ( 1 ) unsigned NOT NULL default ‘0’ ,
`no_acct` tinyint ( 1 ) unsigned NOT NULL default ‘0’ ,
`allow_callback` tinyint ( 1 ) unsigned NOT NULL default ‘0’ ,
`other_params` MEDIUMTEXT ,
`allowed_servers` varchar ( 254 ) NULL ,
`up` int ( 5 ) NULL ,
`down` int ( 5 ) NULL ,
`ippool_name` varchar ( 64 ) NULL ,
`provider_id` bigint not null default ‘0’ ,
PRIMARY KEY ( `gid` ) ,
UNIQUE KEY `packet` ( `packet` )
) ;

Отредактированно NewUse (24.11.2010 19:54:12)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *