Programing

SQLite에 부울 리터럴이 있습니까?

lottogame 2020. 12. 25. 08:57
반응형

SQLite에 부울 리터럴이 있습니까?


boolean 열 유형 에 대해 알고 있지만 SQLite에 boolean 리터럴 이 있습니까? 다른 언어에서는 true또는 일 수 있습니다 false. 분명히, 내가 사용 0하고 1,하지만 난 가능한 이른바 '매직 넘버 "를 회피하는 경향이있다.

에서 이 목록 은 SQLite는 다른 SQL 구현에 존재하지만,하지 않을 수도처럼 보인다. (저는 SQLite 3.6.10을 사용하고 있습니다.)


문서의 섹션 1.1 부울 데이터 유형 에서 :

SQLite에는 별도의 부울 저장소 클래스가 없습니다. 대신 부울 값은 정수 0 (거짓) 및 1 (참)로 저장됩니다.

그래서 당신은 01.


SQLite에 부울 리터럴이 있습니까?

Justin Ethier의 답변 에서 언급했듯이 SQLite에는 부울에 대한 특정 데이터 유형이 없습니다. 그러나 SQLite 3.23.0 부터는 true / false 리터럴을 지원합니다.

  1. TRUE와 FALSE를 상수로 인식합니다. (호환성을 위해 "true"또는 "false"라는 열이있는 경우 식별자는 부울 상수가 아닌 열을 참조합니다.)

  2. 지원 연산자는 TRUE, IS FALSE, IS NOT TRUE 및 IS NOT FALSE입니다.

SELECT true AS t, false AS f;

SELECT 'condition is true'
WHERE 1 IS NOT FALSE;

CREATE TABLE a (id INT, b BOOLEAN DEFAULT(TRUE));
INSERT INTO a(id) VALUES(100);
SELECT * FROM a;
-- id  b
-- 100 1

dbfiddle.com 데모


1.1 부울 데이터 유형

SQLite에는 별도의 부울 저장소 클래스가 없습니다. 대신 부울 값은 정수 0 (거짓) 및 1 (참)로 저장됩니다.

문서


질문이에 대해 명시 적으로하지 않습니다 열 유형 (즉, 스토리지 현명)하지만의 사용 TRUEFALSE같은 SQL-준수 리터럴 (즉 파서 현명한), PostgreSQL의 키워드 문서 당 발생 (에 또한 SQL-92, SQL을 포함 : 2008 및 SQL : 2011 열 참조).

SQLite 문서에는 지원되는 모든 키워드가 나열되어 있으며이 목록에는 TRUEnor 가 포함되어 있지 FALSE않으므로 슬프게도 SQLite는 그와 관련하여 호환 되지 않습니다 .

또한 쉽게 테스트 할 수 있으며 토큰이 열 이름이되기를 원할 때 구문 분석기가 어떻게 작동하는지 확인할 수 있습니다.

$ sqlite3 :memory:
SQLite version 3.14.0 2016-07-26 15:17:14
sqlite> CREATE TABLE foo (booleanish INT);
sqlite> INSERT INTO foo (booleanish) VALUES (TRUE);
Error: no such column: TRUE

부울 데이터 유형이 없습니다. 여기 에 나열된 5 가지 유형 만 있습니다 . 정수는 디스크에 다양한 너비로 저장할 수 있으며 가장 작은 것은 1 바이트입니다. 그러나 이것은 구현 세부 사항입니다.

"그러나 INTEGER 값이 디스크에서 읽혀지고 처리를 위해 메모리로 들어가 자마자 가장 일반적인 데이터 유형 (8 바이트 부호있는 정수)으로 변환됩니다."

따라서 부울 리터럴이 없다는 것은 놀라운 일이 아닙니다.


BOOLEAN테이블을 만들 때 사용할 수 있습니다 .

sqlite3 :memory:
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> CREATE TABLE test (mybool BOOLEAN);

그러나 이것은 실제 데이터 유형이 아니며 테이블의 SQL 설명에 다음과 같은 내용이 있습니다.

"mybool" BOOLEAN NOT NULL CHECK(mybool IN(0,1))

기본적으로 값이 0 또는 1이어야한다는 SQL 제약 제약 조건을 만듭니다. 따라서 TRUE / FALSE를 사용하면 오류가 발생합니다.

sqlite> INSERT INTO test(mybool) VALUES (TRUE);
Error: no such column: TRUE

따라서 키워드 BOOLEAN를 사용할 수 있지만 "실제"데이터 유형이 아니므로 0/1을 사용해야합니다.

sqlalchemy로 작업 할 때 문제없이 데이터 유형 BOOLEAN을 사용할 수 있습니다.


SQLite3에서 지원되는 데이터 유형은 5 개뿐입니다.

공식 SQLite3 문서에서. "SQLite 데이터베이스에 저장된 (또는 데이터베이스 엔진에 의해 조작되는) 각 값에는 다음 스토리지 클래스 중 하나가 있습니다.

NULL. The value is a NULL value.

INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value."

1과 0을 저장하려는 경우 SQLite는 스토리지 인 경우 1 바이트를 사용합니다. 나쁘지 않습니다. 공식 문서 링크 : - http://www.sqlite.org/datatype3.html


나는 안드로이드 용 sqlite에서 오류없이 부울 열 유형을 선언 할 수 있으며 잘 작동하는 것으로 나타났습니다. 또한 열을 'int'로 정의하고 Java 부울 값을 저장하려고했습니다. db를 다운로드하고 열에 "true"라고 쓰고 있음을 확인했습니다. 나는 그것이 작동한다고 생각합니다.


SQLite에는 부울 유형이 없으므로 0은 거짓이고 1은 참인 INTEGER를 사용해야합니다.


BOOLEAN -> NUMERIC (Affinity)

Column Affinity

SQLite supports the concept of type affinity on columns. Any column can still store any type of data but the preferred storage class for a column is called its affinity. Each table column in an SQLite3 database is assigned one of the following type affinities: Affinity Description

  • TEXT This column stores all data using storage classes NULL, TEXT or BLOB.
  • NUMERIC This column may contain values using all five storage classes.
  • INTEGER Behaves the same as a column with NUMERIC affinity with an exception in a CAST expression.
  • REAL Behaves like a column with NUMERIC affinity except that it forces integer values into floating point representation
  • NONE A column with affinity NONE does not prefer one storage class over another and no attempt is made to coerce data from one storage class into another.

Boolean Datatype:

SQLite does not have a separate Boolean storage class. Instead, Boolean values are stored as integers 0 (false) and 1 (true).

@moiing-duck "On the flip side, SQLite supports datetimes, despite not being one of those five types, so this answer is inconclusive"

SQLite does not have a storage class set aside for storing dates and/or times. Instead, the built-in Date And Time Functions of SQLite are capable of storing dates and times as TEXT, REAL, or INTEGER values:

ReferenceURL : https://stackoverflow.com/questions/2510652/is-there-a-boolean-literal-in-sqlite

반응형