문제

나는 깨닫는 CHAR 권장하는 경우 내 모든 값을 고정 폭입니다.하지만,그래서 무엇인가?왜 그냥 선택 VARCHAR 에 대한 모든 텍스트 필드에 안전합니다.

도움이 되었습니까?

해결책

일반적으로 선택 CHAR 는 경우에는 모든 행이 있을 것이 가까이 같은 길이.선택 VARCHAR길이 변화 니다.CHAR 수도 있습니다 조금 더 빠르기 때문에 모든 행의 동일한 길이 있습니다.

마다 다소 차이가 있습니다 DB 구현하지만,일반적으로 VARCHAR 사용하는 하나 또는 두 개의 바이트 저장(길이 또는 해지)외에 실제 데이터입니다.그래서(사용할 경우 하나의 바이트는 캐릭터 설정)저장하는 단어"FooBar"

  • CHAR(6)=6 바이트(오버 헤드)
  • VARCHAR(10)=8 바이트(2 개의 바이트는 오버헤드)
  • 숯(10)=10 바(4 개의 바이트의 오버헤드)

CHAR빠르 와 더 효율적인 공간 를 위한 데이터의 상대적으로 동일한 길이(내 두 개의 문자가는 길이 다름).

참고:Microsoft SQL 에는 2 개의 바이트에 대한 오버헤드 VARCHAR.이에 따라 달라질 수 있습 DB DB 하지만,일반적으로 적어도 1 바이트의 데 필요한 오버헤드가 나타내 길이 또는 EOL 에 VARCHAR.

에 의해 지적되었다 Gaven 의견에 사용하는 경우,멀티-바이트 변수 길이의 캐릭터 설정 다음과 같 UTF8 다음 CHAR 점의 최대 바이트수를 필요한 수를 저장하기 위한 문자입니다.그렇다면 UTF8 요구에 가장 3 바이트를 저장하는 문자,그 CHAR(6)수정에서 18bytes,경우에만 저장하는 라틴어 1 문자입니다.그래서 이 경우에는 VARCHAR 이 훨씬 더 나은 선택입니다.

다른 팁

만약 당신이 작업을 나와 너와 함께 작업한 오라클,나는 것 아마 당신이 사용 varchar 거의 모든 상황에서.는 가정 char 를 적게 사용한 처리 능력을 보다 varchar 사실 수 있습니다......하지만 지금은 데이터베이스 엔진을 얻을 시간이 지남에 따라 더 이런 종류의 일반 규칙을 미래의"신화".

다른 것:또한,근처에는 성능 문제 때문에 누군가가 이동하기로 결정했으로 varchar.당신은 훨씬 더 많이 사용하시 쓰기에 좋은 코드(적은 호출하여 데이터베이스)및 효율적인 SQL(어떻게 인덱스 작업,어떻게 최적화,의사 결정을 내릴 이유가 exists 보다 더 빨리 in 일반적으로...).

최종 생각:내가 보는 모든 종류의 문제의 사용과 CHAR, 사람들이 찾고 할 때"그들은 해야를 찾고'',또는 사람들이 찾고 있'FOO'때 그들은 해야를 찾고'FOO(무리의 공백기)',또는 사람들이지 않을 정돈한 후행 공백 또는 버그 Powerbuilder 추가 2000 년까지 공백을 반환하는 값에서 Oracle 절차입니다.

성능적인 측면뿐만 아니라,혜택 CHAR 할 수 있음을 나타내는 데 사용되는 모든 값 야 같은 길이,예를 들어,대한 열 미국국가 약어.

Char 은 조금 더 빨리,그래서 만약 당신이 열 당신이 알고 있는 것이 특정 길이에 사용 char.예를 들어,저장(M)ale/(F)emale/(U)nknown 성별,또는 2 자에 대한 우리는 상태입니다.

가 NChar 또는 문를 수행하는 더 나은 자신의 var 대?

좋은 질문입니다.간단한 대답은 예 특정 상황에서.보자면 이 설명할 수 있다.

분명히 우리는 모두 알고 있는 경우 테이블을 만들의 열 varchar(255)(이 열 myColumn)삽입만 행하지만 단지 몇 가지 캐릭터로 myColumn 각 행에 대해 테이블의 것이 훨씬 작은(전체 수는 데이터 페이지의 필요에 의해 저장소 엔진)경우보다 내가 만들었 myColumn char(255).언제든지 내가 작업(DML)에는 테이블과 요청의 행,그것은 빠를 것이 때 myColumn 은 varchar 지 않기 때문에 나가 이동 주위의 모든 사람"추가"공간에서 끝입니다.와 같이 이동할 때 SQL 서버는 내부 종류와 같이 뚜렷한 또는 공인 작동,경우에 선택합 병합하는 동안 그것은 쿼리 계획,etc.이동을 의미할 수도 있을 얻는 데 걸리는 시간을 데이터 서버에서 나는 로컬 pc 또는 다른 컴퓨터 또는 어디든지 그를 사용할 수 있게 됩니다.

