πŸ“˜ Programming/DB

[MySQL] νƒ€μž… - 숫자 νƒ€μž… (μ •μˆ˜, κ³ μ • μ†Œμˆ˜μ , 뢀동 μ†Œμˆ˜μ , λΉ„νŠΈκ°’ νƒ€μž…)

ν•œμ½”λ”© 2020. 8. 1. 23:54
728x90
728x90

νƒ€μž…(data type)

MySQLμ—μ„œ ν…Œμ΄λΈ”을 μ •μ˜ν•  λ•ŒλŠ” ν•„λ“œλ³„λ‘œ μ €μž₯ν•  수 μžˆλŠ” νƒ€μž…κΉŒμ§€ λͺ…μ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€.

MySQLμ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λ³Έ νƒ€μž…은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

1. 숫자 νƒ€μž…

2. λ¬Έμžμ—΄ νƒ€μž…

3. λ‚ μ§œμ™€ μ‹œκ°„ νƒ€μž…


1. 숫자 νƒ€μž…(numeric types)

MySQL은 SQL ν‘œμ€€μ—μ„œ μ§€μ›ν•˜λŠ” λͺ¨λ“  숫자 νƒ€μž…μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

MySQLμ—μ„œ μ œκ³΅ν•˜λŠ” 숫자 νƒ€μž…μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

1. μ •μˆ˜ νƒ€μž…(integer types)

2. κ³ μ • μ†Œμˆ˜μ  νƒ€μž…(fixed-point types)

3. 뢀동 μ†Œμˆ˜μ  νƒ€μž…(floating-point types)

4. λΉ„νŠΈκ°’ νƒ€μž…(bit-value type)


1-1. μ •μˆ˜ νƒ€μž…(integer types)

MySQL은 SQL ν‘œμ€€ μ •μˆ˜ νƒ€μž…μΈ INTEGER(λ˜λŠ” INT)와 SMALLINTλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

λ˜ν•œ, ν‘œμ€€ μ •μˆ˜ νƒ€μž…μ˜ λ²”μœ„λ₯Ό λ”μš± ν™•μž₯ν•œ TINYINT, MEDIUMINT, BIGINTκΉŒμ§€ μ œκ³΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

각 μ •μˆ˜ νƒ€μž…μ— 따라 μš”κ΅¬λ˜λŠ” μ €μž₯ 곡간과 ν‘œν˜„ν•  수 μžˆλŠ” μ΅œλŒ“κ°’κ³Ό μ΅œμ†Ÿκ°’κΉŒμ§€ λ‹¬λΌμ§‘λ‹ˆλ‹€.

λ˜ν•œ, μ •μˆ˜ νƒ€μž…μ€ μŒμˆ˜κΉŒμ§€ ν‘œν˜„ν•  수 μžˆλŠ” SIGNED νƒ€μž…κ³Ό μ–‘μˆ˜λ§Œμ„ ν‘œν˜„ν•  수 μžˆλŠ” UNSIGNED νƒ€μž…μœΌλ‘œλ„ κ΅¬λΆ„λ©λ‹ˆλ‹€.

 

MySQL μ •μˆ˜ νƒ€μž…μ— λ”°λ₯Έ ν‘œν˜„ν•  수 μžˆλŠ” μ΅œλŒ“κ°’, μ΅œμ†Ÿκ°’κ³Ό μš”κ΅¬λ˜λŠ” μ €μž₯ κ³΅κ°„μ˜ ν¬κΈ°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

νƒ€μž… μ €μž₯ 곡간 μ΅œλŒ€κ°’ μ΅œμ†Œκ°’
Signed Unsigned Signed Unsigned
TINYINT 1λ°”μ΄νŠΈ -128  0 127 255
SMALLINT 2λ°”μ΄νŠΈ -32768 0 32767 65535
MEDIUMINT 3λ°”μ΄νŠΈ -8388608  0 8388607 16777215
INT 4λ°”μ΄νŠΈ -2147483648 0 2147483647 4294967295
BIGINT 8λ°”μ΄νŠΈ -9223372036854775808  0 9223372036854775807 18446744073709551615

 

λ‹€μŒ μ˜ˆμ œλŠ” ALTER TABLE 문을 μ‚¬μš©ν•˜μ—¬ Reservation ν…Œμ΄λΈ”μ— 4λ°”μ΄νŠΈμ˜ μ •μˆ˜λ₯Ό μ €μž₯ν•  수 μžˆλŠ” Price ν•„λ“œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ Price ν•„λ“œλ₯Ό μΆ”κ°€ν•œ 후에 DESCRIBE 문을 μ‚¬μš©ν•˜μ—¬ Reservation ν…Œμ΄λΈ”μ˜ 상세 정보λ₯Ό ν™•μΈν•˜λ©΄, λ‹€μŒ μ‹€ν–‰ 결과와 같이 λ‚˜νƒ€λ‚©λ‹ˆλ‹€.

