MySQL
데이터 유형
수색…
암시 적 / 자동 주조
select '123' * 2;
2
곱셈 을하기 위해 MySQL은 문자열 123
을 자동으로 숫자로 변환합니다.
반환 값 :
246
숫자로의 변환은 왼쪽에서 오른쪽으로 시작됩니다. 변환이 불가능한 경우 결과는 0
select '123ABC' * 2
반환 값 :
246
select 'ABC123' * 2
반환 값 :
0
VARCHAR (255) - 또는 아닙니다.
제안 된 최대 len
먼저 16 진수 또는 ASCII로 제한된 몇 가지 공통 문자열을 언급하겠습니다. 이 경우 공간을 낭비하지 않도록 CHARACTER SET ascii
지정해야합니다 ( latin1
은 ok입니다).
UUID CHAR(36) CHARACTER SET ascii -- or pack into BINARY(16)
country_code CHAR(2) CHARACTER SET ascii
ip_address CHAR(39) CHARACTER SET ascii -- or pack into BINARY(16)
phone VARCHAR(20) CHARACTER SET ascii -- probably enough to handle extension
postal_code VARCHAR(20) CHARACTER SET ascii -- (not 'zip_code') (don't know the max
city VARCHAR(100) -- This Russian town needs 91:
Poselok Uchebnogo Khozyaystva Srednego Professionalno-Tekhnicheskoye Uchilishche Nomer Odin
country VARCHAR(50) -- probably enough
name VARCHAR(64) -- probably adequate; more than some government agencies allow
왜 단순히 255가 아니겠습니까? 모든 것에 (255)를 사용하는 일반적인 관행을 피할 수있는 두 가지 이유가 있습니다.
- 복잡한
SELECT
가 임시 테이블 (하위 쿼리,UNION
,GROUP BY
등)을 생성해야하는 경우 선호되는 선택은 데이터를 RAM에 저장하는MEMORY
엔진을 사용하는 것입니다. 그러나VARCHARs
은 프로세스 중에CHAR
로 변환됩니다. 이렇게하면VARCHAR(255) CHARACTER SET utf8mb4
가 1020 바이트가됩니다. 이로 인해 디스크로 유출 될 필요가 생길 수 있으며 느려질 수 있습니다. - 특정의 상황에서는, InnoDB는 테이블 내의 열의 잠재적 인 사이즈를 조사해, 테이블이 너무 크다고 판단 해,
CREATE TABLE
중단합니다.
VARCHAR 대 TEXT
*TEXT
, CHAR
및 VARCHAR
대한 사용법 힌트와 몇 가지 모범 사례 :
-
TINYTEXT
절대로 사용하지 마십시오. - 거의
CHAR
사용하지 않습니다. 고정 길이입니다. 각 문자는CHARACTER SET
의 최대 길이입니다 (예 : utf8mb4의 경우 4 바이트 / 문자). -
CHAR
를 사용한다면, 그렇지 않다면CHARACTER SET ascii
사용하십시오. -
VARCHAR(n)
은 n 문자 에서 자릅니다.TEXT
는 몇 바이트 에서 자릅니다. (그러나 잘라내기를 원하십니까?) -
*TEXT
는 임시 테이블을 처리하는 방법 때문에 복잡한SELECTs
속도를 저하시킬 수 있습니다 .
AUTO_INCREMENT로서의 INT
AUTO_INCREMENT
에 INT
크기를 사용할 수 있습니다. UNSIGNED
가 항상 적합합니다.
특정 작업은 AUTO_INCREMENT
ids를 " AUTO_INCREMENT
"시킵니다. 이로 인해 예상치 못한 차이가 발생할 수 있습니다. 예 : INSERT IGNORE
및 REPLACE
. 그들은 필요할 필요가 없다는 것을 깨닫기 전에 ID 를 미리 할당 할 수 있습니다. 이는 InnoDB 엔진에서 의도 한 동작과 의도적 인 동작이므로 사용을 방해해서는 안됩니다.
기타
이미 "FLOAT, DOUBLE, DECIMAL"및 "ENUM"에 대해 별도의 항목이 있습니다. 데이터 유형에 대한 단일 페이지는 다루기 어려울 수 있습니다. "필드 유형"(또는 "데이터 유형"이라고해야합니까?)을 제안하고 개요를 작성한 후 다음 주제 페이지로 나눕니다.
- INTs
- FLOAT, DOUBLE 및 DECIMAL
- 문자열 (CHAR, TEXT 등)
- 이진 및 BLOB
- DATETIME, TIMESTAMP 및 친구들
- ENUM 및 SET
- 공간 데이터
- JSON 유형 (MySQL 5.7.8 이상)
- Money 및 기존 데이터 형식에 shoehorning을 필요로하는 기타 일반적인 유형을 나타내는 법
적절한 경우, 각 주제 페이지는 구문과 예제 외에도 다음을 포함해야합니다.
- 변경시 고려 사항
- 크기 (바이트)
- 비 -MySQL 엔진과 대조 (낮은 우선 순위)
- PRIMARY KEY 또는 보조 키에서 데이터 유형을 사용할 때의 고려 사항
- 기타 모범 사례
- 기타 성능 문제
(나는이 "예"가 나의 제안이 만족되거나 거부되었을 때 스스로를 혼란에 빠뜨릴 것이라고 생각한다.)
소개 (숫자)
MySQL은 다양한 숫자 타입을 제공한다. 이것들은
그룹 | 유형 |
---|---|
정수형 | INTEGER , INT , SMALLINT , TINYINT , MEDIUMINT , BIGINT |
고정 소수점 유형 | DECIMAL , NUMERIC |
부동 소수점 유형 | FLOAT , DOUBLE |
비트 값 유형 | BIT |
정수형
최소 부호없는 값은 항상 0입니다.
유형 | 저장 (바이트) | 최소값 (서명 됨) | 최대 값 (서명 됨) | 최대 값 (서명되지 않은) |
---|---|---|---|---|
TINYINT | 1 | -2 7 -128 | 2 7 -1 127 | 2 8 -1 255 자 |
SMALLINT | 2 | -2 15 -32,768 | 2 15 -1 32,767 | 2 (16) -1 65,535 |
MEDIUMINT | 삼 | -2 23 -8,388,608 | 2 23 -1 8,388,607 | 2 24 -1 16,777,215 |
INT | 4 | -2 31 -2,147,483,648 | 2 31 -1 2,147,483,647 | 2 32 -1 4,294,967,295 |
BIGINT | 8 | -2 63 -9,223,372,036,854,775,808 | 2 63 -1 9,223,372,036,854,775,807 | 2 (64) -1 18,446,744,073,709,551,615 |
고정 소수점 유형
MySQL의 DECIMAL
및 NUMERIC
유형은 정확한 숫자 데이터 값을 저장합니다. 이러한 유형을 사용하여 돈과 같은 정확한 정밀도를 유지하는 것이 좋습니다.
소수
이 값은 2 진 형식으로 저장됩니다. 컬럼 선언에서 정밀도와 스케일을 지정해야합니다.
정밀도는 값에 대해 저장되는 유효 자릿수를 나타냅니다.
Scale은 소수점 뒤에 저장된 자릿수를 나타냅니다.
salary DECIMAL(5,2)
5는 precision
를 나타내고 2는 scale
나타냅니다. 이 예에서이 열에 저장할 수있는 값의 범위는 -999.99 to 999.99
scale 매개 변수가 생략되면 기본값은 0입니다.
이 데이터 유형은 최대 65 자리까지 저장할 수 있습니다.
DECIMAL(M,N)
의해 취해진 바이트 수는 대략 M/2
입니다.
부동 소수점 유형
FLOAT
및 DOUBLE
은 대략적인 데이터 유형을 나타냄니다.
유형 | 저장 | 정도 | 범위 |
---|---|---|---|
흙손 | 4 바이트 | 23 유효 비트 / ~ 7 소수점 | 10 ^ + / - 38 |
더블 | 8 바이트 | 53 유효 비트 / ~ 16 십진수 | 10 ^ + / - 308 |
REAL
은 FLOAT
의 동의어입니다. DOUBLE PRECISION
동의어입니다 DOUBLE
.
MySQL은 (M, D) 한정자를 허용하지만 사용하지 마십시오 . (M, D)는 최대 M 자릿수까지 값을 저장할 수 있음을 의미합니다. 여기서 D는 소수점 이하 여야합니다. 숫자는 두 번 반올림되거나 잘립니다. 이것은 이득보다는 말썽을 더 일으키는 원인이 될 것이다.
부동 소수점 값은 근사값이며 정확한 값으로 저장되지 않으므로 비교에서 정확하게 처리하려고하면 문제가 발생할 수 있습니다. 특히 FLOAT
값은 DOUBLE
값과 거의 같지 않습니다.
비트 값 유형
BIT
유형은 비트 필드 값을 저장하는 데 유용합니다. BIT(M)
는 M이 1 to 64
범위에있는 M 비트 값까지의 저장을 허용합니다
bit value
표기법으로 값을 지정할 수도 있습니다.
b'111' -> 7
b'10000000' -> 128
때로는 'shift'를 사용하여 단일 비트 값을 생성하는 것이 편리합니다 (1 << 7)
예 (1 << 7)
128의 경우 (1 << 7)
.
NDB
테이블의 모든 BIT 컬럼의 최대 결합 크기는 4096입니다.
CHAR (n)
CHAR(n)
은 n
자의 고정 길이 문자열입니다. CHARACTER SET utf8mb4
, 텍스트가 어떤 텍스트인지에 관계없이 정확히 4*n
바이트를 차지합니다.
CHAR(n)
대부분의 사용 예는 영문자를 포함하는 문자열을 포함하므로 문자 집합은 CHARACTER SET ascii
여야합니다. ( latin1
은 잘 작동합니다.)
country_code CHAR(2) CHARACTER SET ascii,
postal_code CHAR(6) CHARACTER SET ascii,
uuid CHAR(39) CHARACTER SET ascii, -- more discussion elsewhere
DATE, DATETIME, TIMESTAMP, YEAR 및 TIME
DATE
데이터 유형은 날짜를 포함하지만 시간 구성 요소는 포함하지 않습니다. 형식은 'YYYY-MM-DD'
이며 범위는 '1000-01-01'에서 '9999-12-31'입니다.
DATETIME
형식에는 'YYYY-MM-DD HH : MM : SS'형식의 시간이 포함됩니다. 범위는 '1000-01-01 00:00:00'에서 '9999-12-31 23:59:59'까지입니다.
TIMESTAMP
유형은 '1970-01-01 00:00:01'UTC에서 '2038-01-19 03:14:07'UTC까지 유효 범위가있는 날짜와 시간으로 구성된 정수 유형입니다.
YEAR
유형은 YEAR
나타내며 1901 년에서 2155 년까지의 범위를 보유합니다.
TIME
유형은 'HH : MM : SS'형식의 시간을 나타내고 '-838 : 59 : 59'에서 '838 : 59 : 59'까지의 범위를 보유합니다.
저장소 요구 사항 :
|-----------|--------------------|----------------------------------------|
| Data Type | Before MySQL 5.6.4 | as of MySQL 5.6.4 |
|-----------|--------------------|----------------------------------------|
| YEAR | 1 byte | 1 byte |
| DATE | 3 bytes | 3 bytes |
| TIME | 3 bytes | 3 bytes + fractional seconds storage |
| DATETIME | 8 bytes | 5 bytes + fractional seconds storage |
| TIMESTAMP | 4 bytes | 4 bytes + fractional seconds storage |
|-----------|--------------------|----------------------------------------|
분수 초 (버전 5.6.4 이상) :
|------------------------------|------------------|
| Fractional Seconds Precision | Storage Required |
|------------------------------|------------------|
| 0 | 0 bytes |
| 1,2 | 1 byte |
| 3,4 | 2 byte |
| 5,6 | 3 byte |
|------------------------------|------------------|
MySQL 매뉴얼 페이지 DATE, DATETIME 및 TIMESTAMP 유형 , 데이터 유형 저장소 요구 사항 및 시간 값의 초 수를 참조하십시오 .