11 10/04/2026 9 min

Errore 1064: non è “un problema di MySQL”, è quasi sempre una query che non passa il parser

Il messaggio “Syntax error or access violation: 1064 You have an error in your SQL syntax” indica che MySQL/MariaDB ha fermato l’esecuzione prima ancora di toccare i dati. In pratica il motore non riesce a interpretare la query come SQL valido, oppure la interpreta come un costrutto che in quella versione non è ammesso.

In ambiente hosting questo errore compare spesso in tre punti: applicazione web, pannello di gestione o import di dump. La tentazione è andare a caccia del database “rotto”, ma nel 90% dei casi il database è sano: è la stringa SQL a essere sbagliata, troncata, incompatibile o costruita male da codice PHP, plugin, CMS o tool di migrazione.

La cosa utile da fare subito è separare errore di sintassi da errore di accesso. Nel testo dell’errore, “access violation” è una formula storica del client e non significa per forza permessi sbagliati. Se la query è invalida, il parser si ferma prima. I permessi entrano in gioco solo se la sintassi è corretta ma l’utente non può eseguire quell’operazione.

Dove si rompe davvero: layer applicazione, non storage

Classificazione pratica: troubleshooting. Stato atteso vs osservato: ci si aspetta che la query venga accettata e produca un result set o una modifica; si osserva invece un errore 1064 con riga/posizione, spesso dopo un deploy, un aggiornamento CMS o un import.

Nel flusso di diagnosi conviene partire dal layer più vicino all’origine della query:

  • Applicazione: stringa SQL generata male, prepared statement costruito male, escaping insufficiente, concatenazione di input.
  • Versione database: sintassi valida su una versione e non su un’altra, ad esempio cambi di keyword, funzioni deprecate o SQL mode più severo.
  • Import/migrazione: dump troncato, encoding errato, delimitatori sbagliati, commenti o caratteri speciali che rompono il parser.

Se il sito “va giù” solo in una pagina o solo su una funzione, l’origine è quasi sempre la query generata in quella rotta. Se invece il problema è globale dopo una modifica, il candidato principale è un deploy o una migrazione SQL recente.

Le cause più probabili, in ordine utile

  1. Query malformata o troncata. È il caso classico: virgola mancante, parentesi non chiusa, apici sbilanciati, keyword nel punto sbagliato. Si falsifica in pochi minuti copiando la query esatta e provandola manualmente sul server MySQL con un client, oppure confrontando il log applicativo con la query attesa.
  2. Caratteri non escapati o encoding incoerente. Un apostrofo, un backslash o una sequenza UTF-8 corrotta può spezzare la query. Si falsifica controllando il valore che arriva all’app e confrontandolo con i dati originali; se il problema sparisce sostituendo il dato con un valore semplice, il sospetto è forte.
  3. Incompatibilità tra codice e versione SQL. Query generate per MySQL 8 possono fallire su 5.7 o MariaDB, e viceversa. Si falsifica leggendo la versione con SELECT VERSION(); e confrontando la sintassi usata con la documentazione della versione effettiva.

Se l’errore è comparso dopo un aggiornamento del pannello o del CMS, non partire dalla teoria: estrai la query reale e verifica se è cambiata la forma SQL o se è cambiato il motore sottostante.

Verifica minima: prima la query, poi il resto

La diagnosi buona è quella che riduce il problema a una stringa precisa. Serve sempre un artefatto verificabile: la query completa, il punto del codice, il log del database o il dump importato.

  1. Recupera la query esatta dall’applicazione o dal log. In PHP spesso la trovi nei log applicativi, nei log del framework o temporaneamente stampando la query prima dell’esecuzione. Se hai un errore su una pagina web, cerca nel log web e nell’error log PHP.
  2. Controlla il messaggio completo del server MySQL/MariaDB. L’errore 1064 di solito indica anche un punto vicino al token incriminato. Se hai riga e posizione, usali: sono più utili del messaggio generico mostrato dal frontend.
  3. Prova la query manualmente nel client SQL. Se la query fallisce anche lì, il problema è nella sintassi e non nell’applicazione. Se invece funziona manualmente, il difetto è nella costruzione dinamica lato codice.
  4. Verifica la versione del database con SELECT VERSION(); e, se necessario, l’engine reale con SHOW VARIABLES LIKE 'version%';. Se la sintassi usa funzioni o clausole non supportate, il mismatch è confermato.

Un controllo molto pratico è confrontare il testo della query prima dell’esecuzione con quello che pensi di aver scritto. In hosting condiviso o in ambienti con CMS, spesso il punto non è il file sorgente ma un plugin, un modulo o una query costruita da template.

Pattern che vedo spesso negli ambienti hosting

Ci sono errori ricorrenti che valgono quasi come firma diagnostica.

Virgole, parentesi e apici

Una virgola finale in una lista di campi, una parentesi chiusa troppo presto o un apice non chiuso generano 1064 in modo immediato. È banale, ma nei deploy frettolosi è il caso più frequente. Il controllo migliore è incollare la query in un client SQL con formattazione leggibile, non guardarla dentro una stringa PHP compressa su una sola riga.

