2017-09-27 12 views
0

내 표는 다음과 같습니다B가 A 또는 (X)이 일치하지만, 반환하지 않습니다 행

SELECT * FROM things WHERE ts_9 IN ("asdewdwedewd") OR ts_11 IN ("asdewdwedewd") 

왜 그런 일이 일어날까요?

복사 붙여 넣기하여 DB에 그것을 다시 자유롭게 :

CREATE TABLE `things` (
    `a` char(12) NOT NULL DEFAULT '', 
    `ts_9` decimal(2,0) NOT NULL, 
    `ts_11` char(1) NOT NULL DEFAULT '', 
    PRIMARY KEY (`a`), 
    UNIQUE KEY `a` (`a`)); 

INSERT INTO `things` (`a`, `ts_9`, `ts_11`) VALUES ('yx', '0', ''), ('xy', '0', ''); 
+3

내 생각 엔 문자열이 정수로 형 변환되고 있다는 것입니다. – Uueerdo

+0

@Uueerdo 위대한 추측, 고마워! 이것을 피하는 일반적인 예방법이 있습니까? – Basti

+0

제가 생각할 수있는 유일한 것은 문자열을 올바르게 파싱 할 수 없다면 평등과 관련된 표현식에서 숫자와 문자열 유형을 섞어 쓰지 않는 것입니다. – Uueerdo

답변

3

ts_9 IN ("asdewdwedewd")이 true로 평가 되었기 때문에. 보다 구체적으로, ts_9의 값은 정수 0입니다. documentation

따라 모든 값들은 환언

"asdewdwedewd"을 int로 처리한다 EXPR 의 유형에 따라 평가되며, 상수 인 경우. mysql이 그것을 cast("asdewdwedewd" as signed integer)으로 변환하면 0이된다. 따라서 0 in (0)은 true로 평가됩니다.

0

최적화 프로그램은 동일한 유형에 데이터를 제공합니다. 문자열을 십진수로 변환 할 때 0이됩니다. 데이터 형식을 미리 정의하거나 변환해야합니다.

+0

10 진수 문자열은 항상 0을 산출하지는 않습니다. 예를 들어, "1.5676asdafnenawuiawuin"및 "1asdkjaklfkl"을 DECIMAL (5,2)에 캐스팅하면 각각 1.57 및 1.00이됩니다. – Uueerdo