MySQL에서 zerofill의 이점은 무엇입니까?


168

난 그냥 정의의 이익 / 사용 무엇을 알고 싶어 ZEROFILL위한 INT에서 데이터 형식은 MySQL?

`id` INT UNSIGNED ZEROFILL NOT NULL 


좋은 질문. 관련 질문 : ZEROFILL을 사용하지 않는 좋은 이유가 있습니까? ZEROFILL 사용의 단점과 잠재적 함정은 무엇입니까? 장점이 단점보다 더 큽니까?
spencer7593

답변:


254

유형 ZEROFILL이 있는 열을 선택 하면 열 정의에 지정된 표시 너비까지 필드의 표시된 값을 0으로 채 웁니다. 표시 너비보다 긴 값은 잘리지 않습니다. 의 사용은 ZEROFILL또한 의미합니다 UNSIGNED.

사용 ZEROFILL및 표시 너비는 데이터 저장 방법에 영향을 미치지 않습니다. 표시 방법에만 영향을줍니다.

다음은 사용법을 보여주는 SQL의 예입니다 ZEROFILL.

CREATE TABLE yourtable (x INT(8) ZEROFILL NOT NULL, y INT(8) NOT NULL);
INSERT INTO yourtable (x,y) VALUES
(1, 1),
(12, 12),
(123, 123),
(123456789, 123456789);
SELECT x, y FROM yourtable;

결과:

        x          y
 00000001          1
 00000012         12
 00000123        123
123456789  123456789

52
@diEcho : 예를 들어 모든 송장 번호를 10 자리로 표시하려면 해당 열의 유형을 INT (10) ZEROFILL로 선언 할 수 있습니다.
Mark Byers

76
이 기능을 피하는 것이 좋습니다. 숫자 값을 표시 / 형식화하는 방법은 프레젠테이션 문제이며 데이터베이스 수준에 속하는 것은 아닙니다. 최소한 데이터베이스를 사용하여 소프트웨어를 백업하는 경우에는 그렇지 않습니다. 이로 인해 문제가 발생할 수 있습니다. 선행 0을 정수로 사용하여 값을 구문 분석하면 많은 구문 분석기가 값을 8 진으로 간주하므로 원하는 값이 아닐 수 있습니다. 이 기능을 사용해야하는 유일한 시간은 (저장) 최적화로, 실제로 저장하는 것이 사실상 (고정 길이) 자릿수 문자열 일 때입니다.
mindplay.dk

3
@ mindplay.dk : 다릅니다. GTIN과 같은 것을 저장하는 경우 길이는 14 자리 여야하지만 8 자리이며 왼쪽으로 채워질 수 있습니다. 이 경우 출력 측에 의존하는 것은 옳지 않을 것입니다. 단순한 소수점이 아니라 키이기 때문입니다.
DanMan

1
실용적으로 @MarkByers는 대부분의 클라이언트 라이브러리 (예 : PHP)가 애플리케이션 코드로 넘기기 전에 단순히 0을 제거하지 않습니까? 그렇다면 실제로 다소 의미가없는 것 같습니다. MySQL 초기의 나쁜 디자인.
Pacerier

131

이해하기 위해 하나의 예를 들어, 사용법 ZEROFILL이 흥미로울 수 있습니다.

독일에는 5 자리 우편 번호가 있습니다. 그러나 이러한 코드는 0으로 시작할 수 있으므로 80337munic의 유효한 우편 01067번호이며 베를린의 우편 번호입니다.

보시다시피 독일 시민은 우편 번호가 5 자리 코드로 표시되기를 기대하므로 1067이상하게 보입니다.

이러한 데이터를 저장하기 위해 VARCHAR(5)또는 0을 사용하는 INT(5) ZEROFILL정수에는 두 가지 큰 장점이 있습니다.

  1. 하드 디스크의 적은 저장 공간
  2. 삽입 1067하면 여전히 01067돌아옵니다.

이 예는의 사용법을 이해하는 데 도움이 될 수 있습니다 ZEROFILL.


10
데이터를 표시 하는 SQL 클라이언트 가 숫자를 선행 0으로 형식화해야합니다. 이것은 데이터를 검색하는 모든 애플리케이션마다 "자동으로"발생하는 것이 아닙니다.
a_horse_with_no_name 13:14의

고정 너비 열은 디스크 조각화를 줄이므로 더 좋습니다.
DanMan

