ERROR 1064 (42000): You have an error in your SQL syntax; check the manual ... near 'rank int)' at line 1 は、MySQL が SQL を文法どおりに読めなかったときのエラーです。 手がかりは near '...' と at line N の2つです。

near '...' は「ここから読めなくなった」という場所です。間違いは、その表示の先頭か、その直前にあります。

CREATE TABLE t_rank (id int, rank int);
                             ^^^^^^^^^
ERROR 1064 ... near 'rank int)' at line 1       ← 先頭の rank が問題(予約語)
near の表示 見る場所
near 'rank int)' 表示の先頭の単語(rank)が問題のことが多い
near 'from customers' 表示の直前(from の前にカンマが残っている、など)
near ''(空) SQL の最後。何かが足りないまま終わった(閉じ忘れ・書きかけ)
at line 4 複数行の SQL の4行目。エディタの行番号で探す

確認環境:MySQL 8.0.46(確認日 2026年10月11日)。以下の12パターンはすべて実際に実行して確かめました。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「MySQL ERROR 1064の直し方|SQL構文エラーの探し方」

よくある12パターン

# 間違い SQL の例 near の表示
1 予約語を列名に(MySQL 8.0 で増えた) create table t(id int, rank int) 'rank int)'
2 予約語を列名に create table t(id int, groups varchar(10)) 'groups varchar(10))'
3 予約語を列名に select id, order from orders 'order from orders'
4 最後の列のあとにカンマ select id, name, from customers 'from customers'
5 列の間のカンマ忘れ select id name pref from customers 'pref from customers'
6 句の順番(WHERE は ORDER BY より前) select * from customers order by id where id = 1 'where id = 1'
7 UPDATE の SET のカンマ忘れ update customers set name='a' pref='b' where id=1 'pref='b' where id=1'
8 引用符の閉じ忘れ select * from customers where name = '佐藤 ''佐藤'
9 書きかけで終わっている select * from customers limit 2 offset ''
10 ハイフンの入った名前 select * from order-items 'order-items'
11 プレースホルダ(?)が置き換わっていない select * from customers where id = ? '?'
12 データに ' が入っていて、文字列連結した ... where name = 'O'Reilly' 'Reilly''

1〜3:予約語は MySQL 8.0 で増えた

rank・groups・row_number・lead・lag などは、MySQL 8.0 で予約語になりました(MySQL 公式マニュアルの予約語の一覧では、RANK・GROUPS は 8.0.2 で追加)。MySQL 5.7 で動いていたテーブル定義や SQL が、8.0 に上げたとたんに 1064 になる典型です。

CREATE TABLE t_rank (id int, `rank` int);        -- バッククォートで囲めば使える
SELECT id, `rank` FROM t_rank;

列名を変えられるなら変える(rank → sort_rank など)のが確実です。変えられない場合は、その列を使うすべての SQL でバッククォートで囲みます。

6:句の順番

SELECT 列 FROM 表 [JOIN ...] WHERE 条件 GROUP BY 列 HAVING 条件 ORDER BY 列 LIMIT 件数

この順番以外では書けません。 near 'where ...' のように、句の名前から始まる表示なら、句の順番を確かめます。

9:near '' は「最後まで読んで足りなかった」

select 1 from customers where id=1 and name='x' order by id limit 10 offset
ERROR 1064 ... near '' at line 1

near '' は、SQL の最後まで読んだが、続きが足りなかったという意味です。閉じていない括弧・引用符・書きかけの句を探します。

11・12:アプリから実行したとき

name = "O'Reilly"
cur.execute("SELECT * FROM customers WHERE name = '" + name + "'")
# (1064, "... near 'Reilly'' at line 1")

cur.execute("SELECT * FROM customers WHERE name = %s", (name,))   # OK

値を文字列連結で SQL に埋め込むと、値の中の ' で SQL が壊れます。 これは SQL インジェクション(外部からの不正な SQL の実行)と同じ穴です。値は必ずプレースホルダ(Python の %s、Java の ? と setString)で渡します。

