SQLite3의 몇가지 특이한 점.

SQLite3은 일반적으로 우리가 알고 있는 데이터베이스와 다른 몇 가지 특징들을 가진다.

1. Manifest typing
    Manifest typing에서는 데이터 타입은 컬럼의 속성이 아닌 컬럼에 저장된 값 자체에 대한 속성이다. SQLite는 컬럼에 선언된 
    데이터 타입과 관계없이 다른 데이터 타입의 값을 저장하는 것을 허용한다.

    sqlite> CREATE TABLE tbl_test (One INTEGER, Two INTEGER);

    sqlite> INSERT INTO tbl_test VALUES (123, 456);  OK
    sqlite> INSERT INTO tbl_test VALUES (123, 456.7); OK
    sqlite> INSERT INTO tbl_test VALUES (123, 456.0); OK
    sqlite> INSERT INTO tbl_test VALUES (123, '456'); OK
    sqlite> INSERT INTO tbl_test VALUES (123, '456two'); OK
    sqlite> INSERT INTO tbl_test VALUES (123, 'ant'); OK
    sqlite> INSERT INTO tbl_test VALUES (123, ant);  FAILED


2. Variable-length records
입력한만큼만 공간이 할당됨을 의미한다. 예를 들어 VARCHAR(100)인 컬럼에 1개의 문자만 입력했다면 1바이트만큼의 공간만 할당이 된다.


3. SQL Features That SQLite Does Not Implement
    a. FOREIGN KEY constraints : 문법적으로 오류를 발생시키진 않으나 실행시간에 무시됨.
    b. Complete trigger support
    c. Complete ALTER TABLE support : RENAME TABLE과 ADD COLUMN만 지원함. DROP COLUMN, ALTER COLUMN, 
        ADD CONSTRAINT는 지원하지 않음.
    d. RIGHT and FULL OUTER JOIN : LEFT OUTER JOIN만 지원함.
    e. Writing to Views
    f . GRANT and REVOKE


4. Datatypes In SQLite Version 3 - Storage Class
    a. NULL            NULL value
    b. INTEGER       1, 2, 3, 4, 6 or 8 bytes signed integer
    c. REAL            floating point value (8 bytes)
    d. TEXT            text string (encoding : UTF-8, UTF-16BE or UTF-16LE)
    e. BLOB            입력된 값 그대로 바이너리로 저장됨.


5. Datatypes In SQLite Version 3 - Column Affinity
    일반적으로 다른 SQL database engine들은 static data type을 제공하지만, SQLite는 dynamic data types을 제공한다.
    각각의 column은 다음과 같은 type affinity를 가진다.
    a. TEXT            NULL, TEXT, BLOB storage class 가능
    b. NUMERIC      모든 storage class 가능
    c. INTEGER       NUMERIC과 같으나, real value의 경우 INTEGER storage class로 저장됨.
    d. REAL            NUMERIC과 같으나, integer value를 floating point로 강제 전환.
    e. NONE            특정 storage class를 선호하지 않는다. storage class를 강제로 변환하지 않는다. 


6. Datatypes In SQLite Version 3 - Determination of column affinity
    a. 데이터 타입에 "INT"가 포함되면, INTEGER affinity 할당
    b. 데이터 타입에 "CHAR", "CLOB" or "TEXT"가 포함되면, TEXT affinity 할당
    c. 데이터 타입에 "BLOB"가 포함되거나 데이터 타입을 지정하지 않으면 NONE affinity 할당
    d. 데이터 타입에 "REAL", "FLOA" or "DOUB"가 포함되면 REAL affinity 할당
    e. 그 외에는 NUMERIC


7. Datatypes In SQLite Version 3 -  Column affinity example
    CREATE TABLE t1(
        t  TEXT,
        nu NUMERIC, 
        i  INTEGER,
        no BLOB
    );

    -- Storage classes for the following row:
    -- TEXT, REAL, INTEGER, TEXT
    INSERT INTO t1 VALUES('500.0', '500.0', '500.0', '500.0');

    -- Storage classes for the following row:
    -- TEXT, REAL, INTEGER, REAL
    INSERT INTO t1 VALUES(500.0, 500.0, 500.0, 500.0);    



* 이슈 사항
    a. SQLite는 기본적으로 UTF-8과 UTF-16을 지원한다. 따라서 UTF-8이 아닌 ansi를 사용할 경우 문제가 발생할 수 있다.
        (참조 : http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=839)

    b. SQLite는 insert를 할 때마다 자동으로 트랜잭션이 걸린다고 한다. 따라서 많은 수의 데이터를 한번에 입력할 때에는 
        insert가 모두 끝난 후 트랜잭션 처리를 하도록 해야한다.(delete / update의 경우 확인은 안해봤지만 동일할거라 생각됨)
        (참조 : http://www.jamsun2.com/zbxe/?mid=study&listStyle=webzine&document_srl=88071
        http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=51&MAEULNO=20&no=8200&page=1)

by 용식불패 | 2009/02/25 16:48 | 프로그래밍 | 트랙백 | 덧글(0)

Cyber Formula GPX Sin

파이널 판타지 7과 함께 내가 유일하게 소장하고 있는 애니메이션이다.
개인적으로 주제가도 너무 마음에 들었고 내용 역시 가장 좋았다고 생각한다.

http://linview.enppy.com/linview/8154

by 용식불패 | 2009/01/21 09:50 | 트랙백 | 덧글(0)

돌발영상 언제 폐지된 것이냐.. ㅜ_ㅠ

http://mongu.net/320

