Estoy ejecutando MySql Server 5.7.11 y esta oración:
updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
no está funcionando. Dando el error:
ERROR 1067 (42000): Invalid default value for 'updated'
Pero lo siguiente:
updated datetime NOT NULL DEFAULT '1000-01-01 00:00:00'
simplemente funciona .
El mismo caso para DATE.
Como nota al margen , se menciona en los documentos de MySQL :
El tipo DATE se utiliza para valores con una parte de fecha pero sin una parte de tiempo. MySQL recupera y muestra los valores de FECHA en formato 'AAAA-MM-DD'. El rango admitido es '1000-01-01' a '9999-12-31'.
aunque también digan:
Los valores DATE, DATETIME o TIMESTAMP no válidos se convierten al valor "cero" del tipo apropiado ('0000-00-00' o '0000-00-00 00:00:00').
Teniendo también en cuenta la segunda cita de la documentación de MySQL, ¿alguien podría hacerme saber por qué da ese error?
NULL
.Respuestas:
El error se debe al modo sql, que puede ser un modo estricto según la última documentación de MYSQL 5.7
La documentación de MySQL 5.7 dice :
Para comprobar el modo MYSQL
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
Inhabilitando el modo STRICT_TRANS_TABLES
Sin embargo, para permitir el formato
0000-00-00 00:00:00
, debe deshabilitar el modo STRICT_TRANS_TABLES en el archivo de configuración mysql o por comandoPor orden
SET sql_mode = '';
o
SET GLOBAL sql_mode = '';
El uso de la palabra clave
GLOBAL
requiere súper prejuicios y afecta las operaciones que todos los clientes conectan a partir de ese momento.si lo anterior no funciona, vaya a
/etc/mysql/my.cnf
(según ubuntu) y comenteSTRICT_TRANS_TABLES
Además, si desea establecer permanentemente el modo SQL al arrancar el servidor a continuación, incluir
SET sql_mode=''
enmy.cnf
el Linux o MacOS. Para Windows, esto debe hacerse enmy.ini
archivo.Nota
Sin embargo, el modo estricto no está habilitado por defecto en MYSQL 5.6. Por lo tanto, no produce el error según la documentación de MYSQL 6 que dice
ACTUALIZAR
Con respecto al asunto del error como lo dijo @ Dylan-Su:
No creo que este sea el problema, ya que la forma en que MYSQL evoluciona con el tiempo debido a que algunas cosas se cambian en función de la mejora adicional del producto.
Sin embargo, tengo otro informe de error relacionado con la
NOW()
funciónEl campo de fecha y hora no acepta el valor predeterminado AHORA ()
Otra nota útil [consulte Inicialización y actualización automáticas para TIMESTAMP y DATETIME ]
Actualización sobre NO_ZERO_DATE
A partir de MySQL a partir de 5.7.4, este modo está obsoleto. Para la versión anterior, debe comentar la línea respectiva en el archivo de configuración. Consulte la documentación de MySQL 5.7 el NO_ZERO_DATE
fuente
STRICT_TRANS_TABLES
para mis dos instancias de MySQL, local y servidor. Sin embargo, puedo insertar fácilmente0000-00-00
en mi instancia local, pero no puedo en mi instancia de servidor; se produce un error. ¿Por qué? Porque la configuración de MySQL de mi servidor se haNO_ZERO_DATE
habilitado. Y mi local no lo tiene.NO_ZERO_DATE
debe eliminarseTuve este error con WAMP 3.0.6 con MySql 5.7.14.
Solucion :
cambie la línea 70 (si su archivo ini está intacto) en el
c:\wamp\bin\mysql\mysql5.7.14\my.ini
archivo dea
y reinicie todos los servicios.
Esto desactivará el modo estricto. Según la documentación, "modo estricto" significa un modo con uno o ambos
STRICT_TRANS_TABLES
oSTRICT_ALL_TABLES
habilitado. La documentación dice:fuente
Entré en una situación en la que los datos se mezclaban entre NULL y 0000-00-00 para un campo de fecha. Pero no sabía cómo actualizar el '0000-00-00' a NULL, porque
ya no está permitido. Mi solución fue bastante simple:
porque todos los
my_date_field
valores incorrectos (sean fechas correctas o no) eran anteriores a esta fecha.fuente
<'0000-01-01'
ya que, por supuesto, es una fecha válida.Problema de sintaxis de configuración
En algunas versiones de MYSQL (probada 5.7. *) En sistemas * nix, debe usar esta sintaxis:
Estos no funcionarán:
guión sin comillas
subrayado sin comillas
subrayado y comillas
Una revisión más completa de los valores de configuración y el modo sql:
Cómo configurar banderas permanentes del modo Sql
fuente
Primero seleccione la sesión actual
sql_mode
:Entonces obtendrás algo como ese valor predeterminado :
y luego configurar
sql_mode
sin'NO_ZERO_DATE'
:Si tienes subvenciones, puedes hacerlo también para
GLOBAL
:fuente
Solo agrega la línea:
sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
archivo interior:
/etc/mysql/mysql.conf.d/mysqld.cnf
luego
sudo service mysql restart
fuente
SELECT @@SESSION.sql_mode;
primero, y que eliminen NO_ZERO_IN_DATE, NO_ZERO_DATE y STRICT_TRANS_TABLES de lo que le brinda. De esa manera, mantendrá cualquier otra configuración que haya habilitado. Tenía mucho más que solo esos dos elementos configurados para mi modo SQL. No sé qué hacen todos, pero no quiero arriesgarme a eliminarlos en este momento.Funciona para 5.7.8:
Puede crear un SQLFiddle para recrear su problema.
http://sqlfiddle.com/
Si funciona para MySQL 5.6 y 5.7.8, pero falla en 5.7.11. Entonces probablemente sea un error de regresión para 5.7.11.
fuente
Para resolver el problema con MySQL Workbench (después de aplicar la solución en el lado del servidor):
Elimine SQL_MODE a TRADITIONAL en el panel de preferencias.
fuente
Esta respuesta es solo para MySQL 5.7:
Lo mejor no está realmente en blanco en sql_mode, en su lugar use en PHP una variable de sesión con:
Así que al menos mantienes los otros valores predeterminados.
Es una locura que la documentación de mysql no esté clara, necesita eliminar estos valores defectuosos en sql_mode:
NO_ZERO_IN_DATE, NO_ZERO_DATE, lo entiendo, pero en futuras versiones esto será descontinuado.
STRICT_ALL_TABLES, con esto, antes de que se ignoren los parámetros, por lo que también debe eliminarlo.
Finalmente TRADICIONAL también, pero la documentación habla de este parámetro: “dar un error en lugar de una advertencia” al insertar un valor incorrecto en una columna ”, con este parámetro no se insertan fechas con valores cero, pero sin sí.
MySQL no está realmente organizado con estos parámetros y combinaciones.
fuente
Combinaciones de opciones para
mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64)
.No lanza:
STRICT_TRANS_TABLES
+NO_ZERO_DATE
Lanza:
STRICT_TRANS_TABLES
+NO_ZERO_IN_DATE
Mi configuración en
/etc/mysql/my.cnf
Ubuntu:fuente
fuente
En el directorio xamp / mysql / bin Abra "my.ini" y cambie la línea: Sql_node por ->
"sql_mode = NO_ENGINE_SUBSTITUTION, NO_ZERO_DATE"
QUITAR "NO_ZERO_IN_DATE"
fuente