Antes de la versión 5.0.2 de MySQL, se permitía insertar valores ilegales convirtiéndolos en valores legales. A partir de la versión 5.0.2, sigue este compartimiento por defecto, pero puede elegir un tratamiento para valores incorrectos más tradicional, como no aceptarlos y abortar los comandos que los incluyen. Esta sección describe el comportamiento por defecto de MySQL (permisivo), así como el nuevo modo estricto SQL y en qué se diferencian.
          Lo siguiente es cierto si no usa modo estricto. Si inserta un
          valor "incorrecto" en una columna, como
          NULL en una columna NOT
          NULL o una valor numérico demasiado grande en una
          columna numérica, MySQL cambia el valor al "mejor valor
          posible" para la columna en lugar de producir un error:
        
Si trata de almacenar un valor fuera de rango en una columna numérica, MySQL Server en su lugar almacena cero, el menor valor posible, o el mayor valor posible en la columna.
Para cadenas de caracteres, MySQL almacena una cadena vacía o tanto de la cadena de carácteras como quepa en la columna.
Si trata de almacenar una cadena de caracteres que no empiece con un número en una columna numérica, MySQL Server almacena 0.
              MySQL le permite almacenar ciertos valores incorrectos en
              columnas DATE y
              DATETIME (tales como
              '2000-02-31' o
              '2000-02-00'). La idea es que no es el
              trabajo del servidor SQL validar fechas. Si MySQL puede
              almacenar una fecha y recuperarla fielmente, se almacena
              tal y como se da. Si la fecha es totalmente incorrecta
              (más allá de la capacidad del servidor para
              almacenarla), se almacena en su lugar el valor especial
              '0000-00-00'.
            
              Si intenta almacenar NULL en una
              columna que no admita valores NULL
              ocurre un error para los comandos
              INSERT de un solo registro. Para
              comandos INSERT de varios registros o
              para comandos INSERT INTO... SELECT ,
              MySQL Server almacena el valor implícito para el tipo de
              datos de la columna. En general, es 0
              para tipos numéricos, cadena vacía
              ("") para tipos de cadenas de
              caracteres, y el valor "cero" para tipos de fecha y
              tiempo. Los valores implícitos por defecto se discuten en
              Sección 13.1.5, “Sintaxis de CREATE TABLE”.
            
              Si un comando INSERT no especifica un
              valor para una columna, MySQL inserta su valor por defecto
              si la columna especifica un valor mediante la cláusula
              DEFAULT. Si la definición no tiene tal
              cláusula DEFAULT clause, MySQL inserta
              el valor por defecto implícito para el tipo de datos de
              la columna.
            
La razón para las reglas anteriores es que no podemos validar esas condiciones hasta que los comandos han empezado a ejecutarse. No podemos deshacer si encontramos un problema tras actualizar algunos registros, ya que el motor de almacenamiento puede no soportar rollback. La opción de terminar el comando no es siempre positiva; en este caso, la actualización quedaría "a medias", lo que posiblemente es la peor opción. En este caso, lo mejor es hacerlo "lo mejor posible" y continuar como si nada hubiera ocurrido.
          A partir de MySQL 5.0.2, puede seleccionar un tratamiento de
          validación de datos de entrada más estricto usando los modos
          SQL STRICT_TRANS_TABLES o
          STRICT_ALL_TABLES. Consulte
          Sección 5.3.2, “El modo SQL del servidor”.
        
          STRICT_TRANS_TABLES funciona así:
        
Para motores de almacenamiento transaccionales, valores incorrectos en cualquier parte del comando provocan que se aborte el comando y se deshaga el mismo.
              Para motores no transaccionales, el comando aborta si
              ocurre un error en el primer registro a insertar o
              actualizar. (En este caso, el comando dejará la tabla
              intacta, igual que en una tabla transaccional.) Los
              errores en registros después del primero no abortan el
              comando. En lugar de ello, los valores incorrectos se
              ajustan y se generan advertencias en lugar de errores. En
              otras palabras, con
              STRICT_TRANS_TABLES, un valor
              incorrecto provoca que MySQL deshaga todas las
              actualizaciones hechas hasta el momento, si es posible.
            
          Para chequeo estricto, active
          STRICT_ALL_TABLES. Es equivalente a
          STRICT_TRANS_TABLES excepto que en motores
          de almacenamiento no transaccionales, los errores abortan el
          comando incluso cuando hay datos incorrectos a partir del
          primer registro. Esto significa que si ocurre un error a
          medias de una inserción o actualización de varios registros
          en una tabla no transaccional, se produce una actualización
          parcial. Los primeros registros se insertan o actualizan, pero
          aquéllos a partir del punto en que ocurre el error no. Para
          evitar esto en tablas no transaccionales, use inserciones de
          un solo registro o use STRICT_TRANS_TABLES
          para obtener advertencias en lugar de errores. Para evitar
          problemas, no utilice MySQL para validar contenido de
          columnas. Es preferible (y a menudo más rápido) dejar que la
          aplicación se asegure de pasar sólo valores legales a la
          base de datos.
        
          Con cualquiera de las opciones de modo estricto, puede hacer
          que se traten los errores como advertencias usando
          INSERT IGNORE o UPDATE
          IGNORE en lugar de INSERT o
          UPDATE sin IGNORE.
        
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.

