데이터베이스의 텍스트 열에 varchar를 사용해야하는 이유가 있습니까?


36

varchar단지 남은 앞에서 text주위왔다, 또는 당신이 할 경우가 사용되어 원하는 를 사용하는가 varchar? (또는 char그 문제에 ..)

(저는 Postgres와 MySQL (MyISAM)을 매일 사용하므로 가장 관심이있는 것이지만 다른 데이터베이스에 대한 답변은 물론 환영합니다. ^ _-)


6
에 적어도 SQL 서버 , text사용되지 않습니다. 데이터 저장 위치 및 액세스 방법과 관련된 사용법도 고려해야합니다.
Oded

일부 DBMS에서는 sort 또는 where 절에서 텍스트 열을 사용하지 못할 수 있습니다. Postgres에 익숙하지 않지만 설명서를 확인하십시오.
jqa

1
이 StackOverflow 질문 은 더 많은 정보를 제공 할 수 있습니다.
J0ANMM

답변:


32

일반적으로

text열은 비표준이며 구현에 따라 다릅니다. : 대부분의 경우, 데이터베이스에 따라 그들은 다음과 같은 제한 사항 중 하나 이상을 조합 할 수 있습니다 색인하지 , 검색 할 수 없습니다정렬되지 않음 .

Postgres에서

이러한 모든 유형 은 동일한 C 데이터 구조를 사용하여 내부적으로 저장됩니다. .

MySQL에서

text은 특수화 된 버전이며BLOB 인덱싱에 제한이 있습니다.

이 두 가지 예만 다른 SQL RDBMS 시스템에 외삽 될 수 있으며 한 유형을 다른 유형보다 선택할시기를 충분히 이해해야합니다.

암시 적으로 명확하게하기 위해 TEXT독점적이고 비표준이므로 절대 사용해서는 안됩니다 . 모든 SQL당신이 그것에 대해 쓰기는 할 수 없습니다 휴대용 당신에게 미래에 문제를 일으킬 보장합니다. ANSI 표준의 일부인 유형 만 사용하십시오 .

  • CHAR모든 항목에 대해 고정 된 수의 문자가 있다는 것을 알고있을 때 사용하십시오 .
  • VARCHAR모든 항목에 가변 개수의 문자가있을 때 사용하십시오 .
  • 당신은보다 더 많은 저장해야하는 경우 VARCHAR, 제공 할 수 CLOB와 함께 UTF-8인코딩 또는 이에 상응하는 표준 유형입니다.
  • TEXT비표준이므로 절대 사용 하지 마십시오 .

1
non standard and implementation specificnot indexable, not searchable and not sortable에 대해 승인 했지만 내가 몰랐습니다. 나는 표준화 된 인상 아래 text 있었다 .
이즈 카타

1
ASCII text표준 또는 UNICODE text표준 :-) 또는 다른 6 개 text인코딩 표준 중 하나 를 의미 합니까?

1
SQL 표준 문서를 파헤 치면 text문자 유형으로 아무것도 찾을 수 없다고 생각합니다 . 나는 아무것도 보지 못했고, 일부 공급 업체는 그것을 부르는 등 long char기본적으로 인코딩이 첨부 된 BLOB입니다.

2
@JarrodRoberson은 솔직히 말해서 (항상 Postgres 환경에서) "항상 사용 TEXT" 한다는 결론을 내리는 평판 좋은 자원이 많이 있습니다 . 다른 데이터베이스로 마이그레이션하려는 경우 특히 거래 중단이 아닙니다. 특히 postgres의 무제한 VARCHAR(TOAST로 인해 MySQL과 같은 행 제한이 없기 때문에)이 무제한 VARCHAR으로 변환되지 않을 수 있다는 점을 고려해야하기 때문에 특히 그렇습니다 . 어쨌든 다른 데이터베이스.
카야 만

1
... Postgres가 CLOB을 지원하지 않기 때문에 두 번째에서 마지막 지점은 유지되지 않습니다. 표준을 준수 하더라도 드롭 인 교체를 지원할 수 없습니다 . 완구 SQL을 작성하지 않는 한 ANSI SQL을 작성하는 것은 현실적으로 실행 가능한 옵션이 아닙니다.
카야 만

11

