Mysql
 sql >> Database >  >> RDS >> Mysql

Perché una colonna di testo non può avere un valore predefinito in MySQL?

Windows MySQL v5 genera un errore ma Linux e altre versioni generano solo un avviso. Questo deve essere risolto. WTF?

Vedi anche un tentativo di risolvere questo problema come bug #19498 in MySQL Bugtracker:

Bryce Nesbitt il 4 aprile 2008 16:36:
Su MS Windows la regola "no DEFAULT" è un errore, mentre su altre piattaforme è spesso un avviso. Sebbene non sia un bug, è possibile rimanere intrappolati da questo se si scrive codice su una piattaforma indulgente e successivamente lo si esegue su una piattaforma rigida:

Personalmente, lo considero un bug. La ricerca di "La colonna BLOB/TEXT non può avere un valore predefinito" restituisce circa 2.940 risultati su Google. La maggior parte di questi sono segnalazioni di incompatibilità quando si tenta di installare script DB che hanno funzionato su un sistema ma non su altri.

Sto riscontrando lo stesso problema ora su una webapp che sto modificando per uno dei miei client, originariamente distribuito su Linux MySQL v5.0.83-log. Sto eseguendo Windows MySQL v5.1.41. Anche cercando di utilizzare l'ultima versione di phpMyAdmin per estrarre il database, non riporta un valore predefinito per la colonna di testo in questione. Tuttavia, quando provo a eseguire un inserto su Windows (che funziona bene sulla distribuzione Linux) ricevo un errore di non impostazione predefinita sulla colonna ABC. Provo a ricreare la tabella localmente con l'ovvia impostazione predefinita (basata su una selezione di valori univoci per quella colonna) e finisco per ricevere l'utile La colonna BLOB/TEXT non può avere un valore predefinito .

Ancora una volta, non mantenere la compatibilità di base tra le piattaforme è inaccettabile ed è un bug.

Come disabilitare la modalità rigorosa in MySQL 5 (Windows):

  • Modifica /my.ini e cerca la riga

    sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    
  • Sostituiscilo con

    sql_mode='MYSQL40'
    
  • Riavvia il servizio MySQL (supponendo che sia mysql5)

    net stop mysql5
    net start mysql5
    

Se disponi dell'accesso come root/amministratore potresti essere in grado di eseguire

mysql_query("SET @@global.sql_mode='MYSQL40'");