para - MySQL, ¿es mejor insertar una cadena NULL o vacía?
mysql string length (6)
Es mejor insertar NULL
para NULL
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 una cadena vacía en las restricciones. Es posible que tenga que 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 duplicada?
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 DB tengo una tabla que contiene todos estos valores, ¿es mejor práctica insertar un valor NULL o una cadena vacía en las columnas de DB donde el usuario no puso ningún dato?
No sé cuál sería la mejor práctica aquí, pero generalmente me equivocaría en favor del nulo a menos que quiera que nulo signifique algo diferente de una cadena vacía, y la entrada del usuario coincida con su definición de cadena vacía.
Ten en cuenta que estoy diciendo que TÚ necesitas definir cómo quieres que sean diferentes. A veces tiene sentido tenerlos diferentes, a veces no es así. Si no, simplemente elige uno y quédate con él. Como dije, tiendo a favorecer a 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 (tenga una cláusula donde, en términos SQL) basada en esa columna, a menos que la selección sea para una columna nula por supuesto.
Si está utilizando varias columnas en un índice único y al menos una de estas columnas es obligatoria (es decir, un campo de formulario requerido), si establece las otras columnas en el índice en NULL, puede terminar con filas duplicadas. Esto se debe a que los valores NULL se ignoran en columnas únicas. En este caso, use cadenas vacías en las otras columnas del índice único para evitar filas duplicadas.
COLUMNS IN A UNIQUE INDEX: (event_type_id, event_title, date, location, url) EXAMPLE 1: (1, ''BBQ'', ''2018-07-27'', null, null) (1, ''BBQ'', ''2018-07-27'', null, null) // allowed and duplicated. EXAMPLE 2: (1, ''BBQ'', ''2018-07-27'', '''', '''') (1, ''BBQ'', ''2018-07-27'', '''', '''') // NOT allowed as it''s duplicated.
Aquí hay algunos códigos:
CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`event_id` int(11) DEFAULT NULL,
`event_title` varchar(50) DEFAULT NULL,
`date` date DEFAULT NULL,
`location` varchar(50) DEFAULT NULL,
`url` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `event_id` (`event_id`,`event_title`,`date`,`location`,`url`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Ahora inserta esto para ver que permitirá las filas duplicadas:
INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, ''1'', ''BBQ'', ''2018-07-27'', NULL, NULL);
INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, ''1'', ''BBQ'', ''2018-07-27'', NULL, NULL);
Ahora inserte esto y compruebe que no está permitido:
INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, ''1'', ''BBQ'', ''2018-07-28'', '''', '''');
INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, ''1'', ''BBQ'', ''2018-07-28'', '''', '''');
Por lo tanto, no hay bien o mal aquí. Depende de usted decidir qué funciona mejor con las reglas de su negocio.
Una cosa a considerar, si alguna vez planea cambiar las bases de datos, es que Oracle no admite cadenas vacías . Se convierten a NULL automáticamente y no se pueden consultar utilizando cláusulas como WHERE somefield = ''''
.
Una cosa a tener en cuenta es que NULL puede hacer que sus rutas de código sean mucho más difíciles. En Python, por ejemplo, la mayoría de los adaptadores de base de datos / ORM se asignan como NULL
a None
.
Así que 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.
Al usar NULL
puede distinguir entre "no poner datos" y "poner datos vacíos".
Algunas diferencias más:
Una
LENGTH
deNULL
esNULL
, unaLENGTH
de una cadena vacía es0
.NULL
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 enlazada pero no una
NULL
. Esta consulta:SELECT * FROM mytable WHERE mytext = ?
nunca coincidirá con un valor
NULL
enmytext
, independientemente del valor que pase del cliente. Para emparejarNULL
s, tendrás que usar otra consulta:SELECT * FROM mytable WHERE mytext IS NULL