ALTER TABLE Reservation
ADD Price INT;

μ‹€ν–‰ κ²°κ³Ό

 

κ·Έλ¦¬κ³ μ„œ INSERT INTO 문을 μ‚¬μš©ν•˜μ—¬ Price ν•„λ“œ κ°’μœΌλ‘œ 1000을 κ°€μ§€λŠ” μƒˆλ‘œμš΄ λ ˆμ½”λ“œλ₯Ό μΆ”κ°€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ SELECT 문을 μ‚¬μš©ν•˜μ—¬ Reservation ν…Œμ΄λΈ”μ˜ λͺ¨λ“  λ ˆμ½”λ“œλ₯Ό μ„ νƒν•˜μ—¬ ν™•μΈν•©λ‹ˆλ‹€.


1-2. κ³ μ • μ†Œμˆ˜μ  νƒ€μž…(fixed-point types)

MySQLμ—μ„œ κ³ μ • μ†Œμˆ˜μ  νƒ€μž…μΈ DECIMAL은 μ‹€μˆ˜μ˜ 값을 μ •ν™•ν•˜κ²Œ ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.

DECIMALμ—μ„œ μ‚¬μš©ν•˜λŠ” κ³ μ • μ†Œμˆ˜μ  방식은 μ‹€μˆ˜λ₯Ό ν‘œν˜„ν•  λ•Œ μ†Œμˆ˜λΆ€μ˜ 자릿수λ₯Ό κ³ μ •ν•˜μ—¬ ν‘œν˜„ν•©λ‹ˆλ‹€.

즉, μ†Œμˆ˜λΆ€μ˜ 자릿수λ₯Ό 미리 μ •ν•΄ 놓고, κ³ μ •λœ 자릿수둜만 μ†Œμˆ˜ 뢀뢄을 ν‘œν˜„ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

 

MySQLμ—μ„œ DECIMAL νƒ€μž…μ€ NUMERIC을 κ΅¬ν˜„ν•˜μ—¬ λ§Œλ“€μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ λŒ€λΆ€λΆ„μ˜ 경우 DECIMAL λŒ€μ‹  NUMERIC을 μ‚¬μš©ν•΄λ„ λ˜‘κ°™μ΄ λ™μž‘ν•©λ‹ˆλ‹€.

DECIMAL(M,D)
# NUMERIC(M,D)

 

M은 μ†Œμˆ˜ 뢀뢄을 ν¬ν•¨ν•œ μ‹€μˆ˜μ˜ 총 자릿수λ₯Ό λ‚˜νƒ€λ‚΄λ©°, μ΅œλŒ“κ°’μ€ 65μž…λ‹ˆλ‹€.

DλŠ” μ†Œμˆ˜ λΆ€λΆ„μ˜ 자릿수λ₯Ό λ‚˜νƒ€λ‚΄λ©°, Dκ°€ 0이면 μ†Œμˆ˜ 뢀뢄을 κ°€μ§€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

λ‹€μŒ μ˜ˆμ œλŠ” ALTER TABLE 문을 μ‚¬μš©ν•˜μ—¬ Reservation ν…Œμ΄λΈ”μ˜ RoomNum ν•„λ“œ νƒ€μž…을 κ³ μ • μ†Œμˆ˜μ  νƒ€μž…μœΌλ‘œ λ³€κ²½ν•©λ‹ˆλ‹€.

 

μ΄λ ‡κ²Œ RoomNum ν•„λ“œμ˜ νƒ€μž…μ„ λ³€κ²½ν•œ 후에 DESCRIBE 문을 μ‚¬μš©ν•˜μ—¬ Reservation ν…Œμ΄λΈ”μ˜ 상세 정보λ₯Ό ν™•μΈν•˜λ©΄, λ‹€μŒμ‹€ν–‰ 결과와 같이 λ‚˜νƒ€λ‚©λ‹ˆλ‹€.

ALTER TABLE Reservation
MODIFY COLUMN RoomNum DECIMAL(7,2);

μ‹€ν–‰ κ²°κ³Ό

 

μœ„μ˜ μ˜ˆμ œμ—μ„œ RoomNum ν•„λ“œλŠ” -99999.99λΆ€ν„° 99999.99κΉŒμ§€μ˜ μ‹€μˆ˜λ₯Ό μ €μž₯ν•  수 μžˆλ„λ‘ λ³€κ²½λ©λ‹ˆλ‹€.

 