하지만 거기에 몇 가지 오버헤드를 사용하여 varchar.SQL 서버가 사용하는 두 개의 바이트는 표시(오버헤드)에,각 행에서는 방법을 알고,많은 바는 특정 행의 myColumn 있습니다.그것은 추가 2 바이트이 제공하는 문제,그것은"하 decode"길이의 데이터 myColumn 에 모든 행이 있습니다.

내 경험에 그것을 사용하는 가장 의미 char 대신 varchar 된 열에 참여할 수 있에서 쿼리를 처리합니다.예를 들어,기본 키의 테이블 또는 기타 란에는 인덱싱됩니다.CustomerNumber 에는 인구 통계,테이블 또는 CodeID 에서 디코딩 테이블,또는 아마도 OrderNumber 순서에는 테이블.를 사용하여 문자,쿼리할 수 있습니 더 빠르게 수행할 수 있는 가입 할 수 있기 때문에 똑바로 포인터 연산(임의)보다는 오히려 이동하는 그것의 포인터 변수량의 바이트로 페이지를 읽.내가 알고 있는 손실에는 마지막 문장이다.인에서 SQL 서버를 기반으로"의 아이디어는 조건자." 조건자는 상태입니다.예를 들어 myColumn=1,또는 OrderNumber < 500.

그래서 SQL 서버에서 수행하는 DML 문 및 조건자,또는"키를"인류에서는 고정된 길이(char),쿼리지 않으로 많은 일을 행과 일치에서 한 테이블에서 행입니다.그것은 필요가 없을 만들 수 있으며,친구들과 공유한 데이터에서 행하고 다음 아래 걸 문자열을 끝을 찾을 수 있습니다.모든 시간이 걸립니다.

지금 마음에 부담이 되기 쉽습을 제대로 구현했습니다.본 char 사용에 대한 기본 키 필드를 온라인 시스템입니다.폭을 유지해야 작은 즉char(15)또는 무언가가 합리적이다.최고의 작품에서 온라인 시스템이기 때문에 당신은 일반적으로만 검색하거나 upserting 적은 수의 행,그래서 하"분"그 후행 공백은 당신이 얻을 결과에 설정이 간단한 작업이 수백만에 가입하의 행에서 한 테이블의 수백만에 있는 행입니다.

또 다른 이유는 CHAR 의미가 넘 varchar 에 온라인 시스템은 줄일 수 있다는 것 페이지로 분할합니다.를 사용하여 문자,당신은 기본적으로"예약"(그리고 낭비)는 공간은 경우에 따라서 그 사용자가를 따라 나중에 더 많은 데이터를 열 SQL 이미에 할당된 공간에서 간다.

을 사용하는 또 다른 이유 CHAR 유사한 두 번째 이유입니다.는 경우 프로그래머 또는 사용자가"일괄 업데이트"수백만의 행 추가,몇 가지 문장 참고 필드를 들어,당신이 얻을 수 없는 전화에서 DBA 는 중동에서 밤의 이유를 궁금의 드라이브가 가득합니다.다시 말해서,그것은 더 예측 가능한 성장의 크기의 데이터베이스입니다.

그래서 사람들은 3 가지 방법으로 온라인 OLTP()시스템에서 혜택을 누릴 수 있습 char 통해 varchar.나도 좀처럼 사용 char 창고/분석/OLAP 시나리오기 때문에 일반적으로 너무 많은 데이터는 모든 사람들 char 열 추가 할 수 있습니다 많은 낭비되는 공간입니다.

마음에 그 문을 만들 수 있는 데이터베이스는 훨씬 더 큰 그러나 대부분의 백업 도구가 데이터 압축 그래서 당신의 백업을하는 경향이에 대해 동일한 크기로 사용한 경우 varchar.예를 들어 LiteSpeed 또는 레드 게이트 SQL 백업입니다.

