SQLite3에서 테이블을 만들 때 비슷한 내용을 암시하는 모든 가능한 데이터 유형에 직면했을 때 혼란스러워서 다음 데이터 유형의 차이점을 누구든지 말할 수 있습니까?
INT, INTEGER, SMALLINT, TINYINT
DEC, DECIMAL
LONGCHAR, LONGVARCHAR
DATETIME, SMALLDATETIME
최소 / 최대를 나열하는 문서가 어딘가에 있습니까? 다양한 데이터 유형의 용량? 예를 들어, smallint
.보다 큰 최대 값을 보유하고 tinyint
있지만 정수보다 작은 값을 보유하고 있다고 생각 하지만 이러한 용량이 무엇인지 전혀 모릅니다.
답변
SQLite
, 기술적으로는 데이터 유형이없고 매니페스트 타이핑 시스템에 스토리지 클래스 가 있으며 예, 기존의 RDBMS
es에 익숙하다면 혼란 스럽습니다 . 내부적으로 모든 것은 텍스트로 저장됩니다. 데이터 유형은 선호도 (열에 할당 된 데이터 유형)에 따라 다양한 저장 위치로 강제 변환 / 변환됩니다.
내가 추천하는 가장 좋은 방법은 다음과 같습니다.
-
독립형 데이터베이스 데이터 유형에 대해 알고 있던 모든 것을 일시적으로 잊어 버림
-
SQLite
사이트 에서 위의 링크를 읽으십시오 . -
이전 스키마를 기반으로 유형을 가져 와서 매핑 할 내용을 확인합니다.
SQLite
-
모든 데이터를
SQLite
데이터베이스로 마이그레이션하십시오 .
참고 : 데이터 유형 제한은 특히 .NET에서 기간, 날짜 또는 그 특성을 추가하는 경우 복잡 할 수 있습니다 SQL
. SQLite
그런 종류의 내장 함수가 거의 없습니다. 그러나 라이브러리 함수를 SQLite
통해 지속 시간과 그 특성을 추가하기위한 자체 내장 함수를 쉽게 만들 수있는 방법을 제공 sqlite3_create_function
합니다. 기존 저장 프로 시저 대신 해당 기능을 사용합니다.
답변
차이점은 통사론 적 설탕입니다. 유형 선호도와 관련하여 유형 이름의 일부 하위 문자열 만 중요합니다.
- 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)
);
그러나 나는 그것에 대해 결코 신경 쓰지 않습니다.
각 유형의 용량 :
답변
대부분은 호환성을 위해 존재합니다. 실제로 정수, 부동 소수점, 텍스트 및 얼룩 만 있습니다. 날짜는 숫자 (unix 시간은 정수, Microsoft 시간은 부동 소수점) 또는 텍스트로 저장할 수 있습니다.
답변
NULL
. 값이 NULL 값입니다.
INTEGER
. 값은 값의 크기에 따라 1, 2, 3, 4, 6 또는 8 바이트에 저장되는 부호있는 정수입니다.
REAL
. 값은 8 바이트 IEEE 부동 소수점 숫자로 저장되는 부동 소수점 값입니다.
TEXT
. 값은 데이터베이스 인코딩 (UTF-8, UTF-16BE 또는 UTF-16LE)을 사용하여 저장된 텍스트 문자열입니다.
BLOB
. 값은 입력 된대로 정확하게 저장된 데이터의 한 덩어리입니다.
답변
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_tuple
SQlite에 전달 될 때 이스케이프되고 문자열로 인용됩니다. 그러나 우리는 명시 적으로 유형을 확인하지 않고 type 로의 변환TYPEOF
만 확인 하기 때문에 원하는대로 작동합니다 (즉, SQLite는 숫자로 저장하거나 그렇지 않으면 실패합니다).