κ·Έλ¦¬κ³ μ„œ INSERT INTO 문을 μ‚¬μš©ν•˜μ—¬ RoomNum ν•„λ“œ κ°’μœΌλ‘œ 99999.99λ₯Ό κ°€μ§€λŠ” μƒˆλ‘œμš΄ λ ˆμ½”λ“œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ SELECT 문을 μ‚¬μš©ν•˜μ—¬ Reservation ν…Œμ΄λΈ”μ˜ λͺ¨λ“  λ ˆμ½”λ“œλ₯Ό μ„ νƒν•˜μ—¬ ν™•μΈν•©λ‹ˆλ‹€.


1-3. 뢀동 μ†Œμˆ˜μ  νƒ€μž…(floating-point types)

MySQLμ—μ„œ 뢀동 μ†Œμˆ˜μ  νƒ€μž…μΈ FLOATκ³Ό DOUBLE은 μ‹€μˆ˜μ˜ 값을 λŒ€λž΅μ μœΌλ‘œ ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.

MySQL은 IEEE 754 ν‘œμ€€μ— λ”°λΌ FLOATλŠ” 4λ°”μ΄νŠΈλ₯Ό μ‚¬μš©ν•˜λ©°, DOUBLE은 8λ°”μ΄νŠΈλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

 

SQL ν‘œμ€€μ—μ„œ FLOATλŠ” 정밀도에 ν•„μš”ν•œ μ΅œμ†Œν•œμ˜ λΉ„νŠΈ 수λ₯Ό λͺ…μ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

FLOAT(P)

Pκ°€ 0λΆ€ν„° 24κΉŒμ§€μ˜ κ°’을 κ°€μ§ˆ λ•ŒλŠ” FLOAT κ°’μœΌλ‘œ μ·¨κΈ‰λ˜λ©°, 25λΆ€ν„° 53κΉŒμ§€μ˜ κ°’을 κ°€μ§ˆ λ•ŒλŠ” DOUBLE κ°’μœΌλ‘œ μ·¨κΈ‰λ©λ‹ˆλ‹€.

 

λ˜ν•œ, MySQL은 FLOATκ³Ό DOUBLE을 κ³ μ • μ†Œμˆ˜μ  νƒ€μž…κ³Ό 같이 μ‚¬μš©ν•  수 μžˆλŠ” λΉ„ν‘œμ€€ 문법도 μ§€μ›ν•©λ‹ˆλ‹€.

FLOAT(M,D)
DOUBLE(M,D)

 

M은 μ†Œμˆ˜ 뢀뢄을 ν¬ν•¨ν•œ μ‹€μˆ˜μ˜ 총 자릿수λ₯Ό λ‚˜νƒ€λ‚΄λ©°, DλŠ” μ†Œμˆ˜ λΆ€λΆ„μ˜ 자릿수λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

 

λ‹€μŒ μ˜ˆμ œλŠ” ALTER TABLE 문을 μ‚¬μš©ν•˜μ—¬ Reservation ν…Œμ΄λΈ”μ˜ RoomNum ν•„λ“œ νƒ€μž…μ„ 뢀동 μ†Œμˆ˜μ  νƒ€μž…μœΌλ‘œ λ³€κ²½ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ RoomNum ν•„λ“œμ˜ νƒ€μž…μ„ λ³€κ²½ν•œ 후에 DESCRIBE 문을 μ‚¬μš©ν•˜μ—¬ Reservation ν…Œμ΄λΈ”μ˜ 상세 정보λ₯Ό ν™•μΈν•˜λ©΄, λ‹€μŒ μ‹€ν–‰ 결과와 같이 λ‚˜νƒ€λ‚©λ‹ˆλ‹€.

ALTER TABLE Reservation
MODIFY COLUMN RoomNum FLOAT(7,2);

μ‹€ν–‰ κ²°κ³Ό

 

μœ„μ˜ μ˜ˆμ œμ—μ„œ RoomNum ν•„λ“œλŠ” 이제 -99999.99λΆ€ν„° 99999.99κΉŒμ§€μ˜ μ‹€μˆ˜λ₯Ό μ €μž₯ν•  수 μžˆλ„λ‘ λ³€κ²½λ©λ‹ˆλ‹€.

 

κ·Έλ¦¬κ³ μ„œ INSERT INTO 문을 μ‚¬μš©ν•˜μ—¬ RoomNum ν•„λ“œ κ°’μœΌλ‘œ 99999.99λ₯Ό κ°€μ§€λŠ” λ ˆμ½”λ“œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ SELECT 문을 μ‚¬μš©ν•˜μ—¬ Reservation ν…Œμ΄λΈ”μ˜ λͺ¨λ“  λ ˆμ½”λ“œλ₯Ό μ„ νƒν•˜μ—¬ ν™•μΈν•©λ‹ˆλ‹€.

 

