INT, INTEGER, SMALLINT 및 TINYINT와 같은 관련 SQLite 데이터 유형의 차이점은 무엇입니까?


101

SQLite3에서 테이블을 만들 때 비슷한 내용을 암시하는 모든 가능한 데이터 유형에 직면했을 때 혼란스러워서 다음 데이터 유형의 차이점을 누구든지 말할 수 있습니까?

INT, INTEGER, SMALLINT, TINYINT

DEC, DECIMAL

LONGCHAR, LONGVARCHAR

DATETIME, SMALLDATETIME

최소 / 최대를 나열하는 문서가 어딘가에 있습니까? 다양한 데이터 유형의 용량? 예를 들어, smallint.보다 큰 최대 값을 보유하고 tinyint있지만 정수보다 작은 값을 보유하고 있다고 생각 하지만 이러한 용량이 무엇인지 전혀 모릅니다.

답변:


95

SQLite, 기술적으로는 데이터 유형이없고 매니페스트 타이핑 시스템에 스토리지 클래스 가 있으며 예, 기존의 RDBMSes에 익숙하다면 혼란 스럽습니다 . 내부적으로 모든 것은 텍스트로 저장됩니다. 데이터 유형은 선호도 (열에 할당 된 데이터 유형)에 따라 다양한 저장 위치로 강제 변환 / 변환됩니다.

내가 추천하는 가장 좋은 방법은 다음과 같습니다.

  1. 독립형 데이터베이스 데이터 유형에 대해 알고 있던 모든 것을 일시적으로 잊어 버림

  2. SQLite사이트 에서 위의 링크를 읽으십시오 .

  3. 이전 스키마를 기반으로 유형을 가져 와서 매핑 할 내용을 확인합니다. SQLite

  4. 모든 데이터를 SQLite데이터베이스로 마이그레이션하십시오 .

참고 : 데이터 유형 제한은 특히 .NET에서 기간, 날짜 또는 그 특성을 추가하는 경우 복잡 할 수 있습니다 SQL. SQLite그런 종류의 내장 함수가 거의 없습니다. 그러나 라이브러리 함수를 SQLite통해 지속 시간과 그 특성을 추가하기위한 자체 내장 함수를 쉽게 만들 수있는 방법을 제공 sqlite3_create_function합니다. 기존 저장 프로 시저 대신 해당 기능을 사용합니다.


1
답장과 링크에 감사드립니다. 이것은 내가 기본 유형의 텍스트, 숫자, 정수, 실수, 없음을 고수해야 함을 의미합니까? 나에게 매우 제한적이며 특히 MSSQL, Foxpro 및 Oracle 배경에서 온 것 같습니다. 문안 인사.
Alan Harris-Reid

6
동의합니다. 처음에는 제한적인 것 같습니다. 그러나 SQLite는 선호도 시스템을 통해 데이터베이스에 데이터를 넣는 방법에 대해 매우 관대하다는 것을 알게 될 것입니다. SQLite는 독립형이 아닙니다. 코드에서 데이터베이스 액세스 API를 통해서만 액세스 할 수 있도록 소규모 애플리케이션에 배치하는 작은 데이터베이스 백엔드로 설계되었습니다. SQLite에서 문제를 해결하는 것은 일반적으로 그들이 원하는 방식을 파악하는 문제입니다.
J. Polfer 2010 년

나는 기본 유형을 고수합니다.
J. Polfer 2010 년

4
@Alan : 숫자 선호도 열을 DATE또는 로 선언하는 것이 유용 할 수 BOOLEAN있지만 다른 크기의 정수를 구분하는 데 신경 쓰지 않습니다. 이것은 INTEGER PRIMARY KEY정확한 유형 이름이 중요한 경우 의 경우 특히 그렇습니다 .
dan04

"모든 것이 텍스트로 저장됩니다"는 sqlite.org/fileformat.html 에 따르면 잘못된 것 같습니다. sqlite.org/fileformat.html 에서 숫자는 컴팩트 한 varint / float64로 저장되고 blob과 텍스트 만 문자열로 저장됩니다
phiresky

47

차이점은 통사론 적 설탕입니다. 유형 선호도와 관련하여 유형 이름의 일부 하위 문자열 만 중요합니다.

  • INT, INTEGER, SMALLINT, TINYINT → INTEGER 선호도는 모두 "INT"를 포함하기 때문입니다.
  • LONGCHAR, LONGVARCHAR → TEXT 유사성. "CHAR"를 포함하기 때문입니다.
  • DEC, DECIMAL, DATETIME, SMALLDATETIME → NUMERIC. 중요한 하위 문자열을 포함하지 않기 때문입니다.

