수색…


암시 적 / 자동 주조

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 중단합니다.

VARCHARTEXT

*TEXT , CHARVARCHAR 대한 사용법 힌트와 몇 가지 모범 사례 :

  • TINYTEXT 절대로 사용하지 마십시오.
  • 거의 CHAR 사용하지 않습니다. 고정 길이입니다. 각 문자는 CHARACTER SET 의 최대 길이입니다 (예 : utf8mb4의 경우 4 바이트 / 문자).
  • CHAR 를 사용한다면, 그렇지 않다면 CHARACTER SET ascii 사용하십시오.
  • VARCHAR(n) 은 n 문자 에서 자릅니다. TEXT 는 몇 바이트 에서 자릅니다. (그러나 잘라내기를 원하십니까?)
  • *TEXT 임시 테이블을 처리하는 방법 때문에 복잡한 SELECTs 속도를 저하시킬 수 있습니다 .

AUTO_INCREMENT로서의 INT

AUTO_INCREMENTINT 크기를 사용할 수 있습니다. UNSIGNED 가 항상 적합합니다.

특정 작업은 AUTO_INCREMENT ids를 " AUTO_INCREMENT "시킵니다. 이로 인해 예상치 못한 차이가 발생할 수 있습니다. 예 : INSERT IGNOREREPLACE . 그들은 필요할 필요가 없다는 것을 깨닫기 전에 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의 DECIMALNUMERIC 유형은 정확한 숫자 데이터 값을 저장합니다. 이러한 유형을 사용하여 돈과 같은 정확한 정밀도를 유지하는 것이 좋습니다.

소수

이 값은 2 진 형식으로 저장됩니다. 컬럼 선언에서 정밀도와 스케일을 지정해야합니다.

정밀도는 값에 대해 저장되는 유효 자릿수를 나타냅니다.

Scale은 소수점 뒤에 저장된 자릿수를 나타냅니다.

salary DECIMAL(5,2)

5는 precision 를 나타내고 2는 scale 나타냅니다. 이 예에서이 열에 저장할 수있는 값의 범위는 -999.99 to 999.99

scale 매개 변수가 생략되면 기본값은 0입니다.

이 데이터 유형은 최대 65 자리까지 저장할 수 있습니다.

DECIMAL(M,N) 의해 취해진 바이트 수는 대략 M/2 입니다.

부동 소수점 유형

FLOATDOUBLE대략적인 데이터 유형을 나타냄니다.

유형 저장 정도 범위
흙손 4 바이트 23 유효 비트 / ~ 7 소수점 10 ^ + / - 38
더블 8 바이트 53 유효 비트 / ~ 16 십진수 10 ^ + / - 308

REALFLOAT 의 동의어입니다. 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 유형 , 데이터 유형 저장소 요구 사항시간 값의 초 수를 참조하십시오 .



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow