데이터 유형 지원

대부분의 SQL 데이터베이스와 달리 Adobe AIR SQL 데이터베이스 엔진에는 테이블 열에 특정 유형의 값이 들어 있어야 한다는 제한 사항이 없습니다. 대신 런타임에서 저장소 클래스와 열 선호도라는 두 가지 개념을 사용하여 데이터 유형을 제어합니다. 이 단원에서는 저장소 클래스와 열 선호도에 대해 설명하고 다양한 조건에서 데이터 유형의 차이가 해결되는 방식을 보여 줍니다.

저장소 클래스

저장소 클래스는 데이터베이스에서 값을 저장하는 데 사용되는 실제 데이터 유형을 나타냅니다. 다음은 데이터베이스에서 사용되는 저장소 클래스입니다.

NULL
값이 NULL 값입니다.

INTEGER
값이 부호 있는 정수입니다.

REAL
값이 부동 소수점 숫자 값입니다.

TEXT
값이 텍스트 문자열(256MB로 제한)입니다.

BLOB
값이 BLOB(Binary Large Object)이라는 원시 이진 데이터(256MB로 제한)입니다.

SQL 명령문에 리터럴로 포함되어 데이터베이스에 제공되는 모든 값이나 매개 변수를 사용하여 미리 준비된 SQL 명령문에 바인딩된 값에 저장소 클래스가 할당된 후 SQL 명령문이 실행됩니다.

SQL 명령문에 포함된 리터럴에 할당되는 저장소 클래스는 작은따옴표나 큰따옴표로 묶인 경우 TEXT, 리터럴이 따옴표로 묶이지 않았으며 소수점 또는 지수가 없는 숫자로 지정된 경우 INTEGER, 리터럴이 따옴표로 묶이지 않았으며 소수점 또는 지수가 있는 숫자이면 REAL, 값이 NULL이면 NULL입니다. 저장소 클래스가 BLOB인 리터럴은 X'ABCD' 표기법을 사용하여 지정합니다. 자세한 내용은 표현식의 리터럴 값을 참조하십시오.

SQLStatement.parameters 연결 배열을 사용하여 매개 변수로 제공된 값에는 바인딩된 고유 데이터 유형에 가장 가까운 저장소 클래스가 할당됩니다. 예를 들어 int 값은 INTEGER 저장소 클래스로 바인딩되고, Number 값에는 REAL 저장소 클래스가 지정되고, String 값에는 TEXT 저장소 클래스가 지정되고, ByteArray 객체에는 BLOB 저장소 클래스가 지정됩니다.

열 선호도

열의 선호도는 해당 열에 저장되는 데이터의 권장 유형입니다. INSERT 또는 UPDATE 문을 통해 값이 열에 저장되면 런타임에서 값을 원래 데이터 유형에서 지정된 선호도로 변환하려고 합니다. 예를 들어 ActionScript 또는 JavaScript Date 인스턴스인 Date 값을 선호도가 TEXT인 열에 삽입하면 Date 값이 String 표현으로 변환된 후 데이터베이스에 저장됩니다. 이는 객체의 toString() 메서드를 호출하는 것과 같습니다. 값을 지정된 선호도로 변환할 수 없으면 오류가 발생하고 작업이 수행되지 않습니다. SELECT 문을 사용하여 데이터베이스에서 검색한 값은 선호도에 해당하는 클래스의 인스턴스로 반환됩니다. 이는 해당 값이 다른 데이터 유형에서 변환되어 저장되었는지 여부와 관계가 없습니다.

열에 NULL 값을 사용할 수 있으면 ActionScript 또는 JavaScript 값인 null을 매개 변수 값으로 사용하여 열에 NULL을 저장할 수 있습니다. SELECT 문에서 NULL 저장소 클래스 값이 검색되면 이 값은 열의 선호도에 관계없이 항상 ActionScript 또는 JavaScript 값인 null로 반환됩니다. 열에 NULL 값을 사용할 수 있는 경우 항상 해당 열에서 검색된 값이 null인지 확인한 후 값을 Number 또는 Boolean 등의 nullable이 아닌 유형으로 변환해야 합니다.

데이터베이스의 각 열에는 다음과 같은 유형 선호도 중 하나가 할당됩니다.

  • TEXT 또는 STRING

  • NUMERIC

  • INTEGER 또는 int

  • REAL 또는 NUMBER

  • 부울

  • DATE

  • XML

  • XMLLIST

  • Object

  • NONE

