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 – что делать?
![]()
Вам когда-нибудь приходилось видеть ошибку 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 вручную выбрать необходимую строку и добавить нужную информацию.
Опечатки в командах

Одной из самых частых причин ошибки 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)