다른 사이에 전망을 만들어를 위한 데이터를 내보내기 폭 고정 파일입니다.말하자가 어떤 내보내기 데이터를 평 파일을 읽을 수 있는 메인프레임입니다.그것은 고정 너비(구분되지 않습니다).나는 다음과 같 데이터를 저장하기 위해서는"준비"이블로 varchar(라이 걸리는 더 적은 공간에서 데이터베이스)및 다음 사용하 보기 모든 캐스팅을 char 이와 동등한 길이로에 해당하의 폭정에 대한 폭는 열이 있습니다.예를 들어:

create table tblStagingTable (
pkID BIGINT (IDENTITY,1,1),
CustomerFirstName varchar(30),
CustomerLastName varchar(30),
CustomerCityStateZip varchar(100),
CustomerCurrentBalance money )

insert into tblStagingTable
(CustomerFirstName,CustomerLastName, CustomerCityStateZip) ('Joe','Blow','123 Main St Washington, MD 12345', 123.45)

create view vwStagingTable AS
SELECT CustomerFirstName = CAST(CustomerFirstName as CHAR(30)),
CustomerLastName = CAST(CustomerLastName as CHAR(30)),
CustomerCityStateZip = CAST(CustomerCityStateZip as CHAR(100)),
CustomerCurrentBalance = CAST(CAST(CustomerCurrentBalance as NUMERIC(9,2)) AS CHAR(10))

SELECT * from vwStagingTable

이것은 시원하기 때문에 내부적으로 나의 데이터 공간을 적게 차지하기 때문에 그것을 사용하여 varchar.하지만 내가 사용하는 경우 DTS 또는 SSIS 또는 단지에서 잘라내어 붙여넣 SSMS 를 메모장에 사용할 수 있습니다 볼 수를 얻을 수 후행 공간이 있습니다.DTS 우리가 사용하는 기능이라고,조금도 나는 잊어 버리라"열을 제안"또는 무언가이다.로그래밍할 수 있는 더 이상 당신이 지루하게 정의하는 파일 관리자입니다.그러나 때문에 당신은 당신의보기 설정,SSIS 알 수 있습의 열 저장할 수 있는 시간이 많을 때 건물의 데이터 흐름 작업을 합니다.

그래서 바닥다.사용 varchar.거기에 아주 적은 수의 사용하는 이유 char 만 그것은 성과를 위한 이유입니다.이 있는 경우 시스템과 함께 hundrends 의 수백만의 행 당신이 볼 눈에 띄는 차이한 경우 조건자는 결정적(char)하지만 대부분의 시스템을 사용하여 char 는 단순히 공간을 낭비하.

는 희망 도움이 됩니다.Jeff

를 구현하면 성능이 저하될 수 있는 혜택이지만,여기에는 언급되지 않았:행 마이그레이션입니다.Char,당신은 예약은 전체 사전에 공간.그래서 당신은 char(1000),그리고 당신은 저장소 10 자리,당신이 사용하는 모든 1000 부르는 것들은의 공간입니다.에로 varchar2(1000),당신은 단지 사용하여 10 개의 문자를 제공 합니다.문제를 할 때 데이터를 수정합니다.당신 업데이트 열을 포함 900 문자입니다.그것은 가능한 공간을 확장하 varchar 이지에서 사용할 수 있는 현재 차단합니다.는 경우,DB 엔진 마이그레이션해야 합 행하는 또 다른 블록,그리고 포인터에서 원래의 블록에 새로운 행을 새로운 블록이다.이 데이터를 읽으려면,DB 엔진 것입니다 이제 읽을 수 있는 2 블록입니다.
수 equivocally 말 varchar 또는 문은 더 낫다.가를위한 공간입니다 시간이 거래,그리고 고려할지 여부를 데이터를 업데이트됩니다,특히 있을 경우 좋은 기회는 성장할 것입니다.

사이에는 차이가 있기 성능을 최적화하여 최상의 방법의 유형은 규칙이 있습니다.을 만드는 경우 새로운 테이블을 고정 필드 길이,이것을 사용하는 문자,당신이 있어야에서 사용하는 경우입니다.이것은 초기 최적화이지만,오히려 구현하는 엄지손가락의 규칙(또는 최상의 방법).

즉-이 있는 경우 2 편지 상태 필드를 사용 CHAR(2).필드가 있는 경우 실제 국가의 이름,사용 VARCHAR.

나는 선택 varchar 지 않으면 열을 저장하 고정 값을 우리와 같은 상태의 코드는 2 항상 문 장 그리고 목록의 유효 미국 코드를 자주 변경할 필요가 없:).

다른 모든 경우에,심지어 같은 저장하는 해시된 암호(고정된 길이)나는 선택 varchar.

