MySQL CHAR 와 VARCHAR 는 어떻게 선택해 야 합 니까?

3863 단어 MySQLCHARVARCHAR
VARCHAR 과 CHAR 타 입
VARCHAR 과 CHAR 은 문 자 를 저장 하 는 데 사용 되 는 두 가지 주요 문자열 형식 입 니 다.불 행 히 도 메모리 엔진 에 의존 하 는 방식 이기 때문에 이 문자열 들 이 디스크 와 메모리 에 어떻게 저장 되 는 지 설명 하기 어렵다.자주 사용 하 는 InnoDB 와 MyISAM 을 제외 하고 다른 메모리 엔진 을 사용 했다 고 가정 하면 메모리 엔진 의 문 서 를 자세히 읽 어야 한다.​
VARCHAR 는 가 변 길이 의 문자열 을 저장 하 며 가장 많이 사용 되 는 문자 데이터 형식 입 니 다.고정 길이 의 유형 에 비해 VARCHAR 에 필요 한 저장 공간 이 작 으 며 저장 공간(예 를 들 어 짧 은 문자열 이 차지 하 는 공간)을 최대한 적 게 사용 합 니 다.MyISAM 의 경우 표를 만 들 때 ROW 를 지정 하면FORMAT=FIXED 는 고정된 공간 저장 필드 를 사용 하여 공간 낭 비 를 초래 합 니 다.VARCHAR 는 1-2 개의 추가 바이트 저장 문자열 의 길 이 를 사용 합 니 다.최대 길이 가 255 바이트 보다 낮 을 때 1 개의 바이트 를 사용 하고 더 많 으 면 2 개의 바이트 를 사용 합 니 다.이에 따라 라틴 문자 집합의 VARCHAR(10)은 11 바이트 의 저장 공간 을 사용 하고,VARCHAR(1000)은 1002 바이트 의 저장 공간 을 사용한다.​
VARCHAR 는 공간 을 절약 할 수 있 기 때문에 성능 을 개선 할 수 있다.그러나 길이 가 변 하기 때문에 데이터 시트 를 업데이트 할 때 데이터 줄 의 저장 공간 이 달라 져 어느 정도 추가 비용 을 가 져 올 수 있 습 니 다.만약 데이터 줄 의 길이 가 원래 의 저장 위 치 를 저장 할 수 없 게 한다 면,서로 다른 저장 엔진 은 서로 다른 처 리 를 할 것 이다.예 를 들 어 MyISAM 은 데이터 줄 의 파편 을 만 들 수 있 으 며,InnoDB 는 업 데 이 트 된 데이터 줄 을 저장 하기 위해 디스크 페이지 를 나 누 어야 한다.​
보통 최대 열 길이 가 평균 길이 보다 훨씬 높 으 면(예 를 들 어 선택 할 수 있 는 비고 필드)VARCHAR 을 사용 하 는 것 이 수지 가 맞 고 업데이트 빈도 가 낮 으 면 파편 화 는 문제 가 되 지 않 는 다.주의해 야 할 것 은 UTF-8 문자 집합 을 사용 하면 실제 저 장 된 바이트 길 이 는 문자 에 따라 정 해진 다 는 점 이다.중국어 에 대해 추천 하 는 저장 문자 집합 은 utf8mb 4 입 니 다.​
CHAR 형식의 길 이 는 고정 되 어 있 으 며,MySQL 은 필드 마다 충분 한 저장 공간 을 분배 합 니 다.CHAR 형식 값 을 저장 할 때 MySQL 은 뒤에 있 는 빈 문 자 를 삭제 합 니 다.값 은 비 교 를 위해 빈 문 자 를 사용 하여 정렬 합 니 다.짧 은 문자열 에 서 는 CHAR 를 사용 하 는 것 이 유리 하 며,모든 값 의 길이 가 거의 일치 하면 CHAR 를 사용 할 수 있 습 니 다.예 를 들 어 사용자 암호 의 MD5 값 을 저장 할 때 CHAR 를 사용 하 는 것 이 더 적합 합 니 다.이것 은 MD5 의 길이 가 항상 고정 되 어 있 기 때 문 입 니 다.또한 필드 값 이 자주 바 뀌 는 데이터 형식 에 있어 서 CHAR 는 VARCHAR 보다 유리 합 니 다.CHAR 는 조각 이 생기 지 않 기 때 문 입 니 다.짧 은 데이터 열 에 대해 서 는 VARCHAR 보다 CHAR 를 사용 하 는 것 이 효율 적 이다.예 를 들 어 CHAR(1)을 사용 하여 논리 값 을 저장 하 는 Y 와 N 을 사용 하 는 경우 1 바이트 만 필요 하고 VARCHAR 는 2 바이트 가 필요 하 다.빈 문 자 를 제거 하 는 기능 이 이상 하 게 느껴 집 니 다.예 를 들 어 보 겠 습 니 다.

