복붙노트

[SQL] SQL VARCHAR 컬럼 길이에 대한 모범 사례 [마감]

SQL

SQL VARCHAR 컬럼 길이에 대한 모범 사례 [마감]

길이에 대한 최고의 가치 무엇 : 때마다 새로운 SQL 테이블을 설정하거나 기존 테이블에 새 VARCHAR 열을 추가하고, 나는 한 가지를 궁금해하고있다.

그래서, 당신은 varchar 형의 이름라는 열이 말할 수 있습니다. 그래서, 당신은 길이를 선택해야합니다. 나는 이름> 20 개 문자 생각할 수 없다,하지만 당신은 결코 알지 못할 것이다. 하지만 그 대신 20을 사용하여, 나는 다음 2 ^ n은 수 항상 라운드까지. 이 경우, 나는 길이 32을 선택합니다. 나는 다른 번호보다 나에게조차 수 2 ^ n은 외모 더 때문에보기의 컴퓨터 과학자 점에서, 그렇게하고 난 그냥 아키텍처 아래 다른 사람보다 약간 더 나은 그 숫자를 처리 할 수 ​​있으리라 믿고있어.

당신이 VARCHAR 열을 만들도록 선택할 때 다른 한편으로는, 예를 들어, MSSQL 서버, 50 기본 길이 값을 설정합니다. 즉 내가 그것에 대해 생각합니다. 왜 50? 그냥 임의의 숫자, 또는 평균 컬럼 길이, 또는 내용에 따라?

아마 또는 - - 또한 될 수있는 다른 SQL 서버 구현 (MySQL은, MSSQL, 포스트 그레스 같은 ...) 다른 최적의 열 길이 값이 있습니다.

