mysql - no_engine_substitution - set sql_mode pipes_as_concat
¿Qué validación hace MySQL cuando se habilita el modo estricto? (2)
Me sorprendió bastante cuando MySQL me permitió insertar un NULL
en un campo creado con NOT NULL
. Hice una investigación y descubrí cómo habilitar el modo estricto. Sin embargo, no estoy muy seguro de qué validación hace MySQL cuando STRICT_ALL_TABLES
está habilitado.
El manual dice:
El modo estricto controla cómo MySQL maneja los valores de entrada que no son válidos o que faltan. Un valor puede ser inválido por varias razones. (énfasis mío) Por ejemplo, podría tener el tipo de datos incorrecto para la columna o podría estar fuera de rango.
Entiendo lo que considera faltante y cómo lo maneja. No tengo claro qué considera inválido . He hecho algunas pruebas y descubrí lo siguiente:
- las cadenas que son demasiado largas no son válidas
- los números que están fuera de rango no son válidos
-
NULL
s para una columna noNULL
no son válidos -
TRUE
yFALSE
siempre parecen ser válidos (se convierten en 1 y 0 respectivamente) - las fechas inválidas son inválidas
- las fechas cero son válidas (se pueden habilitar modos adicionales para cambiar este comportamiento)
- Las flotaciones en un campo entero son válidas (se redondean)
- las letras en un campo numérico no son válidas
¿MySQL realiza otras comprobaciones de validación que no sean las mencionadas anteriormente?
El manual dice "tipo de datos incorrecto para la columna", pero la única situación que veo cuando esto realmente entra en juego son las letras en un campo numérico. ¿Hay otros ejemplos de errores de tipo de datos?
¿Hay una lista en algún lugar de exactamente qué controles realiza MySQL?
EDITAR: Para el registro, mi aplicación ya hace una validación extensa. Estoy usando el modo estricto como una última oportunidad, solo en caso de que sea necesario. Si me olvido de revisar algo, quiero que falle rápido en lugar de "silenciar mis datos en silencio".
Revisé el código fuente de MySQL 5.5.28 (Community Server Edition) para encontrar instancias de STRICT_ALL_TABLES que se están utilizando.
Por lo que vi, parece que tu lista ya está bastante completa, pero a continuación hay algunas cosas más que aprendí sobre el uso de STRICT_ALL_TABLES. La primera es otra validación, mientras que el resto se ocupa de errores y advertencias.
- Las columnas de geometría no pueden tener un valor predeterminado. (sql / field.cc: 9394)
- Si un comentario de la tabla tiene más de 2048 caracteres, MySQL produce un error en lugar de truncar el comentario con una advertencia. (sql / unireg.cc: 231)
- Si un comentario de campo tiene más de 1024 caracteres, MySQL produce un error en lugar de truncar el comentario con una advertencia. (sql / unireg.cc: 739)
- En una inserción o actualización, si existe un valor duplicado en un SET o ENUM MySQL produce un error en lugar de una advertencia. (sql / sql_table.cc: 2503)
- Hay un montón de operaciones que abortarán en la advertencia con STRICT_ALL_TABLES en lugar de continuar con solo una advertencia. Estos son demasiado numerosos para que los enumere, y la configuración de la bandera abort_on_warning está demasiado alejada del código que crea las advertencias para que yo pueda documentar (o incluso comprender) fácilmente todos ellos. Pero si alguien quiere ensuciarse las manos con el código fuente, algunos lugares para comenzar serían sql / sql_update.cc: 630 y sql / sql_insert.cc: 841
Un buen recurso es verificar la fuente de MySQL y leer mysql-test/t/strict.test
para ver todos los casos que verifican después de configurar el modo STRICT o el modo TRADITIONAL (que es un superconjunto de STRICT).
Hiciste excelentes investigaciones y pruebas, pero hay algunos casos más, como:
- Intentando insertar un valor ENUM indefinido.
- Se intenta insertar un valor predeterminado para una columna NOT NULL sin definir DEFAULT.
- Intentando utilizar CAST () para convertir cadenas en enteros, etc.
- Conversión de VARCHAR a MEDIUMTEXT o LONGTEXT si da una longitud mayor que 65536.
- Truncamiento de cadenas COMMENT para tablas y columnas.
- Conversión de cadena a tipo YEAR.
- Definiendo una columna SET o ENUM con entradas duplicadas.
También mysql-test/include/strict_autoinc.inc
, porque prueba el desbordamiento cuando un valor auto-inc crece demasiado.
Hay algunos otros archivos de prueba que usan el modo ESTRICTO para pruebas específicas, pero no los examiné.