복붙노트

[SQL] VARCHAR와 DATE / DATETIME을 사용하는 경우

SQL

VARCHAR와 DATE / DATETIME을 사용하는 경우

우리는 Freenode의에서이 프로그램 토론을했고이 질문에 내가이 형식으로 날짜 변수를 저장하는 VARCHAR (255)를 사용하려고 할 때 와서 : D / MM / YYYY. 그래서 질문은 그렇게 나쁘지 날짜를 저장하는 VARCHAR를 사용하는 이유입니다. 여기 장점은 다음과 같습니다 :

그래서 당신은 날짜를 저장하는 데 사용하는 것을 선호? SQL VARCHAR 또는 SQL DATE?

해결법

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

    1.이 작업에 적합한 도구가 아닙니다 때문에.

    이 작업에 적합한 도구가 아닙니다 때문에.

    VARCHAR를 버전의 단점 중 일부 :

    물론, 취미 프로젝트에 당신은 당신이 원하는 것을 할 수 있습니다. 전문적인 환경에서 나는 작업에 적합한 도구를 사용하여 주장하는 것입니다.

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

    2.이상의 2-3000000 행 데이터베이스를해야하는 경우가 VARCHAR보다 사용 DATETIME에 더 나은 이유를 알게 될 것입니다 :)

    이상의 2-3000000 행 데이터베이스를해야하는 경우가 VARCHAR보다 사용 DATETIME에 더 나은 이유를 알게 될 것입니다 :)

    전원을 처리하는 것은 더 이상 문제가되지 않습니다 - 간단한 대답은 데이터베이스와 있다는 것입니다. 그냥 데이터베이스 크기 때문에 하드 디스크의 탐색 시간이다.

    기본적으로 현대 harddisks 당신은이 임의의 순서 (보통의 경우) 당신은 DB 크기 때문에 최소화하기 위해 할 수있는 모든 작업을 수행해야하므로 읽을있어 두 번째 경우 / 100 개 레코드에 대한 읽을 수 있습니다 :

    결국은 HDD의 당신을 죽일 시간은 항상 시크입니다. 예. 디스크에 완료되면 있기 때문에 탐색 시간의 => RAM에서 수행 할 때 많은 행이 쿼리 BY 몇 가지 간단한 그룹은 초 커플에 비해 몇 시간이 걸릴 수 있습니다.

    VARCHAR이기 위해 당신은 어떤 검색을 수행 할 수 없습니다. 당신은 날짜와 SQL 상품의 너무 많이, 단지 32 비트 정수 분야에서 유닉스 타임 스탬프를 사용하는 방법 방법을 싫어합니다. 당신은 SQL 날짜 필드를 사용하여 모든 장점, 당신은 당신의 선택이 끝난 프로그래밍 언어가 아닌 SQL 함수를 사용하여 조작하고 형식 날짜해야합니다 (기본적으로)해야합니다.

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

    3.두 가지 이유 :

    두 가지 이유 :

    그럼 예를 들어 레코드 집합을 보자 그 다음과 같다 :

    5/12/1999 | Frank N Stein
    1/22/2005 | Drake U. La
    10/4/1962 | Goul Friend
    

    우리는 데이터를 당신의 방법을 저장할 수 있었지만, 결과 세트로 응답 주문 SQL 오름차순으로 날짜 기준으로 정렬하면 그 다음과 같다 :

    1/22/2005 | Drake U. La
    10/4/1962 | Goul Friend
    5/12/1999 | Frank N. Stein
    

    어디 우리가 DATETIME로 날짜를 저장하는 경우, SQL이처럼 주문이 제대로 응답 할 것입니다 :

    10/4/1962 | Goul Friend
    5/12/1999 | Frank N. Stein
    1/22/2005 | Drake U. La
    

    어딘가에 길을 다른 형식으로 날짜를 표시하는 데 필요한 경우 또한, YYYY-MM-DD와 같은 예를 들어, 당신은 혼합 내용으로 모든 데이터 또는 거래를 변환해야합니다. 그것이 SQL 날짜로 저장된하면 코드에서 변환을 강요하고, 가능성있는 모든 날짜 표시 형식을 변경 한 자리가 있습니다 - 무료입니다.

  4. ==============================

    4.날짜 DATE / DATETIME 및 VARCHAR 사이에 나는 DATE / DATETIME 매번 함께 갈 것입니다. 그러나이 세 번째 옵션을 간과있다. 정수로 저장 부호없는!

    날짜 DATE / DATETIME 및 VARCHAR 사이에 나는 DATE / DATETIME 매번 함께 갈 것입니다. 그러나이 세 번째 옵션을 간과있다. 정수로 저장 부호없는!

    나는 내 마지막 프로젝트에 부호없는 정수로 가기로 결정, 나는 정말 선택을 대신 DATE / DATETIME으로 저장 만족하고 있습니다. 나는 클라이언트와 서버 사이의 날짜를 따라 통과했기 때문에 그것은 나를 사용을위한 이상적인 유형을했다. 대신 날짜로 저장하는 데 내가 선택 할 때마다 다시 변환 할 필요없이, 그냥 선택하고 내가 원하는 그러나 그것을 사용할 수 있습니다. 당신은 당신이 FROM_UNIXTIME () 함수를 사용할 수있는 "사람이 읽을 수있는"날짜와 날짜를 선택합니다.

    DATETIME 8 바이트를 차지하면서 또한 정수는 4 바이트를 차지합니다. 50 %의 저장 용량을 절약.

    Berin가 제안하는 정렬 문제는 날짜의 저장소로 정수를 사용하여 해결된다.

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

    5.난 그냥 단순 / 일관성을 위해, 날짜 / 날짜 시간 유형을 사용하여 투표 것입니다.

    난 그냥 단순 / 일관성을 위해, 날짜 / 날짜 시간 유형을 사용하여 투표 것입니다.

    당신이 문자열로 저장 할 경우, ISO 8601 형식으로 저장 :

    무엇보다도, ISO 8601 날짜 / 시간 문자열 (A) 부씩 제대로, (B) (C), 사람이 읽을 수있는 로케일에 의존하지, 및 (D)는 다른 형식으로 쉽게 convertable되어 있습니다. 는 ISO의 추천 광고에서 침대에, ISO 8601 문자열 제공

    마지막으로 한가지는 : 당신이해야 할 모든 후, 날짜를 저장 숯불에 ISO 8601 약식 YYYYMMDD에 저장하는 경우 (8) 열은 날짜 시간 값보다 더 많은 저장을지지 않습니다 (그리고 당신에 대해 걱정할 필요가 없습니다 . 3 밀리 초 한 하루의 마지막 눈금 및 다음의 첫 번째 틱 사이의 격차하지만 그것은 또 다른 토론을위한 문제입니다 당신이 3 열로 그것을 깰 경우 -. YYYY 숯 (4), MM의 문자 (2), DD CHAR (2) 당신은 저장의 같은 양을 사용하고 인덱싱에 대한 더 많은 옵션을 얻을 것이다 더 좋은 YYYY에 대한 간단한과 필드 (4 바이트) 및 MM 및 DD 각각에 대한 TINYINT를 저장 -. 지금 "날짜는 6 바이트까지 재. 단점은 물론, 그 구성 부품에 날짜 성분을 분해하는 것은 복잡 적절한 날짜 / 시간 데이터 형식으로 변환하는 것이다.

  6. from https://stackoverflow.com/questions/4759012/when-to-use-varchar-and-date-datetime by cc-by-sa and MIT license