Нужно ли явным образом приводить жестко закодированные значения в соединениях UNION, чтобы целые числа не превратились в строки, использующие mysqlnd? - PullRequest
0 голосов
/ 14 сентября 2018

Использование MariaDB 10.3.9 и следующий запрос:

SELECT photoId FROM photos WHERE photoId = 123;

с использованием PDO и mysqlnd в php var_dump даст int(123), как и ожидалось.

Но если я изменю запрос на

SELECT photoId FROM photos WHERE photoId = 123 UNION SELECT 1 FROM photos WHERE photoId = 456;

Тогда вывод будет string(3) "123", string(1), "1".

Если я изменю запрос на

SELECT photoId FROM photos WHERE photoId = 123 UNION SELECT CAST(1 AS UNSIGNED INT) FROM photos WHERE photoId = 456;

Я правильно получаю int(123), int(1).

Это кажется очень странным поведением - почему MariaDB предпочитает приводить явное значение 1 к строке, а не оставлять его как целое число, которое записывается как?

Еще страннее, у меня photoId определено как неподписанное. Если я просто использую CAST(1 AS INT), то все равно будет выглядеть как строка только потому, что я пропустил часть UNSIGNED.

1 Ответ

0 голосов
/ 05 октября 2018

Для MySQL ... Если столбец photoId равен INT (или любому другому числовому типу), то любой из них работает одинаково хорошо:

WHERE photoId = 123
WHERE photoId = '123'
WHERE photoId = "123"

Если столбец photoId равенa VARCHAR, тогда вам следует выполнить одно из следующих действий:

WHERE photoId = '123'
WHERE photoId = "123"

Неспособность использовать кавычку в строке отрицательно сказывается на использовании индекса, тем самым замедляя выполнение запроса.

PDO будетделайте «правильные вещи».

Не беспокойтесь о CASTing.

Мой опыт говорит, что first SELECT в UNION контролирует тип данных,Поэтому я тоже удивлен вашими результатами.

...