sql >> Base de Datos >  >> RDS >> Mysql

¿Por qué una columna de texto no puede tener un valor predeterminado en MySQL?

Windows MySQL v5 arroja un error, pero Linux y otras versiones solo generan una advertencia. Esto necesita ser arreglado. WTF?

También vea un intento de arreglar esto como error #19498 en MySQL Bugtracker:

Bryce Nesbitt el 4 de abril de 2008 4:36 p. m.:
En MS Windows, la regla "no DEFAULT" es un error, mientras que en otras plataformas suele ser una advertencia. Si bien no es un error, es posible quedar atrapado por esto si escribe código en una plataforma indulgente y luego lo ejecuta en una plataforma estricta:

Personalmente, veo esto como un error. La búsqueda de "la columna BLOB/TEXT no puede tener un valor predeterminado" arroja alrededor de 2940 resultados en Google. La mayoría de ellos son informes de incompatibilidades al intentar instalar scripts de base de datos que funcionaron en un sistema pero no en otros.

Me encuentro con el mismo problema ahora en una aplicación web que estoy modificando para uno de mis clientes, implementada originalmente en Linux MySQL v5.0.83-log. Estoy ejecutando Windows MySQL v5.1.41. Incluso al intentar usar la última versión de phpMyAdmin para extraer la base de datos, no informa un valor predeterminado para la columna de texto en cuestión. Sin embargo, cuando intento ejecutar una inserción en Windows (que funciona bien en la implementación de Linux), recibo un error de ausencia de valor predeterminado en la columna ABC. Trato de recrear la tabla localmente con el valor predeterminado obvio (basado en una selección de valores únicos para esa columna) y termino recibiendo la tan útil columna BLOB/TEXT no puede tener un valor predeterminado .

Nuevamente, no mantener la compatibilidad básica entre plataformas es inaceptable y es un error.

Cómo deshabilitar el modo estricto en MySQL 5 (Windows):

  • Edite /my.ini y busque la línea

    sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    
  • Reemplázalo con

    sql_mode='MYSQL40'
    
  • Reinicie el servicio MySQL (suponiendo que sea mysql5)

    net stop mysql5
    net start mysql5
    

Si tiene acceso de raíz/administrador, es posible que pueda ejecutar

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