MySQL 의 데이터 형식 검증
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)
VARCHARVARCHAR(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)
DECIMAlDecimal 에 대해 서 는 공식 적 인 표현 이 좀 복잡 합 니 다.
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 에 대해 서 는 줄 크기 에 제한 을 받 지 않 지만,자체 정의 에 제한 을 받는다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL에서 JSON 인덱싱 - aarondfrancis사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 말하지만 완전히 정확하지는 않습니다. MySQL로 JSON 열을 인덱싱하는 것은 완전히 가능합니다! 사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.