text, varchar그리고 char모든 다른 이유로 사용됩니다. 물론 구현 차이 (크기가 얼마나 많은지 등)가 있지만 사용법과 의도도 고려해야합니다. 사용하는 유형은 또한 저장 될 데이터의 종류에 대해 알려줍니다 (또는 모든 것에 사용 text합니다 ). 무언가 길이가 고정되어 있으면를 사용 합니다. 상한이 잘 정의 된 가변 길이가있는 경우을 사용하십시오 . 당신이 거의 제어 할 수없는 큰 텍스트 덩어리 라면 아마도 가장 좋은 방법 일 것입니다.charvarchartext


3
Sooooooo, 유일한 차이점은 어쨌든 프로그램 코드에 있어야 할 경계 검사를 복제하는 것입니까?
이즈 카타

2
@Izkata-구현상의 차이도 있습니다. 경계 검사, 정보 유형 에 관한 것이 아닙니다 . 우편 번호는 항상 5 자리 코드이므로 'char'와 같은 것을 사용하면이 데이터 정의의 일부가됩니다. 바운드 검사와 같은 것이라면 모든 것에 대해 하나의 데이터 유형 만 사용 하고 검사 및 캐스팅 코드 측을 수행 할 수 있습니다.
시스템 다운

6
내가 아는 한 @SystemDown으로는 지금까지 char, varchar그리고 text모두 같은 저장하기 위해 설계된 유형 의 데이터를. 따라서 두 가지 대답은 범위 검사에 관한 것입니다. 효율성 차이가 있다면 무엇입니까? varchar이상을 사용 text합니까?
이즈 카타

1
float 및 double도 동일한 유형의 데이터에 사용되지만 차이점이 있으며 다르게 사용됩니다. 구현의 차이점에 관해서는 Postgres에 익숙하지 않아서 두려워합니다.
시스템 다운

4
@SystemDown 우편 번호를 char (5)로 저장하더라도 국제화를 시작하면 물릴 수 있습니다. 영국 우편 번호는 길이가 다양하며 5 자이면 충분하지 않습니다. 그러나 영국 우편 번호의 공간이 구문 분석과 관련이 있는지는 모르겠습니다.
Vatine

5

데이터베이스는 속도 스토리지 최소화 와 같은 성능과 관련이 있습니다. 컴퓨터 세계의 대부분의 다른 부분에서, 당신은 당신의 문자열에 얼마나 많은 문자가 있는지 신경 쓰지 않을 것입니다. 그것은 백과 사전의 전체 내용 일 수 있습니다. 모두 문자열 일뿐입니다. 사실, 많은 언어가 문자열인지 숫자인지에 대해 귀찮게하지 않습니다.

그러나 컴퓨터가 더 빨라지고 더 많은 메모리를 확보함에 따라 사람들은 더 많은 데이터를 데이터베이스에 저장하고 더 빠른 쿼리를 수행합니다. 데이터베이스 CPU와 메모리는 오늘날 64Kb 메인 메모리와 10Mb 하드 드라이브 ( 메인 프레임 컴퓨터) 시절처럼 제한적입니다 .

고정 바이트 수는 가변 길이 수보다 처리하기가 훨씬 쉽습니다. 10 바이트는 1,000,000보다 다루기가 훨씬 쉽습니다. 따라서 데이터베이스는 단서를 제공하여 테라 바이트 단위의 데이터에서 기가 바이트의 결과를 마이크로 초 단위로 제공 할 수 있도록합니다. 그렇게 열심히 데이터베이스를 사용하지 않는다면, 제공하는 속도가 필요하지 않으며 불필요한 질문에 짜증이 날 것입니다. 그러나 성능이 필요한 경우 힌트를 줄 수 있습니다.

다른 답변에서 언급 한 바와 같이, 사용은 char항상, 문자의 특정 번호를 사용하는 경우 varchar길이가 다를 수 있지만 너무 큰 얻을하지 않는 경우 (내 생각 엔 대부분 DB의 A와 치료를 char또는 text크기에 따라), 그리고 text그것을 경우 길이가 될 수 있습니다. 당신의 SQL의 시도가 사용하는 경우 text열을, 어떻게 든 그것을 요약과에 넣어하는 것이 가장 수 있습니다 char또는 작은 varchar또한 열, 다음 할 where의와는 order by'그것에이야. 물론 성능이 중요한 경우에만 해당됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.