Keyword riservate usate come nomi

Campi o tabelle chiamati come keyword SQL possono rompere la query se non sono delimitati correttamente. Esempi classici: nomi troppo generici o ereditati da vecchi schemi. La prova rapida è racchiudere i nomi con i backtick, ma il fix vero è rinominare lo schema se possibile o standardizzare la quoting strategy nell’applicazione.

Import SQL incompleto

Un dump troncato a metà o un file caricato con encoding sbagliato può produrre un errore di sintassi alla prima riga “strana”. In hosting capita durante restore via pannello o upload via browser. Se l’errore compare su una riga molto alta o su fine file, controlla dimensione del dump, integrità del file e presenza di linee tagliate.

SQL mode più rigido

Un upgrade del server può attivare mode più severi o cambiare il comportamento di alcune funzioni. Quello che prima “passava” può diventare errore. Qui la soluzione non è allentare tutto a caso: va verificata la query e adattata allo standard della versione target.

Fix sicuro: correggere la query senza allargare il blast radius

Se devi intervenire in produzione, la regola è semplice: modifica minima, reversibile, con backup del file o dello snippet prima di toccare qualcosa.

  1. Salva la query o il file che la genera. Se è codice, crea un diff o una copia del file prima della modifica. Se è una query manuale in un tool, esportala o incollala in un file di lavoro.
  2. Correggi un solo punto alla volta: apice, virgola, parentesi, quoting dei campi, funzione incompatibile. Non riscrivere tutta la query se basta sistemare il token che rompe il parsing.
  3. Riesegui la query e confronta l’output atteso. Se l’errore cambia ma non sparisce, hai ridotto il problema ma non lo hai ancora chiuso.
  4. Se il problema è nel codice, logga la query finale prima dell’esecuzione per vedere la stringa reale. In PHP e framework moderni questo è spesso più utile di leggere il sorgente, perché mostra i valori già interpolati.

Se la query usa input utente, la correzione vera è passare a prepared statements o parametri bindati. L’escaping manuale è una toppa fragile e non dovrebbe essere il punto di arrivo, soprattutto in contesti esposti al web.

Quando il problema è l’import o la migrazione

Se l’errore nasce durante un restore, il check da fare è diverso: non basta aprire la query, bisogna verificare il file SQL e il contesto di import.

  1. Controlla se il dump è integro e completo. Un file tagliato può sembrare valido fino al punto in cui il parser incontra la prima istruzione spezzata.
  2. Verifica l’encoding del file e del database. Se il dump contiene caratteri non rappresentati correttamente, il parser può interpretare male virgolette e apici.
  3. Se il dump è grande, importalo in modo controllato da CLI e non da interfaccia web. Le UI di hosting spesso hanno limiti di tempo, memoria e upload che trasformano un file buono in un import corrotto.

Se ti serve confermare il punto preciso del fallimento, usa il numero di riga indicato dall’errore e ispeziona quella zona del dump. Nei file SQL lunghi il token incriminato è spesso vicino alla riga riportata, non necessariamente esattamente su di essa.

Controlli finali prima di chiudere l’incidente

Dopo la correzione, verifica che il fix non abbia introdotto effetti collaterali.

  1. Esegui di nuovo la query o il flusso applicativo che generava il 1064. L’atteso è assenza di errore e ritorno di dati o conferma di modifica.
  2. Controlla i log dell’applicazione e del database per eventuali errori residui, warning di sintassi o query alternative fallite.
  3. Se hai toccato codice o configurazione, osserva almeno una richiesta reale dell’utente o un test funzionale equivalente per confermare che il percorso sia davvero operativo.
  4. Se il fix è stato fatto su un file o uno snippet, conserva il diff o il backup per rollback rapido. Se qualcosa peggiora, il rollback deve essere un ripristino del file precedente, non una nuova modifica improvvisata.

Rollback consigliato: ripristino del file originale, disattivazione del plugin o ritorno alla query precedente se il cambiamento era lato codice. Se hai modificato dati o schema, il rollback va pianificato prima di procedere, non dopo aver verificato il problema.

Assunzione operativa: l’errore 1064 è trattato come incidente applicativo fino a prova contraria; se non hai la query esatta, non hai ancora abbastanza elementi per fare una correzione sicura.

Una regola pratica che evita metà dei casi

Quando compare 1064, non leggere solo il messaggio: cerca la query reale. Quasi sempre il problema si risolve più velocemente lì che non nel database. In hosting, dove l’errore può venire da CMS, pannello, import o plugin, la differenza tra un fix rapido e ore perse sta tutta nella capacità di isolare la stringa SQL esatta, eseguirla in modo controllato e correggere il punto minimo che rompe il parser.

Se la query è valida nel client ma fallisce nell’app, la prossima cosa da guardare è la costruzione dinamica. Se fallisce anche nel client, hai trovato il difetto vero: sintassi, compatibilità o file di import corrotto. Da lì in poi il lavoro non è “provare a caso”, ma chiudere il gap con un controllo mirato, una modifica reversibile e una verifica finale sul percorso utente.