Мне любопытно узнать, как эти запросы работают в базе данных. Специально я сосредоточен на линиях № 4 и 6.
1.SELECT * FROM tableName
2.SELECT * FROM tableName WHERE 1
3.SELECT * FROM tableName WHERE 123
4.SELECT * FROM tableName WHERE '2xyz'
5.SELECT * FROM tableName WHERE ''
6.SELECT * FROM tableName WHERE 'xyz'
В вышеуказанных запросах 1,2,3,4 производят одинаковый результат, но 5 и 6 не дают никакого результата. Зачем? что такое diff b/w WHERE '2xyx' и 'xyz'? Как "2xyz" неявно преобразован в 2?
Предложение where
оценивает значение boolean true (не 0) или false (0), чтобы решить, находится ли запись в или из набора результатов.
Случаи 2 и 3 извлекают все записи, потому что ненулевые числа оцениваются как истинные.
Случай 3 извлекает все записи, потому что во время неявной строки для преобразования чисел mysql оценивает строку слева направо по символу. Пока символы могут быть оценены как число, mysql примет значение. Это включает измельчение ведущих пространств, интерпретацию знаков плюс или минус, десятичных точек и т.д. Таким образом, строка '2xyx'
интерпретируется как 2, поэтому логическая истина.
Случай 4 и 5 не извлекает никаких записей, потому что самый левый символ строк не может быть оценен как число, поэтому преобразование возвращает 0, таким образом, логическое значение false.
К сожалению, неявное преобразование строк в числовое значение в документе MySQL не документировано. Однако большинство правил можно вычесть из следующей части в разделе " Преобразование типов в разделе оценки выражений " руководства:
Для сравнения столбца строки с номером MySQL не может использовать индекс в столбце для быстрого поиска значения. Если str_col является индексированным столбцом строки, индекс не может использоваться при выполнении поиска в следующем выражении:
SELECT * FROM tbl_name WHERE str_col=1;1
Причина этого в том, что существует много разных строк, которые могут преобразовать значение 1, например "1", "1" или "1a".
Где имеет значение условия. Mysql любое число относится как значение TRUE и null или '' обрабатывается как FALSE.
1.SELECT * FROM tableName -- all record return
2.SELECT * FROM tableName WHERE 1 -- Return true value
3.SELECT * FROM tableName WHERE 123 -- Return true value
4.SELECT * FROM tableName WHERE '2xyz' -- Return true value because there first character is number
5.SELECT * FROM tableName WHERE '' -- false value return
6.SELECT * FROM tableName WHERE 'xyz' -- false value return
Это WHERE <condition>
, например WHERE col1 = 123
. Вместо этого у вас есть WHERE <number>
или WHERE <string>
, поэтому отсутствует выражение.
Что бы было возможно, хотя WHERE <boolean>
, и это то, что ожидает MySQL. И поскольку MySQL обрабатывает логические значения, такие как числа (0 = false, другие числа = true), он ищет число.
Таким образом, последний дает вам пустой набор результатов, поскольку условие where делает false.
В выражении SELECT... WHERE [where_condition]
, в выражении where_condition
вы можете использовать любую из функций и операторов, поддерживаемых MySQL, в которых также поддерживается строковый литерал. Для строк сравнения основаны на числовых значениях строкового блока. Также выполняется оценка преобразования типа выражения.
Таким образом, в приведенном выше случае 2xyz преобразуется в 2, что является true
и, следовательно, вы получаете все записи. Это как
SELECT * FROM tableName WHERE 2
и строка xyz преобразуется в 0, что является false
из-за чего вы получаете пустой набор результатов. Это то же самое, что:
SELECT * FROM tableName WHERE 0
An expression of non-boolean type specified in a context where a condition is expected, near '1'.