CREATE TABLE t_char_varchar_test (
  id INT PRIMARY KEY,
  char_col CHAR(10),
  varchar_col VARCHAR(10)
);

INSERT INTO t_char_varchar_test 
VALUES 
(1, 'string1', 'string1'),
(2, '  string2', '  string2'),
(3, 'string3  ', 'string3  ');
위의 결과 에 따라 데이터 시트 를 삽입 하면 string 2 의 사전 빈 칸 은 제거 되 지 않 지만 CHAR 형식 으로 저장 할 때 string 3 꼬리 에 있 는 빈 칸 은 제거 되 고 SQL 조회 결 과 를 사용 하여 검사 합 니 다.

SELECT CONCAT("'", char_col, "'"), CONCAT("'", varchar_col, "'") 
FROM t_char_varchar_test WHERE 1
결 과 는 다음 과 같 습 니 다.CHAR 형식의 string 3 뒤의 빈 칸 이 제거 되 었 고 VARCHAR 유형의 빈 칸 이 없습니다.이러한 상황 은 대부분 문제 가 없 을 것 입 니 다.실제 응용 에서 도 trim 함수 로 양쪽 의 빈 문 자 를 제거 하 는 경우 가 많 습 니 다.그러나 빈 칸 을 저장 해 야 할 때 CHAR 형식 을 선택 하지 않도록 주의해 야 합 니 다.

데 이 터 를 어떻게 저장 하 는 지 는 저장 엔진 에 의 해 결정 되 며,엔진 이 고정 길이 와 가 변 길이 의 데 이 터 를 처리 하 는 방식 은 같 지 않다.메모리 엔진 은 고정된 크기 의 줄 을 사용 하기 때문에 데이터 길이 가 변 하 더 라 도 가능 한 최대 저장 공간 을 분배 해 야 한다.그러나 문자열 정렬 과 빈 문자 절단 은 MySQL 서버 에서 이 루어 지기 때문에 모든 저장 엔진 이 같 습 니 다.​
CHAR 과 VARCHAR 와 비슷 한 것 은 BINARY 와 VARBINARY 입 니 다.바 이 너 리 바이트 문 자 를 저장 하 는 데 사 용 됩 니 다.BINARY 의 정렬 은 문자 0 의 바이트 값 을 사용 하여 정렬 하고 다시 값 을 얻 을 때 차단 하지 않 습 니 다.문자 가 아 닌 문자 의 바이트 값 을 사용 해 야 한다 면 BINARY 를 사용 하 는 것 이 효율 적 입 니 다.이 는 비교 할 때 대소 문 자 를 고려 하지 않 아 도 되 고,다른 한편 으로 는 MySQL 이 한 번 에 한 바이트 만 비교 하기 때 문 입 니 다.​
결어:
실제 데이터 시트 디자인 에 서 는 대부분 VARCHAR 을 사용 하지만 VARCHAR 는 문자열 길 이 를 추가 로 1-2 바이트 로 저장 해 야 합 니 다.주의해 야 할 것 은 응용 프로그램 에서 필드 의 최대 길 이 를 제한 하여 데이터 테이블 이 가능 한 한 짧 은 VARCHAR 를 사용 하여 효율 을 높 일 수 있 도록 하 는 것 이다.또한 고정 길이,길이 가 짧 거나 길이 변화 가 적은 문자 유형 에 대해 서 는 CHAR 류 저장 소 를 사용 하여 저장 효율 을 높이 는 것 을 추천 합 니 다.
이상 은 MySQL CHAR 와 VARCHAR 의 선택 에 대한 상세 한 내용 입 니 다.MySQL CHAR 와 VARCHAR 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 해 주 십시오!

좋은 웹페이지 즐겨찾기