동영상을 보고 알았다. 돌발영상이 폐지된 것을..
간혹 TV에서 골때리는 아저씨들 나와서 쇼하는 것이 제법 재밌었다.
사실 왠만한 개그맨보다 더 웃겼다. 가끔은 배대뒤치기 같은 큰 기술들이 나오기도 하고..
개인적으로 무척 좋은 프로라고 생각하고 있었다.

근데 폐지라니.. ㅜ_ㅠ
사실 사장이 바뀔 때부터 대충 그럴 것이라 생각도 하긴 했지만..
그래도 사람들 보는 눈이 있는데 설마 그럴까 했다..

이제는 대놓고 노골적으로 나오기 시작한 것 같다..
잘 된 일일지도 모른다. 지금의 나와 같은 젊은 세대..
그리고 앞으로 투표권을 갖게 될 지금의 어린 학생들에게 좋은 경험이 될 것이다.

우리의 권리를 제대로, 신중하게 행사하지 않았을 때, 어떤 불행한 결과가 초래되는지 확실히 알게 되었을테니까 말이다.

by 용식불패 | 2008/11/14 14:59 | ... | 트랙백 | 덧글(0)

PeekMessage의 또다른 특징

보통 알려져있는 PeekMessage의 특징은 아마도,
GetMessage는 메시지 큐에 메시지가 없을 경우 블럭되지만, PeekMessage는 바로 리턴된다는 것과 메시지 큐에서 메시지를 꺼내지 않고 확인만 할 수 있다는 것 정도일 것이다.

하지만 이 외에도 다른 특이한 점이 하나 있다.
오늘 무척 특이한 코드를 보았다.

PeekMessage(&msg, DF_MSG1, DF_MSG1, PM_REMOVE);

이게 끝이다. 보통 DispatchMessage와 TranslateMessage를 사용하여 메시지를 처리하는 코드가 같이 다니는 것이 대부분의 경우인데 말이다. 하지만 저 메시지들에 대한 처리는 분명히 이루어지고 있었다.

MSDN에는 다음과 같이 설명되어 있다.

The PeekMessage function dispatches incoming sent messages, checks the thread message queue for a posted message, and retrieves the message (if any exist).

빨간색의 글씨가 바로 이 미스테리한 상황에 대한 것을 설명해주고 있다. 위의 설명에서 sent messages는 SendMessage로 들어온 메시지를 얘기하는 것이며, posted message는 PostMessage로 들어온 메시지를 말하는 것이라 생각한다. 즉 SendMessage로 메시지가 온 경우 디스패치를 수행한다는 얘기이다. (다른 프로세스 간에 메시지를 주고받는 상황임)

사실 잘 이해가 안가지 않는다. 왜 SendMessage는 알아서 자체적으로 메시지를 처리하도록 해놓았을까. 그래서 테스트를 해보았더니 실제로 정말 그렇게 된다.. ㅡ_ㅡ;

내가 본 코드에서는 이 방법을 이용해서 다른 프로세스에 요청메시지를 보내고 응답메시지를 받기 위한 대기를 하고 있었다. 실제로 이러한 방법은 별로 좋은 방법은 아니라 생각하며, 이런 방법을 사용할 일도 없을 거라 생각한다.

아무튼 그렇다는 얘기다. 좀 황당한 PeekMessage의 액션이었다. 뭔가 심오한 뜻이 있을지도.. ㅡ_ㅡ;;

by 용식불패 | 2008/11/14 00:41 | 프로그래밍 | 트랙백 | 덧글(2)

디버깅에 관해 공감가는 짧은 글..

작성하기 전에 읽으라
 효과적이지만 그 중요성이 잘 알려지지 않은 디버깅 테크닉이 바로 코드를 주의깊게 읽은 다음 한동안 손대지 않고 생각해 보는 것이다. 분명 키보드에 손을 뻗어 프로그램을 수정하고 버그가 없어졌는지 보고싶은 강렬한 열망이 존재할 것이다. 하지만 정말 무엇이 망가졌는지 모르고 엉뚱한 부분만 고치다가 다른 것까지 망가뜨릴 가능성이 더 높다. 프로그램의 중요 부분을 목록화해서 종이에 나열하면 모니터에서 볼 때와는 또 다른 관점으로 문제를 볼 수 있고, 더 여유를 갖고 고민해볼 수도 있다. ... 생략...
 잠시 숨을 돌려라. 가끔은 소스코드를 봐도 실제로 쓰여 있는 것이 아니라 자신이 생각한 것만 보일 때가 있다. 코딩에서 한 발짝 떨어져 있으면 선입견과 오해가 희석되면서 다시 코딩에 복귀했을 때, 작성된 실제 코드를 볼 수 있게 된다.

코드를 다른 사람에게 설명하라
또 다른 효과적인 기법은 바로 자신의 코드를 다른 사람에게 설명하는 것이다. 이러면 많은 경우 버그를 자기자신에게 설명하는 효과가 생긴다. 때로는 몇 문장도 채 말하지 못하고 부끄러워하면서 덧붙이게 된다. "아니 신경쓰지 마세요. 뭐가 잘못됐는지 알겠네요. 죄송합니다." 굉장히 효과가 탁월한 방법이다. 심지어 말을 할 대상이프로그래머가 아니어도 괜찮다. 어떤 대학 컴퓨터 센터는 지원 센터 근처에 곰인형을 비치해 놓았다. 알쏭달쏭한 버그로 고민하는 학생들은 기술 상담 직원에게 직접 물어보기 전에 먼저 그 곰인형에게 버그를 설명해야 한다.


프로그래밍 수련법 / 인사이트(Insight) 중에서..

by 용식불패 | 2008/11/05 09:22 | 프로그래밍 | 트랙백 | 덧글(0)

◀ 이전 페이지 다음 페이지 ▶