TEXT 또는 STRING

선호도가 TEXT 또는 STRING인 열은 저장소 클래스 NULL, TEXT 또는 BLOB을 사용하여 모든 데이터를 저장합니다. 선호도가 TEXT인 열에 숫자 데이터를 삽입하면 숫자 데이터가 텍스트로 변환된 후 저장됩니다.

NUMERIC

선호도가 NUMERIC인 열은 저장소 클래스 NULL, REAL 또는 INTEGER를 사용하여 값을 저장합니다. NUMERIC 열에 텍스트 데이터를 삽입하면 텍스트 데이터를 정수나 실수로 변환한 후 저장합니다. 변환에 성공하면 INTEGER 또는 REAL 저장소 클래스를 사용하여 값이 저장됩니다. 예를 들어 '10.05' 값은 REAL 저장소 클래스로 변환된 후 저장됩니다. 변환할 수 없으면 오류가 발생하며 NULL 값으로 변환되지는 않습니다. NUMERIC 열에서 검색된 값은 해당 값에 맞는 가장 구체적인 숫자 유형의 인스턴스로 반환됩니다. 즉, 값이 양의 정수이거나 0이면 uint 인스턴스로 반환됩니다. 음의 정수이면 int 인스턴스로 반환됩니다. 마지막으로 값이 정수가 아니고 부동 소수점 구성 요소가 있으면 Number 인스턴스로 반환됩니다.

INTEGER 또는 int

INTEGER 선호도를 사용하는 열의 비헤이비어는 선호도가 NUMERIC인 열과 같지만 한 가지 예외가 있습니다. 저장할 값이 부동 소수점 구성 요소가 없는 Number 인스턴스 등의 실수이거나 부동 소수점 구성 요소가 없는 실수로 변환될 수 있는 텍스트 값이면 값이 정수로 변환되고 INTEGER 저장소 클래스를 사용하여 저장됩니다. 부동 소수점 구성 요소가 있는 실수를 저장하려고 하면 오류가 발생합니다.

REAL 또는 NUMBER

선호도가 REAL 또는 NUMBER인 열의 비헤이비어는 선호도가 NUMERIC인 열과 같지만 정수 값을 부동 소수점 표현으로 나타낸다는 점이 다릅니다. REAL 열의 값은 데이터베이스에서 항상 Number 인스턴스로 반환됩니다.

BOOLEAN

선호도가 BOOLEAN인 열은 true 또는 false 값을 저장합니다. BOOLEAN 열은 ActionScript 또는 JavaScript Boolean 인스턴스인 값을 받아들입니다. 코드에서 String 값을 저장하려고 하면 길이가 0보다 큰 String은 true로, 빈 String은 false로 간주됩니다. 코드에서 숫자 데이터를 저장하려고 하면 0이 아닌 값은 true로, 0은 false로 간주됩니다. SELECT 문을 사용하여 검색한 부울 값은 Boolean 인스턴스로 반환됩니다. NULL이 아닌 값은 INTEGER 저장소 클래스(false는 0, true는 1)를 사용하여 저장되고 데이터를 검색할 때 Boolean 객체로 변환됩니다.

DATE

선호도가 DATE인 열은 날짜 및 시간 값을 저장합니다. DATE 열은 ActionScript 또는 JavaScript Date 인스턴스인 값을 받아들이도록 설계되었습니다. DATE 열에 String 값을 저장하려고 하면 런타임에서 값을 Julian 날짜로 변환하려고 합니다. 변환에 실패하면 오류가 발생합니다. 코드에서 Number, int 또는 uint 값을 저장하려고 하면 데이터의 유효성이 검사되지 않고 값이 유효한 Julian 날짜 값으로 간주됩니다. SELECT 문을 사용하여 검색한 DATE 값은 자동으로 Date 인스턴스로 변환됩니다. DATE 값은 REAL 저장소 클래스를 사용하여 Julian 날짜 값으로 저장되므로 정상적으로 정렬 및 비교할 수 있습니다.

XML 또는 XMLList