선호도를 결정하는 규칙은 SQLite 사이트에 나열되어 있습니다 .

엄격한 타이핑 을 고집 한다면 CHECK제약 조건으로 구현할 수 있습니다 .

CREATE TABLE T (
   N   INTEGER CHECK(TYPEOF(N) = 'integer'),
   Str TEXT CHECK(TYPEOF(Str) = 'text'),
   Dt  DATETIME CHECK(JULIANDAY(Dt) IS NOT NULL)
);

그러나 나는 그것에 대해 결코 신경 쓰지 않습니다.

각 유형의 용량 :

  • INTEGER항상 64 비트로 서명됩니다. SQLite는 뒤에서 작은 정수 의 저장 을 최적화 하므로 TINYINT는 어쨌든 유용하지 않습니다.
  • REAL항상 64 비트 ( double)입니다.
  • TEXTBLOB최대 크기 1,000,000,000 바이트 전처리 매크로 의해 결정된 기본값.

1
좋은 속임수. 이 접근 방식 에는 .NET 의 스토리지 클래스와 동일한 스토리지 클래스를 갖기 위해 삽입 / 업데이트 할 값 이 필요 합니다 TYPEOF. 따라서 SQlite에 의해 NUMERIC / INTEGER 스토리지 클래스로 변환 될 TEXT를 삽입하려는 시도 는 실패합니다 (즉, 이러한 변환은 sqlite.org/datatype3.html#affinity에 따라 무손실 ). 즉,이 접근 방식은 값을 삽입 한 다음 SQLite에서 해당 값을 저장하는 데 사용되는 스토리지 클래스를 마술처럼 검증하는 임시 접근 방식보다 더 엄격 합니다. 더 관대 한 접근 방식은 아래 내 대답을 참조하십시오.
eold

10

대부분은 호환성을 위해 존재합니다. 실제로 정수, 부동 소수점, 텍스트 및 얼룩 만 있습니다. 날짜는 숫자 (unix 시간은 정수, Microsoft 시간은 부동 소수점) 또는 텍스트로 저장할 수 있습니다.


궁극적으로 모든 것이 결국 html 페이지에 텍스트가되는 웹 기반 프로젝트에 사용했습니다. 나는 많은 데이터 변환을 생략하고 대부분의 열에 텍스트를 사용했습니다. 잘 됐어요.
Jay는

3

NULL. 값이 NULL 값입니다.

INTEGER. 값은 값의 크기에 따라 1, 2, 3, 4, 6 또는 8 바이트에 저장되는 부호있는 정수입니다.

REAL. 값은 8 바이트 IEEE 부동 소수점 숫자로 저장되는 부동 소수점 값입니다.

TEXT. 값은 데이터베이스 인코딩 (UTF-8, UTF-16BE 또는 UTF-16LE)을 사용하여 저장된 텍스트 문자열입니다.

BLOB. 값은 입력 된대로 정확하게 저장된 데이터의 한 덩어리입니다.


1

dan04의 답변에 추가로 a로 NUMERIC표시되는 0이 아닌 다른 것을 맹목적으로 삽입하려는 경우 TEXT텍스트 를 숫자 로 변환 할 수 있는지 확인하십시오 .

your_numeric_col NUMERIC CHECK(abs(your_numeric_col) <> 0)

일반적인 사용 사례는 모든 데이터를 텍스트로 처리하는 프로그램의 쿼리에 있습니다 (SQLite는 이미 그렇게하고 있으므로 균일 성과 단순성을 위해). 이것에 대한 좋은 점은 다음과 같은 구조를 허용한다는 것입니다.

INSERT INTO table (..., your_numeric_column, ...) VALUES (..., some_string, ...)

0이 아닌 숫자 필드를 특별히 처리 할 필요가 없기 때문에 자리 표시자를 사용하는 경우 편리합니다. Python sqlite3모듈을 사용하는 예 는 다음과 같습니다.

conn_or_cursor.execute(
    "INSERT INTO table VALUES (" + ",".join("?" * num_values) + ")",   
    str_value_tuple)  # no need to convert some from str to int/float

위의 예에서의 모든 값은 str_value_tupleSQlite에 전달 될 때 이스케이프되고 문자열로 인용됩니다. 그러나 우리는 명시 적으로 유형을 확인하지 않고 type 로의 변환TYPEOF 만 확인 하기 때문에 원하는대로 작동합니다 (즉, SQLite는 숫자로 저장하거나 그렇지 않으면 실패합니다).

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