| 남은 자릿수 | 바이트 수 |
|---|---|
| 0 | 0 |
| 1-2 | 1 |
| 3-4 | 2 |
| 5-6 | 3 |
| 7-9 | 4 |
예를 들어, DECIMAL(30,9) 열을 고려해 보면.
이 열은 소수 부분에 9자리를 가지며, 정수 부분에는 30 - 9 = 21 자리를 가짐. 이 경우, 소수 부분은 4바이트가 필요함.
정수 부분은 첫 18자리에 대해 8바이트가 필요하며, 남은 3자리를 위해 추가로 2바이트가 필요함.
따라서 DECIMAL(30,9) 열은 총 14바이트가 필요함. 참고로 DOUBLE 타입의경우 8바이트가 필요함.
column_name DECIMAL(P, D);
-- P는 **정밀도(precision)**로, 소수점의 왼쪽과 오른쪽을 포함하여 열에 저장할 수 있는 총 자릿수를 지정함. P의 범위는 1부터 65까지임.
-- D는 **스케일(scale)**로, 소수점 이하에 저장할 수 있는 최대 자릿수를 지정함. D의 범위는 0에서 30까지이며, D는 P보다 크지 않아야 함.
UNSIGNED: 이 속성을 사용하면 열이 음수 값을 허용하지 않음을 나타냄.
ZEROFILL: 이 속성을 사용하면 숫자를 지정된 너비로 0으로 채움.
SALARY DECIMAL(5,3)
-- SALARY 열이 최대 5자리 숫자를 저장할 수 있으며, 그 중 3자리는 소수점 오른쪽에 있음. 이 열의 범위는 -99.999에서 99.999까지임.
SALARY DECIMAL(5);
SALARY DECIMAL(5,0);
-- 동일하게 소숫점 없음으로 나옴
SALARY DECIMAL;
-- 이렇게 쓸 경우 기본 정밀도 P는 10이 됨:
-- DECIMAL 타입을 사용하는 테이블
CREATE TABLE decimal_example (
id INT AUTO_INCREMENT PRIMARY KEY,
value DECIMAL(10, 5) -- 최대 10자리, 소수점 이하 5자리
);
-- DECIMAL 값 삽입
INSERT INTO decimal_example (value) VALUES
(12345.67890), -- 일반적인 소수
(0.00001), -- 매우 작은 소수
(99999.99999), -- 최대값 근처
(-12345.67890), -- 음수
(0.123456789), -- 소수점 이하 많은 자리
-- DECIMAL 테이블 값 확인
SELECT * FROM decimal_example;
-- DECIMAL 테이블
+----+-------------+
| id | value |
+----+-------------+
| 1 | 12345.67890 |
| 2 | 0.00001 |
| 3 | 99999.99999|
| 4 | -12345.67890|
| 5 | 0.12346 | -- 소수점 이하 5자리로 반올림
+----+-------------+
double타입은 실수를 표현하고 부동소수점방식으로 숫자를 저장함. 부동소숫점은 숫자의 위치가 고정되지 않는다는 특징과 숫자값의 길이에 따라 유효범위의 소수점 자리수가 바뀌는 특징이 있음. 이로인해 근사치로 인한 오차문제가 발생함. 그에 비해 고정소숫점 방식인 decimal은 다른 숫자저장방식에 비해 저장공간이 크지만 값의 오차가 발생하지 않기 때문에 금융데이터를 사용할경우 고정소수점방식인 decimal을 사용하는것이 좋아보임.
⚙️ 출처: https://www.tutorialspoint.com/mysql/mysql-decimal.htm
⚙️ 출처: https://dev.mysql.com/doc/refman/8.0/en/precision-math-decimal-characteristics.html