XML 또는 XMLLIST 선호도를 사용하는 열은 XML 구조를 저장합니다. 코드에서 SQLStatement 매개 변수를 사용하여 XML 열에 데이터를 저장하려고 하면 런타임에서 ActionScript XML() 또는 XMLList() 함수를 사용하여 값을 변환하고 유효성을 검사합니다. 값을 유효한 XML로 변환할 수 없으면 오류가 발생합니다. INSERT INTO (col1) VALUES ('Invalid XML (no closing tag)')와 같이 리터럴 SQL 텍스트 값이 사용된 데이터를 저장하려고 하면 값이 파싱되거나 유효성이 검사되지 않고 올바른 형식으로 간주됩니다. 잘못된 값이 저장된 경우 값을 검색하면 빈 XML 객체가 반환됩니다. XML 및 XMLList 데이터는 TEXT 저장소 클래스나 NULL 저장소 클래스를 사용하여 저장됩니다.

Object

선호도가 OBJECT인 열은 ActionScript 또는 JavaScript의 복잡한 객체를 저장합니다. 여기에는 Object 클래스 인스턴스뿐 아니라 Array 인스턴스 등의 Object 하위 클래스 인스턴스 및 사용자 정의 클래스 인스턴스가 포함됩니다. OBJECT 열 데이터는 AMF3 형식으로 직렬화되며 BLOB 저장소 클래스를 사용하여 저장됩니다. 값을 검색하면 값이 AMF3에서 비직렬화되어 저장된 클래스의 인스턴스로 반환됩니다. 특히 표시 객체를 비롯한 일부 ActionScript 클래스는 원래 데이터 유형의 인스턴스로 비직렬화할 수 없습니다. 사용자 정의 클래스 인스턴스를 저장하기 전에 flash.net.registerClassAlias() 메서드를 사용하거나 Flex에서 클래스 선언에 [RemoteObject] 메타데이터를 추가하여 클래스의 별칭을 등록해야 합니다. 또한 데이터를 검색하기 전에 클래스의 같은 별칭을 등록해야 합니다. 클래스를 근본적으로 비직렬화할 수 없거나 클래스 별칭이 누락되었거나 불일치하여 데이터를 제대로 비직렬화할 수 없으면 데이터가 익명 객체(Object 클래스 인스턴스)로 반환되며 해당 속성 및 값은 저장된 원래 인스턴스와 일치합니다.

NONE

선호도가 NONE인 열은 특정 저장소 클래스를 선호하지 않습니다. 데이터는 변환되지 않고 그대로 삽입됩니다.

선호도 결정

열의 선호도는 CREATE TABLE 문에서 열에 선언된 유형에 따라 결정됩니다. 유형을 결정할 때는 대/소문자를 구별하지 않으며 다음과 같은 규칙이 적용됩니다.

  • 열의 데이터 유형에 "CHAR", "CLOB", "STRI" 또는 "TEXT" 문자열이 들어 있으면 해당 열의 선호도는 TEXT/STRING입니다. VARCHAR 유형에는 "CHAR" 문자열이 들어 있으므로 TEXT 선호도가 할당됩니다.

  • 열의 데이터 유형에 "BLOB" 문자열이 들어 있거나 데이터 유형이 지정되지 않았으면 열의 선호도가 NONE입니다.

  • 열의 데이터 유형에 "XMLL" 문자열이 들어 있으면 열의 선호도가 XMLLIST입니다.

  • 데이터 유형이 "XML" 문자열이면 열의 선호도가 XML입니다.

  • 데이터 유형에 "OBJE" 문자열이 들어 있으면 열의 선호도가 OBJECT입니다.

  • 데이터 유형에 "BOOL" 문자열이 들어 있으면 열의 선호도가 BOOLEAN입니다.

  • 데이터 유형에 "DATE" 문자열이 들어 있으면 열의 선호도가 DATE입니다.

  • 데이터 유형에 "INT" 문자열("UINT" 포함)이 들어 있으면 INTEGER 선호도가 할당됩니다.

  • 열의 데이터 유형에 "REAL", "NUMB", "FLOA" 또는 "DOUB" 문자열이 들어 있으면 열의 선호도가 REAL/NUMBER입니다.

  • 어떠한 조건에도 맞지 않으면 선호도가 NUMERIC입니다.

  • CREATE TABLE t AS SELECT... 문을 사용하여 테이블을 만든 경우 모든 열에 데이터 유형이 지정되지 않으며 NONE 선호도가 지정됩니다.

데이터 유형과 비교 연산자

이항 비교 연산자인 =, <, <=, >= 및 !=, 집합 멤버 테스트 연산자인 IN, 삼항 비교 연산자인 BETWEEN이 지원됩니다. 이러한 연산자에 대한 자세한 내용은 연산자를 참조하십시오.