near '?' は、プレースホルダを使う書き方の SQL を、値を渡さずにそのまま実行したときに出ます(SQL を手でコピーして実行したときなど)。

1064 ではないエラーになるもの

間違い エラー
全角スペース(select id from orders) ERROR 1054: Unknown column 'id from' in 'field list'(全角スペースまで列名の一部として読まれた)
INSERT の列と値の数が違う ERROR 1136: Column count doesn't match value count at row 1
存在しない列名 ERROR 1054: Unknown column
DISTINCT と ORDER BY の列 ERROR 3065

全角スペースは 1064 ではなく 1054 になりました。 エラー文の列名の中に、空白や見慣れない文字が混ざっていないかを確かめます。

1064 が出ないもの(MySQL では通る)

書き方 MySQL 8.0 の結果 注意
where name = "佐藤"(ダブルクォートの文字列) 通った PostgreSQL では列名の意味になり column "a" does not exist などのエラー(確認済み)。文字列は ' で書く
select ...;; select 1(セミコロン2つ) 通った —
WITH x AS (...) SELECT ... 通った WITH 句は MySQL 8.0 から使える構文

MySQL の版や DB の種類によって、書ける構文が違います。 エラー文の「check the manual that corresponds to your MySQL server version」は、使っている版のマニュアルで構文を確かめてという意味です。SELECT VERSION(); で版を確かめます。

長い SQL で場所を見つけるコツ

方法 内容
改行して実行する 句ごとに改行すると at line N で行が絞れる(下の例)
少しずつ削る WHERE・JOIN などを外して、どこを足すとエラーになるかを見る
エディタの構文の色分け 予約語・引用符の閉じ忘れが色で分かる
select * from customers
where id = 1
and
order by id
ERROR 1064 ... near 'order by id' at line 4     ← 4行目の直前(3行目の and の続きが無い)

確認の手順(チェックリスト)

順番 確認すること 方法
1 near '...' の先頭と直前 予約語・カンマ・句の順番
2 near '' なら SQL の最後:括弧・引用符・書きかけ
3 行番号 at line N。長い SQL は改行して実行
4 予約語 MySQL 8.0 で増えた rank・groups など。バッククォートか名前の変更
5 アプリの SQL 文字列連結をやめてプレースホルダに
6 MySQL の版 SELECT VERSION(); と、その版のマニュアル

よくある質問

Q. 5.7 から 8.0 に上げたら、テーブルの作成で 1064 が出ます。 A. MySQL 8.0 で予約語になった単語(rank・groups・lead・lag・row_number・system など)を、テーブル名や列名に使っていないかを確かめます。公式マニュアルの予約語の一覧で、8.0 で増えた単語が確認できます。

Q. phpMyAdmin や DB ツールでは動くのに、プログラムから実行すると 1064 になります。 A. プログラムが組み立てた SQL を、実行する直前にログに出して見比べます。値の中の引用符や、変数が空のまま組み立てられた SQL(where id = で終わっている、など)がよくある原因です。

まとめ

  • near '...' の先頭か直前が間違い。near '' は SQL の最後で何かが足りない
  • MySQL 8.0 で rank・groups などが予約語に。バッククォートか名前の変更
  • カンマの過不足・句の順番(WHERE → GROUP BY → ORDER BY → LIMIT)・引用符の閉じ忘れが多い
  • 値は文字列連結せず、プレースホルダで渡す(' で壊れる・インジェクションの穴)
  • 全角スペースは 1064 ではなく 1054(列名の一部として読まれる)

参考・出典

確認日はいずれも 2026年10月11日です。

  • MySQL 8.0 Reference Manual「Keywords and Reserved Words」:https://dev.mysql.com/doc/refman/8.0/en/keywords.html

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「MySQL ERROR 1064の直し方|SQL構文エラーの探し方」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?