2012-04-05 14 views
12

MySQL proporciona un buen operador <=> que funciona con comparaciones que pueden contener un valor nulo, como null <=> null o null <=> 5, etc., que devuelve resultados intuitivos como muchos lenguajes de programación. Mientras que el operador de igual normal siempre devuelve nulo, lo que atrapa a muchos usuarios nuevos de MySQL, como yo, a mal.¿Hay alguna razón para no usar <=> (seguro nulo es igual a operador) en mysql en lugar de =?

¿Hay alguna razón por la cual MySQL tenga ambas y NO SOLO la funcionalidad en <=>? ¿Quién realmente necesita un operador que esté efectivamente indefinido con los tipos de lenguaje integrados?

Respuesta

6

La gran diferencia entre nulo en MySQL y en lenguajes de programación es que en MySQL, NULL significa desconocido valor mientras que en la programación que significa indefinido valor.

En mySQL, null no es igual a null (desconocido no es igual a desconocido). Mientras que en los lenguajes de programación, null tiene el mismo valor nulo (undefined es igual a undefined).

+3

Sí, pero ¿hay alguna razón lógica para esto? ¿Qué problema del mundo real hace esto más fácil? – Jonathon

2

¿Hay alguna razón MySQL tiene tanto y no sólo la funcionalidad en < => ? Los operadores son completamente diferentes entre sí.

<=> realiza una comparación de igualdad como el operador =, pero vuelve 1 en lugar de NULL si ambos operandos son NULL, y en lugar de 0NULL si un operando es NULL.

¿Quién realmente necesita un operador que esté efectivamente indefinido con incorporado en los tipos de idioma?

Esto depende del caso, simplemente porque no ha encontrado tales casos, no significa que nadie lo necesita.

+0

¿Alguien puede pensar en algún caso? Porque no puedo recordar dónde podría haber usado el comportamiento de 0 = <=> en más de una década de desarrollo profesional. – cellige

+0

Pude ver el uso if = 's proporcionado un comportamiento diferente pero no proporciona ningún comportamiento cuando se usa con NULL ya que el resultado es siempre nulo mientras null está en la expresión .. – cellige

+2

@cellige No proporciona (razonable, útil) comportamiento cuando se usa con un literal NULL. Pero al comparar dos expresiones no literales y que aceptan nulos, definitivamente hace algo que alguien razonablemente podría querer. –

10

¿Quién realmente necesita un operador que sea efectivamente indefinido con los tipos de lenguaje incorporados?

Ha solicitado algunos ejemplos del mundo real. Aquí hay uno espurio. Digamos que tiene un programa juvenil residencial o similar, y uno de los requisitos es que los niños solo compartan habitación con alguien del mismo sexo. Tiene un campo M/F que puede anularse en su base de datos, que se puede anular porque su feed de datos está incompleto (todavía está buscando algunos de los datos). Tu código de coincidencia de habitación definitivamente no debería coincidir con estudiantes en donde t1.Gender < => t2.Género, porque podría terminar emparejando dos niños de sexo desconocido, que podrían ser de sexos opuestos. En su lugar, coincide donde son iguales y no ambos nulos.

Eso es solo un ejemplo. Admito que el comportamiento de NULL y el operador = ha causado mucha confusión a lo largo de los años, pero en última instancia la falla probablemente radique en la plétora de tutoriales en línea de MySQL que no mencionan cómo NULL interactúa con los operadores, ni de la existencia de el operador <=>.

+0

Buen ejemplo. Parafraseando y posiblemente elaborando. Las expresiones 'null' pueden ser útiles cuando los campos tienen un número finito de valores posibles, sin embargo, ¿permiten que los campos estén indefinidos hasta un punto posterior en la ejecución de la aplicación? – PdC

+0

Daría un paso más: no veo por qué solo son útiles con un número finito de valores (obviamente, todos los campos SQL tienen un número finito de valores, pero supongo que quiere decir un _small_ número finito !) Los valores nulos funcionan bien en todo tipo de casos en los que no se conocen los valores de los datos (ya sea que se los conozca o no). – almcnicoll

4

¿Quién realmente necesita un operador que esté efectivamente indefinido con incorporado en los tipos de idioma?

también lo necesita para las relaciones dentro de su base de datos. especialmente si está utilizando restricciones de clave externa.

por ejemplo si tiene una tabla para tareas (en su empresa). luego asigna estas tareas a los empleados. entonces tiene una relación desde su tabla de tareas hasta su tabla de empleados.
y siempre habrá algunas tareas sin asignar. en este caso, el campo en su tabla de tareas que utiliza para la relación con la tabla de empleados contendrá NULL. esto se asegurará de que esta tarea no esté asignada. lo que significa que no hay posibilidad de que exista una relación con la tabla de empleados.

si NULL = NULL habría true, a continuación, en mi ejemplo no habría siempre la posibilidad de que la clave externa de la tabla empleados también es NULL. por lo tanto, la tarea se asignaría a uno o algunos empleados. y nunca podrá saber con certeza si una tarea está asignada a algún empleado o no.

Cuestiones relacionadas