2014년 5월 13일 화요일

데이터 형식 변환

지난 번 포스팅에서 암시적 형변환과 그 우선순위에 대해서 살펴보았습니다.

그렇다면 데이터의 형식은 자유롭게 변환 가능할까요?
다음 표는 그 호환여부를 보여줍니다.
특별히 형변환에서 어려움을 겪을 만한 부분은 없지만 문제가 생길만한 상황을 상정해보겠습니다. 어느 DB설계자가 월급을 아주 많이 줄 생각으로 급여 테이블의 급여란을 TEXT형식으로 했다고 가정해봅시다.
CREATE TABLE 급여 (사원번호 INT NOT NULL, 급여일 DATETIME NOT NULL, 총급여 TEXT NOT NULL)
그리고 DATA를 넣습니다.
INSERT INTO 급여 (사원번호, 급여일, 총급여) VALUES (1, '2014-05-25', 10000000)
처음부터 심상치 않은 에러가 뜹니다.
메시지 206, 수준 16, 상태 2, 줄 1
피연산자 유형 충돌: int은(는) text과(와) 호환되지 않습니다.
음... 아... TEXT니까 문자열로 넣어야지...
INSERT INTO 급여 (사원번호, 급여일, 총급여) VALUES (1, '2014-05-25', '10000000')
이제야 데이터가 들어갑니다. 근데 TEXT는 다루기도 어렵고 인덱스 설정도 안되고... 그래서 급여 열을 BIGINT 형식으로 바꾸기로 합니다. 월급을 20억이상 줄 생각인듯...
ALTER TABLE 급여 ALTER COLUMN 총급여 BIGINT NOT NULL
그랬더니 또 에러가 나네요.
메시지 4927, 수준 16, 상태 1, 줄 1
열 '총급여'을 데이터 형식 bigint(으)로 변경할 수 없습니다.
왜 그랬을까요? 표를 한번 봅시다. 원본 축에서 TEXT를 찾고 대상 축에서 BIGINT를 찾아보면 "변환이 허용되지 않음"으로 나옵니다. CONVERT나 ALTER TABLE 명령 등으로 직접 변환 할 수 없다는 말이죠. 흠... 그럼 영원히 BIGINT로는 수정 할 수 없는 걸까요?? 형식이 TEXT형식이지만 데이터는 오로지 숫자만 들어가 있습니다. TEXT를 BIGINT로 바꾸는건 허용되지 않지만 TEXT를 VARCHAR로 바꾸었다가 VARCHAR를 BIGINT로 바꾸는건 가능합니다.
ALTER TABLE 급여 ALTER COLUMN 총급여 VARCHAR(20) NOT NULL
GO
ALTER TABLE 급여 ALTER COLUMN 총급여 BIGINT NOT NULL
정상적으로 변환 되네요. 참고자료 데이터 형식 변환(데이터베이스 엔진)

댓글 없음:

댓글 쓰기