MySQL 의 데이터 형식 검증

CHAR
char(M)M 문자,길 이 는 M*문자 인 코딩 길이,M 최대 255 입 니 다.
인증 은 다음 과 같 습 니 다:

mysql> create table t1(name char(256)) default charset=utf8;
ERROR 1074 (42000): Column length too big for column 'name' (max = 255); use BLOB or TEXT instead
mysql> create table t1(name char(255)) default charset=utf8;
Query OK, 0 rows affected (0.06 sec)
mysql> insert into t1 values(repeat(' ',255));
Query OK, 1 row affected (0.00 sec)
mysql> select length(name),char_length(name) from t1;
+--------------+-------------------+
| length(name) | char_length(name) |
+--------------+-------------------+
| 765 | 255 |
+--------------+-------------------+
1 row in set (0.00 sec) 
VARCHAR
VARCHAR(M),M 역시 문자 이 고 길 이 는 M*문자 인 코딩 길이 입 니 다.그것 의 제한 은 비교적 특별 해서 줄 의 총 길 이 는 65535 바이트 를 초과 해 서 는 안 된다.

mysql> create table t1(name varchar(65535));
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
mysql> create table t1(name varchar(65534));
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
mysql> create table t1(name varchar(65533));
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
mysql> create table t1(name varchar(65532));
Query OK, 0 rows affected (0.08 sec) 
상기 표 의 기본 문자 집합 은 latin 1 이 고 문자 길 이 는 1 개의 바이트 이기 때문에 varchar 에 대해 서 는 최대 65532 바이트 의 길이 만 지정 할 수 있 습 니 다.
지정 utf 8 이면 최대 21844 의 길이 만 지정 할 수 있 습 니 다.

mysql> create table t1(name varchar(65532)) default charset=utf8;
ERROR 1074 (42000): Column length too big for column 'name' (max = 21845); use BLOB or TEXT instead
mysql> create table t1(name varchar(21845)) default charset=utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
mysql> create table t1(name varchar(21844)) default charset=utf8;
Query OK, 0 rows affected (0.07 sec) 
메모:줄 의 길 이 는 최대 65535 이 며,blob,text 를 제외 한 다른 열 에 만 있 습 니 다.

mysql> create table t1(name varchar(65528),hiredate datetime) default charset=latin1;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
mysql> create table t1(name varchar(65527),hiredate datetime) default charset=latin1;
Query OK, 0 rows affected (0.01 sec) 
확실히 datetime 은 5 개의 바이트 를 차지 했다.
TEXT,BLOB

mysql> create table t1(name text(255));
Query OK, 0 rows affected (0.01 sec)
mysql> create table t2(name text(256));
Query OK, 0 rows affected (0.01 sec)
mysql> show create table t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`name` tinytext
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> show create table t2\G
*************************** 1. row ***************************
Table: t2
Create Table: CREATE TABLE `t2` (
`name` text
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec) 
위의 출력 을 통 해 알 수 있 듯 이 text 는 길 이 를 정의 할 수 있 습 니 다.범위 가 28(즉 256)보다 작 으 면 tinytext 이 고 범위 가 216(즉 65536)보다 작 으 면 text 입 니 다.224 보다 작 으 면 mediumtext 이 고 232 보다 작 으 면 longtext 입 니 다.
상술 한 범 위 는 모두 바이트 수 이다.
utf 8 문자 집합 을 정의 하면 text 에 대해 서 는 실제로 21845 글자 만 삽입 할 수 있 습 니 다.

mysql> create table t1(name text) default charset=utf8;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t1 values(repeat(' ',21846));
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql> insert into t1 values(repeat(' ',21845));
Query OK, 1 row affected (0.05 sec) 
DECIMAl
Decimal 에 대해 서 는 공식 적 인 표현 이 좀 복잡 합 니 다.

Values for DECIMAL (and NUMERIC) columns are represented using a binary format that packs nine decimal (base 10) digits into four bytes. Storage for the integer and fractional parts of each value are determined separately. Each multiple of nine digits requires four bytes, and the “leftover” digits require some fraction of four bytes. The storage required for excess digits is given by the following table. 
대응 표 도 한 장 제공 했다.

이상 의 이 말 에 대한 해석 은 다음 과 같은 몇 가지 가 있다.
1.9 자리 당 4 개의 바이트 가 필요 하고 나머지 자리 수 에 필요 한 공간 은 위 와 같다.
2.정수 부분 과 소수 부분 은 따로 계산한다.
예 를 들 어 Decimal(6,5)은 정 의 를 통 해 알 수 있 듯 이 정수 가 1 위 를 차지 하고 정수 가 5 위 를 차지 하기 때문에 모두 1+3=4 개의 바이트 를 차지한다.
어떻게 검증 합 니까?InnoDB Table Monitor 를 통 해
InnoDB 테이블 모니터 를 어떻게 시작 하 는 지 참고 하 십시오.http://dev.mysql.com/doc/refman/5.7/en/innodb-enabling-monitors.html

mysql> create table t2(id decimal(6,5));
Query OK, 0 rows affected (0.01 sec)
mysql> create table t3(id decimal(9,0));
Query OK, 0 rows affected (0.01 sec)
mysql> create table t4(id decimal(8,3));
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE innodb_table_monitor (a INT) ENGINE=INNODB;
Query OK, 0 rows affected, 1 warning (0.01 sec) 
결 과 는 오류 로그 에 출력 됩 니 다.
오류 로그 보기:

decimal(6,5)에 대해 서 는 정수 가 1 위 를 차지 하고 소수 가 5 위 를 차지 하 며 모두 공간 1+3=4 개의 바이트 를 차지한다.
decimal(9,0)에 대해 정수 부분 9 자리,9 자리 당 4 개의 바이트 가 필요 하 며 모두 4 개의 바이트 가 차지 합 니 다.
decimal(8,3)에 대해 정 수 는 5 위 를 차지 하고 소 수 는 3 위 를 차지 하 며 모두 공간 3+2=5 개의 바이트 를 차지한다.
이로써 자주 사용 하 는 MySQL 데이터 형식 검증 이 완료 되 었 습 니 다~
CHAR,VARCHAR,TEXT 등 문자 유형 에 대해 M 은 문자 의 개 수 를 지정 합 니 다.CHAR 에 있어 서 가장 큰 문자 수 는 255 입 니 다.VARCHAR 에 있어 서 가장 큰 문자 수 는 문자 집합 과 관련 이 있 습 니 다.문자 집합 이 latin 1 이 라면 가장 큰 문자 수 는 65532(모든 문자 가 하나의 바이트 만 차지 하기 때 문 입 니 다)입 니 다.utf 8 에 있어 서 가장 큰 문자 수 는 21844 입 니 다.한 문자 가 세 개의 바이트 만 차지 하기 때 문 입 니 다.본질 적 으로 VARCHAR 는 줄 크기 제한(최대 6 만 5 천 535 바이트)을 더 많이 받는다.TEXT 에 대해 서 는 줄 크기 에 제한 을 받 지 않 지만,자체 정의 에 제한 을 받는다.

좋은 웹페이지 즐겨찾기