2016-11-05 1 views
1

사용자 이름, 암호 등 모든 정보를 저장하는 사용자 테이블을 만들고 있습니다. 제 질문은 UTF-8로 인코딩 된 테이블 또는 CHAR을 사용하여 VARCHAR에 사용자 이름을 저장하는 것이 더 좋습니까? char가 1 바이트이고 utf-8이 일부 문자에 대해 최대 3 바이트를 인 코드하기 때문에 데이터를 잃을 지 모르겠다. 이 경우에도 CHAR을 사용할 수 있습니까? 아니면 VARCHAR를 사용해야합니까? 일반적으로utf-8 인코딩을 사용하는 데이터베이스에서 char 또는 varchar가 더 좋습니까?

+0

'VARCHAR (x)'가 각 문자의 바이트 폭에 관계없이 최대'x' * 문자 *를 저장할 수 있다는 것을 깨닫지 못하는 것 같습니다 -'x' * 바이트에만 국한되지 않습니다. * ... 그리고'CHAR (x)'컬럼은 "단지 1 바이트"가 아니며, 그것은'x' 문자이며, 디스크에서 훨씬 비효율적입니다. 물론 사용자의 비밀번호를 "저장"해서는 안됩니다. –

+0

어쩌면 나는 UTF-8 때문에 1 바이트 이상이있는 문자를 3 바이트로 인코딩하고 3 바이트가 1 바이트 인 CHAR에 맞는지를 알기 때문에 옳은 것을 묻고있는 것은 아닙니다. 대신 VARCHAR을 사용하십시오. 내가 실수하면 정정 해주세요. –

+0

'CHAR'과'VARCHAR'의 크기는 바이트가 아닌 문자로 표현됩니다. 'CHAR (1)'은 1, 2 또는 3 바이트로 인코딩되었는지에 관계없이 정확히 1 * 문자 *를 저장할 수 있습니다. 'VARCHAR (1)'은 같은 제약을 받는다. 간단하게 단순화하는 것이 가장 큰 차이점은 모든 행의 값이 정확히 선언 된 길이가 아니라면'CHAR'는 디스크 나 메모리에서 효율적이지 않다는 것입니다. –

답변

2

는 규칙은 다음과 같은 경우에 CHAR 인코딩을 사용하는 것입니다 : 당신은 같은 길이를 (주 약어 생각)입니다 짧은 코드가

  • .
  • 길이가 다른 짧은 코드가있는 경우가 있지만 한 손으로 문자를 계산할 수있는 경우가 있습니다.
  • 힘이들 때 - CHAR을 사용해야한다고 말할 수 있습니다.
  • 문자열 끝에 공백이 포함 된 채움이 예기치 않은 동작을 일으키는 것을 보여주고 싶을 때.

기타 경우에는 VARCHAR()을 사용하십시오. 실제로 데이터베이스의 사용자는 문자열 끝에 공백이 있어야합니다.

+0

관련 팁 :'CHAR'에 대한 대부분의 경우는'CHARACTER SET ascii' (postal_code, country_code, md5 등) 일 수 있습니다. –

관련 문제