- MySQL
MySQL ERROR 1064の直し方|SQL構文エラーの探し方
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期連続の黒字決算。