이처럼 RoomNum ν•„λ“œ κ°’μœΌλ‘œ 99999.009λ₯Ό μž…λ ₯ν•˜λ©΄, μ‹€μˆ˜μ˜ 총 μžλ¦Ώμˆ˜κ°€ λͺ…μ‹œν•œ 7자리λ₯Ό μ΄ˆκ³Όν•©λ‹ˆλ‹€.

λ”°λΌμ„œ 이 값은 7자리둜 λ§žμΆ°μ§€κΈ° μœ„ν•΄ λ°˜μ˜¬λ¦Όλ˜μ–΄ 99999.01둜 μžλ™ λ³€ν™˜λ˜μ–΄ μ €μž₯λ©λ‹ˆλ‹€.


1-4. λΉ„νŠΈκ°’ νƒ€μž…(bit-value type)

MySQLμ—μ„œ λΉ„νŠΈκ°’ νƒ€μž…인 BITλŠ” λΉ„νŠΈμ˜ 값을 μ €μž₯ν•©λ‹ˆλ‹€.

즉, 0κ³Ό 1둜 κ΅¬μ„±λ˜λŠ” λ°”μ΄λ„ˆλ¦¬(binary) 값을 μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

BIT(M)

M의 λ²”μœ„λŠ” 1λΆ€ν„° 64κΉŒμ§€ μ„€μ •ν•  수 있으며, λͺ…μ‹œν•œ M λΉ„νŠΈμ˜ 값을 μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ§Œμ•½ λͺ…μ‹œν•œ M λΉ„νŠΈλ³΄λ‹€ 짧은 길이의 λΉ„νŠΈ 값을 μž…λ ₯ν•˜λ©΄, μž…λ ₯ν•œ κ°’ μ•žμ— 0을 μΆ”κ°€ν•˜μ—¬ μžλ™μœΌλ‘œ 길이λ₯Ό 맞μΆ₯λ‹ˆλ‹€.

 

λ‹€μŒ μ˜ˆμ œλŠ” ALTER TABLE 문을 μ‚¬μš©ν•˜μ—¬ Reservation ν…Œμ΄λΈ”μ— BIT(7) νƒ€μž…μ„ μ €μž₯ν•  수 μžˆλŠ” Code ν•„λ“œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

μ΄λ ‡κ²Œ Code ν•„λ“œλ₯Ό μΆ”κ°€ν•œ ν›„에 DESCRIBE 문을 μ‚¬μš©ν•˜μ—¬ Reservation ν…Œμ΄λΈ”μ˜ 상세 정보λ₯Ό ν™•μΈν•˜λ©΄, λ‹€μŒ μ‹€ν–‰ 결과와 같이 λ‚˜νƒ€λ‚©λ‹ˆλ‹€.

ALTER TABLE Reservation
ADD Code BIT(7);

μ‹€ν–‰ κ²°κ³Ό

 

κ·Έλ¦¬κ³ μ„œ INSERT INTO 문을 μ‚¬μš©ν•˜μ—¬ Code ν•„λ“œμ˜ κ°’μœΌλ‘œ κ°κ° b'100'κ³Ό b'100001'을 κ°€μ§€λŠ” μƒˆλ‘œμš΄ λ ˆμ½”λ“œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

μ΄λ•Œ Code ν•„λ“œμ˜ 값인 b'100'κ³Ό b'100001'은 κ°κ° b'0000100'κ³Ό b'0100001'둜 μžλ™ λ³€ν™˜λ˜μ–΄ μ €μž₯λ©λ‹ˆλ‹€.

 

λ§ˆμ§€λ§‰μœΌλ‘œ SELECT 문을 μ‚¬μš©ν•˜μ—¬ Reservation ν…Œμ΄λΈ”μ—μ„œ Code ν•„λ“œμ˜ 값이 NULL이 μ•„λ‹Œ λͺ¨λ“  λ ˆμ½”λ“œλ₯Ό μ„ νƒν•œ ν›„, ν•΄λ‹Ή λ ˆμ½”λ“œμ˜ Code ν•„λ“œ κ°’을 ν™•μΈν•©λ‹ˆλ‹€.

 

μ΄μ§„μˆ˜ b'100'은 μ‹­μ§„μˆ˜ 4λ₯Ό λ‚˜νƒ€λ‚΄λ©°, μ΄μ§„μˆ˜ b'100001'은 μ‹­μ§„μˆ˜ 33을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
MySQLμ—μ„œλŠ” μ΄λŸ¬ν•œ λ°”μ΄λ„ˆλ¦¬ κ°’을 좜λ ₯ν•˜κΈ° μœ„ν•΄ BIN()와 같은 λ³€ν™˜ ν•¨μˆ˜λ₯Ό μ œκ³΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

728x90
λ°˜μ‘ν˜•