MySQL, ¿es mejor insertar una cadena NULL o vacía?

Resuelto roflwaffle asked hace 15 años • 6 respuestas

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

roflwaffle avatar Aug 13 '09 01:08 roflwaffle
Aceptado

Al utilizar, NULLpuede distinguir entre "no poner datos" y "poner datos vacíos".

Algunas diferencias más:

  • A LENGTHde NULLes NULL, a LENGTHde una cadena vacía es 0.

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

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

  • Puede buscar una cadena vacía utilizando una variable vinculada, pero no un archivo NULL. Esta consulta:

    SELECT  *
    FROM    mytable 
    WHERE   mytext = ?
    

    nunca coincidirá con un NULLin mytext, sea cual sea el valor que pase del cliente. Para hacer coincidir NULLs, tendrás que usar otra consulta:

    SELECT  *
    FROM    mytable 
    WHERE   mytext IS NULL
    
Quassnoi avatar Aug 12 '2009 18:08 Quassnoi

Una cosa a considerar, si alguna vez planea cambiar de base de datos, es que Oracle no admite cadenas vacías . Se convierten a NULL automáticamente y no puedes consultarlos usando cláusulas como WHERE somefield = ''.

Matt Solnit avatar Aug 12 '2009 18:08 Matt Solnit

Una cosa a tener en cuenta es que NULL podría dificultar mucho las rutas de código. En Python, por ejemplo, la mayoría de los adaptadores/ORM de bases de datos se asignan NULLa None.

Entonces cosas como:

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

podría resultar en "¡Hola, ninguno, Joe Doe!" Para evitarlo necesitas 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.

max avatar Aug 12 '2009 19:08 max

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

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

Ver también: ¿Puede una clave externa ser NULL y/o estar duplicada?

Mike Casan Ballester avatar Oct 20 '2016 07:10 Mike Casan Ballester