2014-09-27 2 views
-1

У меня есть огромная проблема с моим приложением. Прежде, чем я начну, красные предметы Mysql treating varchar as int bug? и mysql autocasting string to integer.MySQL обрабатывает строку как целое

Мой стол

CREATE TABLE `srv_table` (
    `srv_id` int(11) NOT NULL AUTO_INCREMENT, 
    `srv_code` char(4) NOT NULL, 
    `name` varchar(255) NOT NULL, 
    PRIMARY KEY (`srv_id`), 
    UNIQUE KEY `code` (`srv_code`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Когда я пытаюсь выбрать строки по первичному ключу и послать смешанную строку возвращает мне результаты. Пример:

SELECT * FROM srv_table WHERE srv_id='2sadf' 

будет возвращать тот же результат, как:

SELECT * FROM srv_table WHERE srv_id=2 

Я знаю, что это описано в MySQL, но я не мог найти, как я могу избежать этого. Есть ли настройка или что-то еще я мог бы сделать без изменений мой код и запросы?

С уважением.

UPDATE: Для этих ребят, не считаю, что она возвращает тот же результат, когда значение идентификатор wraped апострофы:

SQL fiddle

UPDATE 2:

It похоже, это не проблема в PostgreeSQL: PgSQL fiddle

+0

ваш srv_id является целым числом, и он фактически игнорирует символы ... в чем проблема на самом деле? –

+5

Если вы хотите убедиться, что для запроса данных используются только целые значения, тогда вы должны убедиться, что в вашей логике приложения до того, как значение будет передано в базу данных. – CBroe

+0

Проблема в том, что я не хочу такого поведения. Есть ли способ избежать этого, или мне нужно изменить приложение для фильтрации ввода? – bksi

ответ

2

Что вы ожидаете от этого? У вас есть целочисленный столбец, и вы сравниваете его со строкой. Это плохая идея. MySQL конвертирует оба в целые числа, используя бесшумное преобразование (т. Е. Преобразует ведущие цифры).

Если вы действительно хотите сделать это, а затем использовать явное преобразование:

SELECT * 
FROM srv_table 
WHERE cast(srv_id as varchar) = '2sadf'; 

Но это кажется плохой идеей. Сравните целочисленные поля с целыми числами, а не с строками.

+0

Мне нужно сравнить целые числа, а не строки. Для меня не логично рассматривать строки как целые. – bksi

+1

@ bksi. , , Если вы считаете, что это логично или нет, база данных должна сделать преобразование для сравнения строки и целого числа, если это так, как вы пишете инструкцию SQL. Другие, вероятно, думают, что преобразование обоих в строки не логично. Решение состоит в том, чтобы не иметь неявных преобразований в коде SQL. –

+0

Есть ли параметр, который заставляет SQL выдавать ошибку при попытке сравнить разные типы данных? – bksi

1

Вы можете использовать LIKE, но лучше всего обеспечить, чтобы целочисленное значение передавалось из ваших данных. Попробуйте выполнить код ниже:

SELECT * FROM srv_table WHERE srv_id LIKE '2' 
+0

На самом деле этот запрос работает. Но мне нужно (если возможно) установить что-то в конфигурации mysql, чтобы отключить молчащее преобразование. – bksi

1

Вы пытались использовать 'BINARY' в своем SQL-запросе?

SELECT * FROM srv_table WHERE BINARY srv_id='2sadf' 

запрос выше вернет пустую строку, так как столбец 'srv_id' является целым числом.

+0

Actualy нет, он возвращает тот же результат. Я пробовал как кавычки, так и одинарные кавычки – bksi

+0

, он должен возвращать пустые строки, так как этот запрос точно найдет «2sadf» в вашем столбце srv_id, который не должен существовать, поскольку тип srv_id coulmn - INT. –

+0

Проверьте мой обновленный вопрос. Существует sql скрипка, вы можете убедиться сами;) – bksi

1

Попробуйте это: -

SELECT * FROM `srv_table` WHERE binary(`srv_id`) = '3ххххх'; 

Надеется, что это поможет.