해결법

  1. ==============================

    1.아니 DBMS 나는 2 ^ N 길이의 VARCHAR를 만들 것입니다 어떤 "최적화"가의 2의 거듭 제곱이 아닌 최대 길이가 더 나은 것보다 수행 알고있다.

    아니 DBMS 나는 2 ^ N 길이의 VARCHAR를 만들 것입니다 어떤 "최적화"가의 2의 거듭 제곱이 아닌 최대 길이가 더 나은 것보다 수행 알고있다.

    나는 일찍 SQL Server 버전이 실제로 길이 255 다르게보다 최대 길이 하나에 VARCHAR를 처리 생각합니다. 이 여전히 경우인지 모르겠어요.

    거의 모든 DBMS를 들어, 요구되는 실제의 기억은 당신이 그것을 넣어 문자의 수에 의해 결정됩니다 아닌 최대 길이는 당신이 정의합니다. 그래서보기 (및뿐만 아니라 대부분의 아마 성능 하나)의 저장 지점에서, 당신은 VARCHAR (100) 또는 VARCHAR (500)로 컬럼을 선언 여부를 어떤 차이를하지 않습니다.

    당신은 제약 조건 (또는 비즈니스 규칙)의 일종으로 VARCHAR 열에 대해 제공되는 최대 길이보다는 기술적 / 물리적 것을 볼 수 있습니다.

    PostgreSQL를위한 최상의 설정은 길이 제한 및 제한 문자의 수를 무엇에 귀하의 비즈니스에 필요한 점검 제한 조건없이 텍스트를 사용하는 것입니다.

    그 요구 사항이 변경되면, 점검 제한 조건을 변경하는 것은 훨씬 더 빨리 (테이블이 재 작성 할 필요가 없기 때문에) 테이블을 변경보다

    같은 오라클과 다른 사람을 위해 적용 할 수 있습니다 - 오라클 대신하지만 텍스트의 VARCHAR (4000) 일 것이다.

    VARCHAR (최대)와, 예를 들어 사이에 물리적 스토리지 차이가 ​​나도 몰라 SQL 서버에서 VARCHAR (500). VARCHAR (8000)에 비해 VARCHAR (최대)를 사용하지만 분명히 성능에 영향이있다.

    (주석으로 어윈 Brandstetter에 의해 게시)이 링크를 참조하십시오

    편집 2013년 9월 22일

    bigown의 의견에 대해서 :

    포스트 그레스에서 버전은 전체 테이블을 다시 않은 열 정의에 대한 변경 (I 초기 답을 쓸 때 사용할 수 없음) 9.2,보기 전에 예를 들어, 여기. 9.2 이후이 120 만 개 행이 테이블에 대한 열 크기를 증가 참으로 0.5 초 걸린 경우 및 확인 빠른 테스트는 더 이상 없습니다.

    Oracle의 경우이는 큰 테이블의 VARCHAR 컬럼을 변경하는 데 걸리는 시간에 의해 판단뿐만 아니라 사실로 보인다. 그러나 나는 그에 대한 참조를 찾을 수 없습니다.

    MySQL을위한 매뉴얼은 "대부분의 경우, ALTER TABLE은 원본 테이블의 임시 복사본을 만듭니다"말했다. 120 만 행 (포스트 그레스와 내 테스트와 동일)와 함께 테이블에 ALTER TABLE을 실행하면 열 크기는 1.5 분이 소요 증가 : 그리고 내 자신의 테스트를 확인합니다. MySQL의에서 그러나 당신은 컬럼의 문자 수를 제한하는 점검 제한 조건을 사용하려면 "해결 방법"을 사용할 수 없습니다.

    SQL 서버 나는이에 대한 명확한 진술하지만, VARCHAR 컬럼의 크기를 증가 실행 시간을 찾을 수 없습니다를 들어 (다시 위에서 120 만 행 테이블)에는 재 작성이 발생하지 않음을 나타냅니다.

    편집 2017년 1월 24일

    내가 SQL Server에 대한 (적어도 부분적으로) 틀린 것 같습니다. NVARCHAR 또는 VARCHAR 컬럼의 선언 된 길이가 성능 큰 차이가 있음을 나타냅니다 것을 아론 버트 랜드에서이 답변을 참조하십시오.

  2. ==============================

    2.VARCHAR (255) 및 VARCHAR (2)는 디스크 공간이 똑같은 양을! 당신이 작게에 대한 특정 요구가있는 경우 제한 할 수있는 유일한 이유는 그래서입니다. 그렇지 않으면 그들에게 모든 255을합니다.

    VARCHAR (255) 및 VARCHAR (2)는 디스크 공간이 똑같은 양을! 당신이 작게에 대한 특정 요구가있는 경우 제한 할 수있는 유일한 이유는 그래서입니다. 그렇지 않으면 그들에게 모든 255을합니다.

    그 성능을 상처 그렇다면, 더 많은 공간을 차지 할 정렬, 큰 열을 수행 할 때 특히, 당신은 그것에 대해 걱정할 필요하고 작게. 당신이 오직 그 테이블에서 한 행을 선택한다면, 당신은 그들 모두 255을 만들 수 있으며, 그것은 문제가되지 않습니다.

    참조 : MySQL을위한 최적의 VARCHAR 크기는 무엇입니까?

  3. ==============================

    3.나는 새로운 SQL 테이블을 설정할 때마다 나는 같은 방법 ^ N 더 ", 심지어"되는 2에 대한 느낌 ...하지만 여기에 대한 답변을 요약하면, 저장 공간에 더 큰 영향 단순히 VARCHAR를 정의하여이 없다 (2 ^ N) 또는 VARCHAR (MAX).

    나는 새로운 SQL 테이블을 설정할 때마다 나는 같은 방법 ^ N 더 ", 심지어"되는 2에 대한 느낌 ...하지만 여기에 대한 답변을 요약하면, 저장 공간에 더 큰 영향 단순히 VARCHAR를 정의하여이 없다 (2 ^ N) 또는 VARCHAR (MAX).

    즉 높은 VARCHAR () 제한을 설정할 때 여전히 스토리지 및 성능에 잠재적 인 영향을 예상해야했다. 예를 들어, 당신이 전체 텍스트 인덱싱 홀드 제품 설명에 VARCHAR (MAX) 열을 만드는 가정 해 봅시다. 설명의 99 %가 500 문자 인 경우 긴 후 갑자기을 대체이 위키 피 디아 기사와 설명, 당신은 예상치 못한 중대한 저장 및 성능 히트를 알 수 있습니다 말했다 누군가를 얻을.

    또 다른 것은 빌 Karwin에서 고려해야 할

    기본적으로, 단지 약간 큰 크기에 합리적인 비즈니스 제약 및 오류 마련. @onedaywhen가 지적한 바와 같이, 영국에서 가족의 이름은 일반적으로 1-35 문자 사이입니다. 당신이 만들하기로 결정하는 경우가의 긴 666 자까지로 말했다 당신이이 사람의 가족의 이름을 저장하지 않는 한, 당신은 정말 ... 상처 아무것도하지 않을거야 (64) VARCHAR. 이 경우, 어쩌면 VARCHAR (1028) 더 의미가 있습니다.

    그리고 경우에 여기에 2 ^ (10)가 채워진 경우처럼 보일 수 2 ^ 5를 통해 VARCHAR 무엇, 도움 :

    varchar(32)     Lorem ipsum dolor sit amet amet.
    
    varchar(64)     Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donecie
    
    varchar(128)    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donecie
                    vestibulum massa. Nullam dignissim elementum molestie. Vehiculas
    
    varchar(256)    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donecie
                    vestibulum massa. Nullam dignissim elementum molestie. Vehiculas
                    velit metus, sit amet tristique purus condimentum eleifend. Quis
                    que mollis magna vel massa malesuada bibendum. Proinde tincidunt
    
    varchar(512)    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donecie
                    vestibulum massa. Nullam dignissim elementum molestie. Vehiculas
                    velit metus, sit amet tristique purus condimentum eleifend. Quis
                    que mollis magna vel massa malesuada bibendum. Proinde tincidunt
                    dolor tellus, sit amet porta neque varius vitae. Seduse molestie
                    lacus id lacinia tempus. Vestibulum accumsan facilisis lorem, et
                    mollis diam pretium gravida. In facilisis vitae tortor id vulput
                    ate. Proin ornare arcu in sollicitudin pharetra. Crasti molestie
    
    varchar(1024)   Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donecie
                    vestibulum massa. Nullam dignissim elementum molestie. Vehiculas
                    velit metus, sit amet tristique purus condimentum eleifend. Quis
                    que mollis magna vel massa malesuada bibendum. Proinde tincidunt
                    dolor tellus, sit amet porta neque varius vitae. Seduse molestie
                    lacus id lacinia tempus. Vestibulum accumsan facilisis lorem, et
                    mollis diam pretium gravida. In facilisis vitae tortor id vulput
                    ate. Proin ornare arcu in sollicitudin pharetra. Crasti molestie
                    dapibus leo lobortis eleifend. Vivamus vitae diam turpis. Vivamu
                    nec tristique magna, vel tincidunt diam. Maecenas elementum semi
                    quam. In ut est porttitor, sagittis nulla id, fermentum turpist.
                    Curabitur pretium nibh a imperdiet cursus. Sed at vulputate este
                    proin fermentum pretium justo, ac malesuada eros et Pellentesque
                    vulputate hendrerit molestie. Aenean imperdiet a enim at finibus
                    fusce ut ullamcorper risus, a cursus massa. Nunc non dapibus vel
                    Lorem ipsum dolor sit amet, consectetur Praesent ut ultrices sit
    
  4. ==============================

    4.최고 값은 오른쪽 하부 영역에 정의 된 데이터이다이다.

    최고 값은 오른쪽 하부 영역에 정의 된 데이터이다이다.

    다른 도메인은 VARCHAR (255) 최선의 선택이 될 수있는 몇 가지 도메인의 경우, VARCHAR (10), 이름 속성에 대한 권리입니다.

  5. ==============================

    5.a_horse_with_no_name의 대답에 추가하면 관심있는 다음을 찾을 수 있습니다 ...

    a_horse_with_no_name의 대답에 추가하면 관심있는 다음을 찾을 수 있습니다 ...

    -- try to create a table with max varchar length
    drop table if exists foo;
    create table foo(name varchar(65535) not null)engine=innodb;
    
    MySQL Database Error: Row size too large.
    
    -- try to create a table with max varchar length - 2 bytes for the length
    drop table if exists foo;
    create table foo(name varchar(65533) not null)engine=innodb;
    
    Executed Successfully
    
    -- try to create a table with max varchar length with nullable field
    drop table if exists foo;
    create table foo(name varchar(65533))engine=innodb;
    
    MySQL Database Error: Row size too large.
    
    -- try to create a table with max varchar length with nullable field
    drop table if exists foo;
    create table foo(name varchar(65532))engine=innodb;
    
    Executed Successfully
    

    그나마 길이 바이트 (들) 그래서 널 (NULL) 바이트를 잊지 :

    100 개 문자까지 + 이름 varchar (100) NOT NULL 1 바이트 (길이) 것 (라틴)

    이름 varchar (500) 널 (null)이 500 개 문자까지 + 2 바이트 (길이)입니다하지 (라틴)

    이름 varchar (65533)는 널 (null)는 2 바이트 65533 개 문자까지 + (길이)입니다하지 (라틴)

    이름 varchar (65532)는 65,532 문자까지 + 2 바이트 (길이) 것 (라틴) + 1 널 바이트

    도움이 되었기를 바랍니다 :)

  6. ==============================

    6.항상 비즈니스 도메인 전문가에게 문의하십시오. 업계 표준에 대한 그 당신이라면보기. 예를 들어, 문제의 도메인이 영국 사업을 위해 다음 자연인의 가족 이름 (성을)이면 나는 사람이 정보에 대한 영국 Govtalk 데이터 표준 카탈로그에 가서 가족 이름은 1 ~ 35 자 것이라는 점을 발견 할 것 .

    항상 비즈니스 도메인 전문가에게 문의하십시오. 업계 표준에 대한 그 당신이라면보기. 예를 들어, 문제의 도메인이 영국 사업을 위해 다음 자연인의 가족 이름 (성을)이면 나는 사람이 정보에 대한 영국 Govtalk 데이터 표준 카탈로그에 가서 가족 이름은 1 ~ 35 자 것이라는 점을 발견 할 것 .

  7. ==============================

    7.나는 최근에이 문제를 확인하지 않은,하지만 난 JDBC 드라이버가 결과 집합오고 다시 개최 쿼리를 실행하는 동안 메모리 청크를 예약 할 것이라고 오라클과 과거에 알고있다. 메모리 청크의 크기는 열 정의에 의존하여 크기를 가져. 그래서 VARCHAR2 컬럼의 길이는 예약 된 메모리의 양에 영향을 미친다. 년 전에 나를 위해이 발생하는 심각한 성능 문제는 우리가 항상 사용 VARCHAR2 (4000) (시 최대)과 가비지 컬렉션으로 훨씬 효율적으로 오늘보다이었다.

    나는 최근에이 문제를 확인하지 않은,하지만 난 JDBC 드라이버가 결과 집합오고 다시 개최 쿼리를 실행하는 동안 메모리 청크를 예약 할 것이라고 오라클과 과거에 알고있다. 메모리 청크의 크기는 열 정의에 의존하여 크기를 가져. 그래서 VARCHAR2 컬럼의 길이는 예약 된 메모리의 양에 영향을 미친다. 년 전에 나를 위해이 발생하는 심각한 성능 문제는 우리가 항상 사용 VARCHAR2 (4000) (시 최대)과 가비지 컬렉션으로 훨씬 효율적으로 오늘보다이었다.

  8. ==============================

    8.어떤 의미에서 당신은 2 ^ 8 자 여전히 바이트의 데이터로 등록합니다보다 아무것도 낮출 수 있지만, 맞아.

    어떤 의미에서 당신은 2 ^ 8 자 여전히 바이트의 데이터로 등록합니다보다 아무것도 낮출 수 있지만, 맞아.

    당신이 기본 문자를 고려하면 그 공간의 동일한 금액을 소비로 VARCHAR <255 잎 아무것도.

    당신이 특히 과도한 입력을 축소하고자하지 않는 한 (255)는 좋은 기본 정의입니다.

  9. from https://stackoverflow.com/questions/8295131/best-practices-for-sql-varchar-column-length by cc-by-sa and MIT license