2015-10-28
테스트 버전 : Ver 15.1 Distrib 10.0.21-MariaDB, for Win64 (AMD64)


아래와 같은 구조를 가지는 테이블이 하나 있다.mariaDB를 깔며.. 새로만든  testbl

MariaDB [test]> desc testbl;
+-------+--------------------------+------+-----+---------+----------------+
| Field | Type                     | Null | Key | Default | Extra          |
+-------+--------------------------+------+-----+---------+----------------+
| idx   | int(11)                  | NO   | PRI | NULL    | auto_increment |
| int1  | int(5)                   | YES  |     | NULL    |                |
| int2  | int(5) unsigned zerofill | YES  |     | NULL    |                |
| char1 | char(5)                  | YES  |     | NULL    |                |
+-------+--------------------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)



우선 각각의 컬럼에 "123"값을 넣어 보겠다.

MariaDB [test]> INSERT INTO `testbl` SET
    -> `int1` = 123,
    -> `int2` = 123,
    -> `char1` = 123;
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> select * from testbl;
+-----+------+-------+-------+
| idx | int1 | int2  | char1 |
+-----+------+-------+-------+
|   1 |  123 | 00123 | 123   |
+-----+------+-------+-------+
1 row in set (0.00 sec)


그리고 이번엔 "1234567"값을 넣어보겠다.

MariaDB [test]> INSERT INTO `testbl` SET
    -> `int1` = 1234567,
    -> `int2` = 1234567,
    -> `char1` = 1234567;
ERROR 1406 (22001): Data too long for column 'char1' at row 1


오류가 뜬다. 그래서 char1컬럼에는 값을 "12345"로 변경하고 다시 시도해 보았다.

MariaDB [test]> INSERT INTO `testbl` SET
    -> `int1` = 1234567,
    -> `int2` = 1234567,
    -> `char1` = 12345;
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> select * from testbl;
+-----+---------+---------+-------+
| idx | int1    | int2    | char1 |
+-----+---------+---------+-------+
|   1 |     123 |   00123 | 123   |
|   2 | 1234567 | 1234567 | 12345 |
+-----+---------+---------+-------+
2 rows in set (0.00 sec)

제대로 값이 insert되는 것을 알 수 있다.


차이점을 알겠는가? 테이블을 선언할때 넣어주는 정보에서 길이에 해당하는 값은 컬럼 타입이 int와 char에 따라 다르게 적용된다.
int타입의 컬럼에서는 zerofill의 범위 지정으로 해당 숫자의 자릿수에 맞게 앞에 0을 채우겠다는 것이고,
char타입의 컬럼에서는 해당 숫자까지만 문자열의 길이가 제한 된다는 것이다.

그렇기 때문에 int타입의 컬럼은 숫자에 상관없이 –2,147,483,648 ~ 2,147,483,647 범위의 숫자만 넣을수 있고(unsigned 일 경우엔 0 ~ 4,294,967,295)
char타입의 컬럼은 숫자가 곧 범위가 된다. 
물론, 최대 범위가 255라서.. char타입이라고 해도 255자까지만 넣을수 있지만 말이다.