비교 결과는 비교되는 두 값의 저장소 클래스에 따라 다릅니다. 두 값을 비교할 때는 다음과 같은 규칙이 적용됩니다.

  • 저장소 클래스가 NULL인 값은 저장소 클래스가 NULL인 다른 값을 포함하여 다른 모든 값보다 작은 것으로 간주됩니다.

  • INTEGER 또는 REAL 값은 모든 TEXT 또는 BLOB 값보다 작습니다. INTEGER 또는 REAL을 다른 INTEGER 또는 REAL과 비교하면 숫자 비교가 수행됩니다.

  • TEXT 값은 BLOB 값보다 작습니다. 두 TEXT 값을 비교하면 이진 비교가 수행됩니다.

  • 두 BLOB 값을 비교하면 항상 이진 비교를 사용하여 결과가 판단됩니다.

삼항 연산자 BETWEEN은 항상 해당 이항 표현식으로 다시 변환됩니다. 예를 들어 BETWEEN b AND c는 >= b AND a <= c로 다시 변환되며, 이때 표현식을 평가하는 데 필요한 각 비교에서 a에 서로 다른 선호도가 적용될 수도 있습니다.

a IN (SELECT b ....)와 같은 유형의 표현식은 앞에서 이항 비교에 대해 설명한 세 가지 규칙에 따라 a = b와 비슷한 방식으로 처리됩니다. 예를 들어 b가 열 값이고 a가 표현식이면 b의 선호도가 a에 적용된 후 비교됩니다. a IN (x, y, z) 표현식은 a = +x OR a = +y OR a = +z로 다시 변환됩니다. IN 연산자 오른쪽에 있는 값(이 예제에서 x, y 및 z 값)은 열 값인 경우에도 표현식으로 간주됩니다. IN 연산자의 왼쪽에 있는 값이 열이면 해당 열의 선호도가 사용됩니다. 값이 표현식이면 변환이 수행되지 않습니다.

COLLATE 절을 사용하는 방법도 비교에 영향을 줍니다. 자세한 내용은 COLLATE를 참조하십시오.

데이터 유형과 수학 연산자

지원되는 각 수학 연산자인 *, /, %, + 및 -에서 각 피연산자에 숫자 선호도가 적용된 후 표현식이 평가됩니다. NUMERIC 저장소 클래스로 변환할 수 없는 피연산자가 있으면 표현식이 NULL로 평가됩니다.

|| 결합 연산자를 사용하면 각 피연산자가 TEXT 저장소 클래스로 변환된 후 표현식이 평가됩니다. TEXT 저장소 클래스로 변환할 수 없는 피연산자가 있으면 표현식의 결과가 NULL입니다. 피연산자의 값이 NULL이거나 TEXT가 아닌 저장소 클래스가 들어 있는 BLOB이면 값을 변환할 수 없는 이러한 상황이 나타날 수 있습니다.

데이터 유형과 정렬

ORDER BY 절을 사용하여 값을 정렬하면 저장소 클래스가 NULL인 값이 가장 먼저 옵니다. 이후에는 숫자 순서에 따라 정렬된 INTEGER 및 REAL 값이 온 다음 이진 순서나 지정된 데이터 정렬(BINARY 또는 NOCASE)에 따른 TEXT 값이 옵니다. 마지막으로 이진 순서에 따라 BLOB 값이 나옵니다. 정렬하기 전에 저장소 클래스가 변환되지 않습니다.

데이터 유형과 그룹화

GROUP BY 절을 사용하여 값을 그룹화할 때 저장소 클래스가 서로 다른 값은 고유한 것으로 간주됩니다. 예외적으로 INTEGER와 REAL 값은 숫자가 같으면 동일한 것으로 간주됩니다. GROUP BY 절의 결과로 값에 선호도가 적용되지 않습니다.

데이터 유형과 복합 SELECT 문

복합 SELECT 연산자인 UNION, INTERSECT 및 EXCEPT는 값을 암시적으로 비교합니다. 이러한 비교를 수행하기 전에 각 값에 선호도가 적용될 수 있습니다. 이 선호도(적용된 경우)는 복합 SELECT 결과 집합의 단일 열에 반환될 수 있는 모든 값에 적용됩니다. 해당 위치에 다른 종류의 표현식이 아닌 열 값이 있는 첫 번째 구성 요소 SELECT 문에서 반환하는 열의 선호도가 적용됩니다. 지정된 복합 SELECT 열에서 열 값을 반환하는 구성 요소 SELECT 문이 없으면 해당 열의 값을 비교하기 전에 선호도가 적용되지 않습니다.