이 이야기를 하기 전에 먼저 numeric 자료형에 대한 이야기를
간단히 언급해야할 것같습니다.
이 놈은 문자열과 숫자형이 교묘하게 섞여있는 컴차원에서는 문자열이고,
사용자 입장에서는 숫자형인 자료형입니다.
어떻게 저장 되냐면, 전체 name 자료형의 크기(32byte)만큼 할당을 하는데,
25byte는 문자열로 정수 부분 1byte는 점(.) 6byte는 소숫점이하 6자리, 나머지 하나는 문자열 끝인 null 값이 들어갑니다.
psql 클라이언트를 사용하신다면, \do 명령으로 연산자의 사용법을
살펴 볼 수 있습니다. 예를 들어 % (나머지 연산) 이놈을 예로 들어보면,
# \do %
명령을 보면, % 연산자의 인자와 리턴 자료형과 설명을 알 수 있습니다.
실수 % 실수 형의 연산은 사용자입장에서 본다면, float형이 numeric이라는 의사(psudo)자료형으로 형변환을 해야지 가능합니다. (컴 입장에 대한 이야기는 생략하겠습니다. PostgreSQL의 numeric 자료형은 좀 특수한 케이스인자라)
아무튼 그래서 아래 3번의 경우는
다음과 같은 형태로 처리가 됩니다.
1. 10.0 % 3.0 => float8 /> numeric % float8 /> numeric => numeric
2. 10.0 / 1.000000 => float8 /> numeric / numeric => numeric
이 과정으로 처리가 됩니다.
글로 표현되니 좀 이상한데, 아무튼 % 연산자의 float8 으로 처리 되지 못하고,
numeric으로 처리 되는 부분은 조금만 더 생각해보시면 쉽게 이해가 가실겝니다.
지금까지를 정리하면,
자료형 연산자에 대한 연자 오류나 형변환의 문제가 아니라,
서버 차원의 좀더 깊이있는 이해가 부족한 것인듯 싶습니다.
>>신현호 님께서 쓰시길<<
:: 김일형 님과 김상기 님의 조언으로 몇가지는 해결되었습니다.
::
:: 1. 정수 대 정수 연산에서 소수점 밑의 버림
:: 나누셈의 경우가 되겠는데... 나름대로 이해가
:: 갑니다.
:: 2. 3번째 문제와 같이 시험하면서 이상하게 꼬인
:: 거였습니다. 제 실수입니다.(죄송)
:: 3. 나머지 연산자인 %의 계산 불균형(?)
:: 밑의 명령치고서 실수 대 실수 연산에서 정수가
:: 나오는 것이 아님을 알았습니다만...
:: coral=# select 10.0 / (10.0 % 3.0);
:: ERROR: Unable to identify an operator '/' for types 'float8' and 'numeric'
:: You will have to retype this query using an explicit cast
::
:: 라는군요. 해서... 상기님의 말씀대로
::
:: create table a as select (10.0 % 3.0);
:: 라고 했더니만...
::
:: coral=# \d a
:: Table "a"
:: Attribute | Type | Modifier
:: ///////////+/////////+//////////
:: ?column? | numeric |
::
:: 라고 하더군요.
::
:: // 결국은 나머지 연산자인 %가 말썽이었습니다.
::
:: 혼란스럽게한점 죄송스럽게 생각합니다...(꾸벅)
::
:: 인천의 나사 풀린 산호...
|