2014-05-11 3 views
0

MySQL 데이터베이스에 간단한 테이블이 있습니다. 표 T에는 tinyint unsigned 유형의 열이 있으며 길이는 1입니다.이 열을 사용하여 일부 부울 값을 저장합니다. 이상한 결과가 MySQL에서 빼기

나는 몇 가지 간단한 산술 물건을하려고

, 나는 예를 들어, 매우 이상한 결과를 얻을 :
SELECT A - 1 FROM T 수익을 A 값은 1,하지만 반환하는 경우 0, 올바르게, 18,446,744,073,709,551,615 (나는 IFS 2^64를 생각한다 - 1) A가 0 일 경우

내 질문은 ... 왜, 어떻게 해결할 수 있습니까?

EDIT : A를 서명으로 선언하면 문제가 해결되지만 ... 이유는 알 수 없습니다. 아마 컬럼이 부호없는 경우 -1이 매우 큰 숫자 (2^n - 1)로 표시되지만 결과가 선택하는 컬럼의 유형과 같은 경우 왜 64 비트 숫자입니까? 당신이 시도하고 다시 가장 큰 값으로 라운드 루프 0에서 1을 빼면 그 많은 의미가있는 경우

+3

A가 'INT SIGNED'로 선언하면 –

+0

의 도움이 될 수 있습니다. 그래, 맞아. 왜 이상한 결과가 나오지? – Spotlight

+0

부호없는 정수는 음수 값을 저장할 수 없습니다. –

답변

2

부호의 int는

http://en.wikipedia.org/wiki/Signedness

확실하지가 할 수있는 음의 값

물을 수 없습니다 그러나 아직도 붙어있어 더 잘 설명하려고 노력한다면 알려주세요!

+0

이제는 작동하지만 나에게는 매우 이상합니다 ... 1 비트 부호없는 숫자는 -1을 저장할 수 없지만 64 비트 양수를 저장할 수있는 이유는 무엇입니까? – Spotlight

+0

부호없는 번호는 부호를 저장할 수 없으므로 부호가 없습니다. 저장 공간이 훨씬 제한적인 오래된 컴퓨터의 결과입니다. 16 비트 정수가 서명 된 경우 양수와 음수를 -32768 ~ 32767 범위에서 유지할 수 있습니다. 동일한 16 비트를 부호없는 정수를 저장하는 데 사용하면 0에서 65535 사이의 값을 저장하여 훨씬 더 큰 표현을 제공 할 수 있습니다. 이상하지 않습니다. 이 바로 그 이유 때문에 목적을 달성 한 것입니다. –

1

Unsigned은 변수가 음수를 처리 할 수 ​​없다는 것을 의미합니다 (SQL에서 계산의 일부로 포함 되더라도).
시도 signed.

관련 문제