Errore MySQL 1064 — messaggio esatto:
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 NMySQL non riesce a effettuare il parsing dell’SQL che hai inviato. Il frammento mostrato tra virgolette indica esattamente dove il parsing si è interrotto — inizia da lì la tua diagnosi.
L’errore MySQL 1064 è un errore di sintassi: MySQL ha ricevuto un’istruzione SQL che non è riuscito a interpretare. Il messaggio di errore include sempre il numero di riga e il frammento di query che ha provocato l’errore — entrambi sono i tuoi indizi diagnostici più rapidi. Cause comuni:
- Sintassi errata — un errore di battitura, una virgola mancante o una parola chiave fuori posto.
- Errori di ortografia —
SLECTinvece diSELECT,WHERinvece diWHERE. - Parole riservate — usare
order,tableokeycome nomi di colonne o tabelle senza backticks. - Parentesi non appaiate — una
(non chiusa o una)di troppo in una subquery. - Dati mancanti o errati — una variabile nella query è vuota o contiene un valore inatteso.
- Sintassi obsoleta — comandi di versioni precedenti di MySQL (
TYPE=MyISAM,CHARSET=latin1) che non funzionano sui server più recenti.
Contents
Quale causa ho?
Usa questa tabella per identificare la causa più probabile prima di passare alle soluzioni:
| Il tuo sintomo | Causa più probabile | Soluzione |
|---|---|---|
Il messaggio di errore indica una parola chiave SQL (ORDER, KEY, TABLE, INDEX, DATABASE) come parola problematica |
Parola riservata usata come nome di colonna o tabella senza backticks | Soluzione 4: Esegui l’escape delle parole riservate |
L’errore punta a un numero di riga vicino a una ( o ) |
Parentesi non appaiate | Soluzione 2: Controlla le parentesi |
| L’errore è comparso dopo l’importazione di un dump del database o l’aggiornamento di MySQL | Sintassi obsoleta nel dump (TYPE=MyISAM, CHARSET=latin1) |
Soluzione 6: Aggiorna i comandi obsoleti |
| Una query dinamica funzionava prima ma ora fallisce; la query contiene una variabile PHP | Valore della variabile vuoto o mancante | Soluzione 5: Affronta i dati mancanti |
Il token problematico è una parola chiave scritta male (SLECT, INSRET, WHER) |
Errore di ortografia | Soluzione 3: Correggi l’ortografia |
| Nessuna delle precedenti — problema generale nella struttura della query | Problema di sintassi nella struttura della query | Soluzione 1: Controlla la sintassi |
Risolvere l’errore MySQL 1064
1. Ricontrolla la tua sintassi
Il messaggio di errore di MySQL ti indica la posizione esatta del carattere in cui il parsing si è interrotto. Leggi il frammento tra virgolette nell’errore, poi osserva l’SQL immediatamente prima di quel punto. I problemi strutturali più comuni:
- Virgola mancante tra le definizioni di colonna in
CREATE TABLE - Un punto e virgola all’interno del corpo di una stored procedure che termina l’intera istruzione prematuramente
- Una parola chiave usata nella clausola sbagliata (
WHEREinvece diHAVINGin una query di aggregazione)
Esempio prima/dopo — virgola mancante:
-- Broken: no comma after the first column definition
CREATE TABLE users (
id INT NOT NULL
username VARCHAR(50)
);
-- Fixed
CREATE TABLE users (
id INT NOT NULL,
username VARCHAR(50)
);
2. Presta attenzione alle parentesi
Ogni parentesi aperta necessita di una corrispondente parentesi chiusa. Le subquery e le clausole IN (...) sono la fonte più comune di squilibrio tra parentesi — soprattutto quando si modifica una query a mano o la si assembla da più parti.
Esempio prima/dopo — subquery non chiusa:
-- Broken: missing closing ) for the IN subquery
SELECT * FROM orders WHERE user_id IN (
SELECT id FROM users WHERE active = 1
;
-- Fixed
SELECT * FROM orders WHERE user_id IN (
SELECT id FROM users WHERE active = 1
);
3. Errori di ortografia: un colpevole comune
MySQL non tenta di correggere automaticamente una parola chiave scritta male — interrompe immediatamente il parsing e restituisce un errore 1064. Un singolo carattere invertito in SELECT, INSERT, UPDATE, WHERE o qualsiasi altra parola riservata lo provoca.
Esempio prima/dopo — SELECT scritto male:
-- Broken
SLECT id, name FROM users;
-- Error: ... near 'SLECT id, name FROM users'
-- Fixed
SELECT id, name FROM users;
Un robusto SQL Syntax Checker intercetta questi errori di battitura prima di eseguire la query su un database live.

Qui, identifica l’errore e specifica la riga che contiene l’errore.
4. Esegui correttamente l’escape delle parole riservate
MySQL riserva determinate parole per la propria sintassi: ORDER, TABLE, KEY, INDEX, DATABASE, SELECT, FROM, WHERE e molte altre. Usarne una qualsiasi come nome di tabella o colonna senza backticks causa un errore 1064. La soluzione è racchiudere l’identificatore tra backticks.
Esempio prima/dopo — parola riservata come nome di tabella:
-- Broken: ORDER is a MySQL reserved word
SELECT name FROM order WHERE id = 1;
-- Error: ... near 'order WHERE id = 1'
-- Fixed: backticks tell MySQL this is an identifier, not a keyword
SELECT name FROM `order` WHERE id = 1;
CREATE TABLE `order` (...Versioni diverse di MySQL hanno liste di parole riservate diverse. Quando migri un database da una versione precedente di MySQL, una parola che era sicura in MySQL 5.7 potrebbe essere riservata in MySQL 8.0. Consulta il MySQL Reference Manual per la tua versione di destinazione ed esegui una ricerca-e-sostituzione sul dump prima dell’importazione.
5. Affrontare i dati mancanti
Se una variabile PHP che alimenta una query SQL è vuota o non impostata, l’SQL assemblato diventa malformato. Una query come WHERE id = (con nulla dopo il =) è una concatenazione di stringhe PHP valida ma SQL non valido.
Esempio prima/dopo — variabile vuota:
// $orderId is empty — the POST field was not submitted
$orderId = $_POST['order_id'] ?? '';
// Resulting SQL is broken:
// SELECT * FROM orders WHERE id =
$sql = "SELECT * FROM orders WHERE id = $orderId";
Convalida la variabile prima di costruire la query:
// Fixed: validate before use
if (empty($orderId) || !is_numeric($orderId)) {
return; // do not run a malformed query
}
$sql = "SELECT * FROM orders WHERE id = " . intval($orderId);
Per diagnosticare questo problema in un ambiente WordPress live, apri phpMyAdmin o Adminer, vai al pannello delle query SQL ed esegui la query con un valore letterale noto e valido per confermare che la sintassi sia corretta in isolamento. Se passa lì, il problema è nel modo in cui la variabile viene popolata, non nella struttura della query stessa.
6. Aggiornare i comandi obsoleti
La sintassi di MySQL cambia tra le versioni principali. I dump di database generati su MySQL 5.x contengono spesso sintassi che fallisce immediatamente sui server MySQL 8.x. Le due cause più comuni nelle migrazioni di siti WordPress:
TYPE=MyISAM (rimosso; usa ENGINE=InnoDB):
-- Broken on MySQL 5.5+ (TYPE= keyword was removed)
CREATE TABLE wp_options (
option_id BIGINT(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (option_id)
) TYPE=MyISAM;
-- Fixed
CREATE TABLE wp_options (
option_id BIGINT(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (option_id)
) ENGINE=InnoDB;
DEFAULT CHARSET=latin1 su MySQL 8 in modalità strict:
I dump più vecchi specificano CHARSET=latin1. Su MySQL 8.0 con character_set_server=utf8mb4 e sql_mode=STRICT_TRANS_TABLES, questo può produrre un errore 1064 sulla riga CREATE TABLE. Correggi il dump prima dell’importazione:
-- Find in the dump file:
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- Replace with:
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Dai ticket di supporto di WP STAGING, l’innesco di errore 1064 più comune nelle migrazioni WordPress è un vecchio dump che contiene TYPE=MyISAM — fallisce sul primo CREATE TABLE e interrompe l’intera importazione. Una ricerca-e-sostituzione in un editor di testo prima di eseguire l’importazione lo risolve immediatamente.
Per confermare la versione di MySQL in esecuzione sul tuo server:
SELECT VERSION();
Consulta il MySQL Reference Manual per un elenco completo della sintassi rimossa e modificata tra le versioni.

Cosa fare se la soluzione non funziona
Se hai esaminato tutte e sei le cause e l’errore 1064 persiste, usa questa checklist per isolare la causa principale:
- Verifica di essere connesso al database corretto. Esegui
SHOW TABLES;per verificare che la tabella che stai interrogando esista e abbia esattamente il nome che la tua query si aspetta — incluso il prefisso delle tabelle WordPress. - Verifica la tua versione di MySQL:Se la sintassi della query richiede una versione di MySQL più recente di quella installata, aggiorna MySQL o riscrivi la query per la versione installata.
- Controlla il prefisso delle tabelle WordPress. Le tabelle WordPress usano il prefisso definito in
wp-config.php(comunementewp_). Una query che codifica in modo fissowp_optionsfallisce se il prefisso reale èwpstg_o qualcos’altro. - Isola la clausola che fallisce. Riduci la query alla sua forma più semplice — rimuovi join, subquery e clausole
WHEREuna alla volta finché l’errore 1064 non scompare. L’ultima clausola che hai rimosso è la causa. - Abilita il logging di debug di WordPress. Se l’errore 1064 proviene da un plugin o un tema, abilitare
WP_DEBUGeWP_DEBUG_LOGcattura la query completa con il suo stack trace. Vedi come abilitare la modalità di log di debug di WordPress — la voce di log indicherà la funzione esatta che genera la query malformata.
Conclusione
L’errore MySQL 1064 risale sempre a una causa specifica: un errore di battitura, una parola riservata usata senza backticks, parentesi non appaiate, una variabile mancante o sintassi obsoleta in un dump del database. Il messaggio di errore di MySQL ti fornisce il numero di riga e il frammento esatto in cui il parsing è fallito — questo è il tuo punto di partenza. Applica la soluzione corrispondente qui sopra e usa la checklist di risoluzione dei problemi se il primo tentativo non lo risolve.