왜-char 형 열은 항상 성취와 공간을 만드는 위한 열 my_column 으로 정의 char(5)값이'ABC'안 comparation:

my_column = 'ABC' -- my_column stores 'ABC  ' value which is different then 'ABC'

거짓입니다.

기능 으로 이어질 수 있는 많은 버그를 자극하는 동안 개발하고 테스트를 어렵습니다.

CHAR 더 적은 저장 공간보다 VARCHAR 경우 모든 데이터 값을에서는 필드가 동일한 길이 있습니다.이제 아마 2009 년 800GB 데이터베이스가 동일한 모두 의도와 목적으로 810GB 변환할 경우 VARCHARs 하는 문자,그에 대한 짧은 문자열은(1 또는 2 문자),CHAR 은 아직도 산업을"최상의 방법"나는 말할 것입니다.

지금 보는 경우에 다양한 데이터의 유형은 대부분의 데이터베이스를 제공하도 정수 혼자(비트,작은,int,bigint),이 있을 선택하는 이유 중 하나입니다.단순히 선택 bigint 모든 시간은 실제로는 조금 무식한의 목적으로 사용합니다.면 필드에는 단순히 사람의 나이에서 년이터 타입입니다.지금 그것은 반드시"잘못된",그러나 그것은 효율적이지 않습니다.

하지만 흥미로운 인수와 데이터베이스 시간이 지남에 따라 개선,그것을 주장 할 수있 CHAR vs VARCHAR 않을 얻을 적은 관련이 있습니다.

저는 짐 McKeeth 습니다.

또한,인덱싱하고 전체 표 검사는 빠르는 경우에 당신의 테이블에 있 CHAR 열이 있습니다.기본적으로 최적화할 수 있는 방법 예측하는 큰 각 기록하는 경우에만 CHAR 열을하는 동안,그것은 확인해야의 크기 값의 모든 VARCHAR 열입니다.

외 업데이트하는 경우 VARCHAR 열 크기보다 큰 이전할 수 있는 컨텐츠를 강제 데이터베이스를 재 구축하는 인덱스(기 때문에 강제 데이터베이스를 물리적으로 이동 디스크에 레코드).동 CHAR 는 열을 발생하지 않습니다.

하지만 당신은 아마 걱정하지 않을 것에 대해 성과 충돌하지 않는 한 테이블은 거대합니다.

기 Djikstra 의 현명한 단어입니다.이른 성능 최적화는 모든 악의 뿌리.

많은 사람들이 지적되는 정확하게 알고 있는 경우에는 해당 길이의 값을 사용하여 CHAR 는 몇 가지 혜택을 제공합니다.하지만 보관하는 동안 우리국 CHAR(2)은 훌륭한 오늘날 때,당신은 메시지를 받을 판매에서는'우리는 단지 우리의 첫 번째 판매하는 호주',당신은 당신의 세계에서 고통입니다.나는 항상을 과대 평가 얼마나 내가 생각하는 분야이 필요하기보다는'정확한'추측을 덮개를 위한 미래의 이벤트입니다.VARCHAR 이 나에게 더 많은 유연성이 지역에서.

거기에 몇 가지 작은 오버헤드를 처리 계산에 실제 필요한 크기 위한 열 값을 할당하고 공간에 대한 Varchar,그래서 당신은 확실히 얼마나 확실 가치는 항상,그것은 더 나은 사용하는 문자 및 방지했다.

그것은 고전적인 공간에 대비 성능이 단점.

MS SQL2005,Varchar(또는 이며 대 lanuagues 요구하는 두 개의 바이트별 문자 즉,중국어)에 있는 변수 길이 있습니다.을 추가할 경우를 행한 후에 기록된 하드 디스크를 찾습니다 데이터 비 contigious 위치를 원래 행고로 이어질의 분열의 데이터 파일이 있습니다.이 성능에 영향을 미칠 것입니다.

경우에 따라서,공간이지 않는 문제는 다음 Char 을 위해 더 나은 성능을 가지고 있지만 경우에 당신을 유지하려는 데이터베이스 크기에 아래로 다음 varchars 더 있습니다.

내가 생각하는 귀하의 경우에는 아마도 없는 이유를 선택하지 않 Varchar.그것은 당신에게 유연성으로 언급되었습의 숫자에 의해 respondants,성능은 지금 제외하고 매우 구체적인 상황에서 우리 meer 들(반대로 Google DBA)에 통지하지 않습니다 차이가 있습니다.

