MySQL, ¿es mejor insertar una cadena NULL o vacía?
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?
Al utilizar, NULL
puede distinguir entre "no poner datos" y "poner datos vacíos".
Algunas diferencias más:
A
LENGTH
deNULL
esNULL
, aLENGTH
de una cadena vacía es0
.NULL
Los s se ordenan antes de las cadenas vacías.COUNT(message)
contará cadenas vacías pero noNULL
sPuede 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
NULL
inmytext
, sea cual sea el valor que pase del cliente. Para hacer coincidirNULL
s, tendrás que usar otra consulta:SELECT * FROM mytable WHERE mytext IS NULL
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 = ''
.
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 NULL
a 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.
Es mejor insertar NULL
para mantener la coherencia en su base de datos en MySQL. Las claves externas se pueden almacenar como NULL
cadenas 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?