2009-08-12 13 views
202

Tengo un formulario en un sitio web que tiene muchos campos diferentes. Algunos de los campos son opcionales, mientras que algunos son obligatorios. En mi DB tengo una tabla que contiene todos estos valores, ¿es una mejor práctica insertar un valor NULL o una cadena vacía en las columnas DB donde el usuario no puso ningún dato?MySQL, ¿es mejor insertar cadena NULL o vacía?

Respuesta

203

Al usar NULL puede distinguir entre "poner datos sin datos" y "poner datos vacíos".

Algunos más diferencias:

  • Un LENGTH de NULL es NULL, un LENGTH de una cadena vacía es 0.

  • NULL s se ordenan antes de las cadenas vacías.

  • COUNT(message) contará cadenas vacías pero no NULL s

  • Puede buscar una cadena vacía usando una variable ligada pero no para un NULL. Esta consulta:

    SELECT * 
    FROM mytable 
    WHERE mytext = ? 
    

    nunca va a coincidir con un NULL en mytext, cualquier valor que se pasa desde el cliente. Para que coincida con NULL s, usted tiene que utilizar otro tipo de consulta:

    SELECT * 
    FROM mytable 
    WHERE mytext IS NULL 
    
+1

pero ¿cuál crees que es más rápido? 0 o NULL o "" –

+3

@aadravid: no hay diferencia. – Quassnoi

+7

en InnoDB NULL ocupa menos espacio –

3

no sé cuál sería la mejor práctica aquí, pero en general podría errar en favor de la hipótesis nula a menos que desee nula para significar algo diferente de cadena vacía, y la entrada del usuario coincide con la definición de cadena vacía.

Tenga en cuenta que digo que USTED necesita definir cómo desea que sean diferentes. A veces tiene sentido tenerlos diferentes, a veces no es así. Si no, simplemente elija uno y quédese con él. Como dije, tiendo a favorecer al NULL la mayor parte del tiempo.

Ah, y tenga en cuenta que si la columna es nula, es menos probable que el registro aparezca en prácticamente cualquier consulta que seleccione (tiene una cláusula where, en términos SQL) basada en esa columna, a menos que la selección para una columna nula, por supuesto.

+0

... Y ahora que veo la respuesta por encima de mí, creo que es seguro decir que la diferenciación habitual que te interesaría no es la de los datos en comparación con los datos vacíos. :-) –

38

Una cosa a considerar, si alguna vez planea cambiar las bases de datos, es Oracle does not support empty strings. Se convierten a NULL automáticamente y no puede consultarlos usando cláusulas como WHERE somefield = ''.

+11

Esto sonaba increíblemente sospechoso para mí, incluso en su enlace, así que lo intenté. Campo nulo, establecido en '', Oracle lo ignora. Informa longitud como nulo en lugar de 0. Eso es tan malo. Tiene que haber alguna forma de evitar esto. Creo que publicaré esto como otra pregunta. –

+1

'Steve B.': vea esta pregunta: http://stackoverflow.com/questions/1171196/difference-between-varchar-and-varchar2 – Quassnoi

+0

Gracias por la referencia, aunque todavía no entiendo el razonamiento. Publicado como http://stackoverflow.com/questions/1268177/oracle-not-distinguishing-between-nulls-and-empty-strings –

7

Una cosa a tener en cuenta es que NULL puede hacer que sus rutas de codificación sean mucho más difíciles. En Python, por ejemplo, la mayoría de los adaptadores de bases de datos/ORM se asignan NULL a None.

Así las cosas como: "¡Hola, Ninguno Joe Doe"

print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow 

podría dar lugar a Para evitarlo necesita algo como este código:

if databaserow.title: 
    print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow 
else: 
    print "Hello, %(firstname) %(lastname)!" % databaserow 

Lo que puede hacer las cosas mucho más complejas.

+22

En mi opinión, abusar de su base de datos para "corregir" errores en su código o en el marco es una (muy) mala práctica de codificación. Cuando no hay datos, solo debe insertar NULL y ser consistente al usar eso. De lo contrario, debe usar declaraciones como: if (myString == null || myString = ""). Cuando un objeto no está configurado o definido en su código, también está usando NULL en lugar de algún tipo de "marcador de posición" (que en mi opinión es una cadena vacía). – Gertjan

+5

Depende mucho de su idioma de elección. En Python "if not myString:" prueba None y "". Probablemente principalmente un problema cultural. La "mala práctica" de Java Guys es la elegancia de la persona dinámica. – max

5

Es mejor insertar NULL para mantener la coherencia en su base de datos en MySQL. Las claves externas se pueden almacenar como NULL pero NO como cadenas vacías.

Tendrá problemas con cadena vacía en las restricciones. Puede que tenga que insertar un registro falso con cadena vacía única para satisfacer una restricción de clave externa. Mala práctica, supongo.

Consulte también: Can a foreign key be NULL and/or duplicate?

-1

No sé sobre el rendimiento. Pero en términos de calidad de datos, null es malo.

Null le proporciona el tipo maybe, lo que obliga a escribir el tipo de tiempo de ejecución comprobar como: something = a.b.c.d.something if exist?(a) && exist?(a.b) && exist?(a.b.c) && exist?(a.b.c.d) && exist?(a.b.c.d.something).

Este problema podría ser mitigado si no está utilizando los formatos json/hash/array.

Pero sí, letting null exist is a billion dollar mistake.

Cuestiones relacionadas