는 흥미로운 점은 주목할 가치가있을 때 그것에 관해서 DB 유형은 sqlite(인기있는 데이터베이스 미니로 꽤 인상적인 성능이)모든 데이터베이스로 문자열 형식입니다.

난 항상 사용 VarChar 고 일반적으로 그것보다 더 나을 수 있습 strickly 필요합니다.예를 들어.50 를 위한 이름으로,당신은 이유를 말하지 않은 안전합니다.

조각.Char 공간을 예약하고 VarChar 하지 않습니다.페이지할 수 있습을 수용하기 위해 필요한 업데이트 varchar.

나는 사용하지 않습니다.이 논쟁이 많은 사람들과 그들은 항상을 가져올 피로 진부한 그 문은 빠릅니다.가 얼마나 빠르니까?우리는 무엇을 말하고 여기에 대해,밀리초,초고 그렇다면 얼마나 많은?말해주고 있기 때문에 누군가 주장하는 그것의 몇 밀리초로 더 빠르고,우리가 해야를 소개하 톤의 하드 버그 수정을 위한 시스템?

그래서 여기에 몇 가지 문제가 있으로 실행됩니다:

모든 분야 패딩됩니다,그래서 당신은 결국 코드는 영원히 있는 RTRIMS 다.이것은 거대한 디스크 공간을 낭비한 필드가 있습니다.

지금 당신은 전형적인 예제의 문장은 하나의 문자 하지만 필드 선택 사항입니다.누가 패스 빈 문자열하는 필드가 하나의 공간입니다.그래서 때에는 다른 응용 프로그램/프로세스 쿼리는 그것은,그들은 하나의 공간,그렇지 않은 경우 사용 분.우리는 xml 문서,파일과 다른 프로그램,디스플레이 단지 하나의 공간에서 선택 필드 및 휴식 것들입니다.

그래서 지금 당신은 방법은 다음과 같습니다 null 을 전달하고 빈 문자열을 char 필드입니다.하지만 정확한 사용은 null 입니다.여기에서의 사용은 null 입니다.당신이 말할 수 있습을 얻는 파일에서는 공급업체

이름|성|도시

밥||로스앤젤레스

는 경우에는 성별을 지정하지 않은 것보다 당신이 입력한 밥,빈 문자열에는 로스앤젤레스에는 테이블.지금 당신이 말할 수 있습을 얻는 파일의 형식 변화와 성은 더 이상이 포함되어 있지만 과거에 있었다.

이름|도시

밥|시애틀

그럼 지금부터 성별 포함되지 않습니다,나는 사용하는 것은 null 입니다.Varchars 지원이 없는 문제입니다.

Char 에 다른 손은 다릅니다.당신은 항상 당신을 보내 null 입니다.만약 당신이 이제까지 보낼 빈 문자열로 끝날 것입된 필드에 공백이 있습니다.

나에 갈 수 있습으로 모든 버그가 수정에서 문자와에서 약 20 년의 개발이다.

을 사용할 때 varchar 값에 SQL 서버에 추가 행당 2 바이트를 저장하는 일부 정보에 대해 열면 사용하는 경우 char 그것은 필요가 없는 그렇지 않으면 당신

어떤 SQL 데이터베이스,VARCHAR 패딩됩니다 밖으로 그것의 최대 크기를 최적화하기 위해 오프셋,이것은 속도를 가득 표 검사 및 인덱스입니다.

이 때문에,당신은하지 않는 모든 공간 절약을 사용하여 VARCHAR(200)을 비교하는 CHAR(200)

사용 CHAR(NCHAR)VARCHAR(이며)제의 차이 방법으로 데이터베이스 서버에 데이터가 저장.첫 번째 소개 후행 공백;가 발생하는 문제로 그것을 사용할 때와 같은 운전자에서 SQL 서버 기능이 있다.그래서 나는 그것을 만들의 안전을 사용하여 VARCHAR(이며)니다.

는 경우,예를 들어,우리는 테이블 테스트(ID INT 상태 CHAR(1)), 고,함수를 작성하는 목록 모든 기록을 어떤 특정한 값이 다음과 같습니다.

CREATE FUNCTION List(@Status AS CHAR(1) = '')
RETURNS TABLE
AS
RETURN
SELECT * FROM TEST
WHERE Status LIKE '%' + @Status '%'

이 함수에서 우리가 기대하는 때에 넣어 우리는 우리의 기본 매개 변수는 기능이 반환됩니다 모든 행하지만,사실 그렇지 않습니다.변경@상태 데이터를 입력하 VARCHAR 면 문제가 해결됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top