@Phil, 실제로 말하면, 대부분의 클라이언트 라이브러리 (예 : PHP)가 응용 프로그램 코드로 전달하기 전에 단순히 0을 제거하지 않습니까? 그렇다면 실제로 다소 의미가없는 것 같습니다. MySQL 초기의 나쁜 디자인.
Pacerier

3
@Pacerier 이것은 클라이언트 라이브러리의 데이터가 숫자 또는 문자열로 표현되는 방법에 따라 다릅니다. 독일 우편 번호는 숫자가 아니며 숫자로만 구성된 문자열입니다. 따라서 MySQL 초기에 잘못된 디자인에 대한 진술에 동의하지 않습니다. 여전히 유효한 접근 방법이지만 드문 경우입니다.
Phil

61

정사각형 상자를 좋아하는 혼란스러운 인물을위한 기능입니다.

당신은 삽입

1
23
123 

그러나 선택하면 값이 채워집니다.

000001
000023
000123

15

이 "정수"를 "텍스트"로 정렬해야하는 다른 항목 (다른 숫자 또는 텍스트)과 연결 해야하는 경우 올바른 정렬에 도움이됩니다 .

예를 들어

A-005 또는 10/0005로 연결된 정수 필드 번호 (5)를 사용해야하는 경우


4

나는 파티에 늦었다는 것을 알고 있지만 zerofill은 TINYINT (1)의 부울 표현에 도움이된다는 것을 알았습니다. 널이 항상 거짓을 의미하는 것은 아니며 때로는 원하지 않는 경우도 있습니다. tinyint를 0으로 채우면 해당 값을 INT로 효과적으로 변환하고 상호 작용시 발생할 수있는 혼란을 제거 할 수 있습니다. 그런 다음 응용 프로그램은 기본 데이터 유형 True = Not (0)과 유사한 방식으로 해당 값을 처리 할 수 ​​있습니다


1
고맙지 만 불행히도 mysql db에 대해 몇 가지 테스트를 실행했으며 null 값을 0으로 채우지 않습니다. 이 목표는 여전히 널을 허용하지 않도록 필드를 제한하여 수행됩니다. 나는 일반적으로 사용하지 않는 DB에 대한 질문을 시도하고 대답하는 것보다 더 잘 알아야합니다. 사람들이 너무 행복해지기 전에 내 대답을 삭제하겠습니다. lol
Marlin

1
유능한? 잘못되었습니다. 표시 길이가 1 일 때 Zerofill은 아무것도하지 않습니다 (서명되지 않은 추가 제외).
Brilliand

@Marlin 그리고 항상 true 또는 false에 대한 기본값을 설정해야합니다 ... 기본값을 사용하지 않으면 언급 한 문제는 유일한 것이 아닙니다 ... NOT NULL도 필수입니다 :)
bakriawad

나는 downvote하지만 당신의 담당자는 666그래서이 답변을 그대로 유지하고 싶습니다;-)
마틴

3
mysql> CREATE TABLE tin3(id int PRIMARY KEY,val TINYINT(10) ZEROFILL);
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT INTO tin3 VALUES(1,12),(2,7),(4,101);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tin3;
+----+------------+
| id | val        |
+----+------------+
|  1 | 0000000012 |
|  2 | 0000000007 |
|  4 | 0000000101 |
+----+------------+
3 rows in set (0.00 sec)

mysql>

mysql> SELECT LENGTH(val) FROM tin3 WHERE id=2;
+-------------+
| LENGTH(val) |
+-------------+
|          10 |
+-------------+
1 row in set (0.01 sec)


mysql> SELECT val+1 FROM tin3 WHERE id=2;
+-------+
| val+1 |
+-------+
|     8 |
+-------+
1 row in set (0.00 sec)


1

숫자 열에 ZEROFILL을 지정하면 MySQL은 열에 UNSIGNED 속성을 자동으로 추가합니다.

UNSIGNED 속성을 허용하는 숫자 데이터 유형도 SIGNED를 허용합니다. 그러나 이러한 데이터 유형은 기본적으로 서명되므로 SIGNED 속성이 적용되지 않습니다.

위의 설명은 MYSQL 공식 웹 사이트에서 가져온 것입니다.


0

제로 필

이는 본질적으로 정수 값 23이 너비가 8 인 INT 열에 삽입되면 사용 가능한 나머지 위치는 자동으로 0으로 채워집니다.

그 후

23

된다 :

00000023
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.