2011-08-02 19 views
8

Mi instrucción de inserción nula se ve así:Cadena vacía insertando un cero, no un

INSERT INTO foo (bar) VALUES (''); 

El campo bar fue creado de este modo:

bar INT(11) 
    COLLATION: (NULL) 
    NULL: YES 
    DEFAULT: (NULL) 

versión de MySQL: 5.1.

¿No debería una cadena vacía insertar un NULO? No estoy seguro de por qué estoy viendo un cero (0) almacenado en la tabla.

+0

ver también mysql "modo estricto" –

Respuesta

11

MySQL intenta de forma predeterminada forzar valores inválidos para una columna al tipo correcto. Aquí, la cadena vacía '' es de tipo cadena, que no es ni un entero ni NULO. Sugiero tomar los siguientes pasos:

  1. cambiar la consulta a la siguiente: INSERT INTO foo (bar) VALUES (NULL);
  2. Activar el modo estricto en MySQL. Esto evita que ocurran tantas conversiones inesperadas de tipo y valor. Verá más mensajes de error cuando intente hacer algo que MySQL no espera, lo que le ayuda a detectar problemas más rápidamente.
+0

# 2 explica mucho. Gracias. – gravyface

+0

El modo estricto es muy importante. Los valores predeterminados de Mysql se inclinan hacia datos descuidados. Como desarrollador, ¿realmente quieres truncar datos y no estar al tanto? Ay. –

5

No está insertando NULL en la tabla; está insertando una cadena vacía (que aparentemente se asigna a cero como un int). Recuerde que NULL es un valor distinto en SQL; NULL != ''. Al especificar cualquier valor (que no sea NULL), no está insertando NULL. El valor predeterminado solo se usa si no especifica un valor; en su ejemplo, especificó un valor de cadena en una columna entera.

+0

"que aparentemente se asigna a cero como un int" y dice en el manual de MySQL que "Para los tipos numéricos, el valor predeterminado es 0", pero explícitamente establecido en NULL como predeterminado para la columna, ¿por qué lo está poniendo a cero? La forma en que leo cómo funciona es que _ cualquier cosa_ pero un entero debe almacenarse como NULL si el valor predeterminado es NULL. – gravyface

+3

El valor predeterminado para la columna solo es relevante si no proporciona un valor. Aquí ha proporcionado un valor, pero no es válido, por lo que MySQL intenta interpretarlo como un número entero. La interpretación a la que llega es un número entero 0. – Hammerite

2

La forma de hacerlo es no llenar el campo en absoluto. solo llene los que realmente necesitan tener un valor.

2

¿Por qué debería ser un NULL? Está proporcionando un valor que tiene una representación entera: las cadenas vacías se convierten a INT0.

Solo si no proporcionó cualquier valor de tomaría el control predeterminado.

Cuestiones relacionadas