:meta-keywords: cubrid data types, cubrid type conversion, cubrid numeric types, cubrid date time, cubrid strings, cubrid character, cubrid enum, cubrid blob/clob, cubrid collection types, cubrid json type :meta-description: All CUBRID data types and conversion rules. *********** ë°ì´í„° 타입 *********** 수치형 ë°ì´í„° 타입 ================== ì •ìˆ˜ ë˜ëŠ” 실수를 ì €ìž¥í•˜ê¸° 위해 다ìŒì˜ 수치형 ë°ì´í„° íƒ€ìž…ì„ ì§€ì›í•œë‹¤. +----------------------+-----------+----------------------------+----------------------------+--------------------+ | 타입 | Bytes | 최소값 | 최대값 | ì •í™•/근사치 | +======================+===========+============================+============================+====================+ | **SHORT**, | 2 | -32,768 | 32,767 | ì •í™•í•œ 수치 | | **SMALLINT** | | | | | +----------------------+-----------+----------------------------+----------------------------+--------------------+ | **INTEGER**, | 4 | -2,147,483,648 | +2,147,483,647 | ì •í™•í•œ 수치 | | **INT** | | | | | +----------------------+-----------+----------------------------+----------------------------+--------------------+ | **BIGINT** | 8 | -9,223,372,036,854,775,808 | +9,223,372,036,854,775,807 | ì •í™•í•œ 수치 | +----------------------+-----------+----------------------------+----------------------------+--------------------+ | **NUMERIC**, | 16 | ì •ë°€ë„ *p*: 1 | ì •ë°€ë„ *p*: 38 | ì •í™•í•œ 수치 | | **DECIMAL** | | | | | | | | ìŠ¤ì¼€ì¼ *s*: 0 | ìŠ¤ì¼€ì¼ *s*: 38 | | +----------------------+-----------+----------------------------+----------------------------+--------------------+ | **FLOAT**, | 4 | -3.402823466E+38 | +3.402823466E+38 | 근사치 | | **REAL** | | (ANSI/IEEE 754-1985 표준) | (ANSI/IEEE 754-1985 표준) | ë¶€ë™ì†Œìˆ˜ì : 7ìžë¦¬ | +----------------------+-----------+----------------------------+----------------------------+--------------------+ | **DOUBLE**, | 8 | -1.7976931348623157E+308 | +1.7976931348623157E+308 | 근사치 | | **DOUBLE PRECISION** | | (ANSI/IEEE 754-1985 표준) | (ANSI/IEEE 754-1985 표준) | ë¶€ë™ì†Œìˆ˜ì : 15ìžë¦¬ | +----------------------+-----------+----------------------------+----------------------------+--------------------+ 수치형 ë°ì´í„° íƒ€ìž…ì€ ì •í™•í•œ(exact) 타입과 근사치(approximate) 타입으로 구분ëœë‹¤. ì •í™•í•œ 수치형 ë°ì´í„° 타입(**SMALLINT**, **INT**, **BIGINT**, **NUMERIC**)ì€ ì •í™•í•˜ê³ ì¼ê´€ëœ ê°’ì„ ê°€ì ¸ì•¼ 하는 ê²½ìš°ì— ì‚¬ìš©ëœë‹¤. 근사치 수치형 ë°ì´í„° 타입(**FLOAT**, **DOUBLE**)ì€ ë¦¬í„°ëŸ´ ê°’ì´ ê°™ì•„ë„ ì‹œìŠ¤í…œì— ë”°ë¼ ë‹¤ë¥´ê²Œ í•´ì„ë 수 있으므로 주ì˜í•œë‹¤. CUBRID는 수치형 ë°ì´í„° íƒ€ìž…ì— ëŒ€í•´ UNSIGNED íƒ€ìž…ì„ ì§€ì›í•˜ì§€ 않는다. ìœ„ì˜ í‘œì—서 ë‘ ê°€ì§€ ì´ë¦„으로 표기한 íƒ€ìž…ë“¤ì€ ë™ì¼í•˜ì§€ë§Œ, í…Œì´ë¸” ìƒì„± 후 :ref:`show-columns-statement` 문으로 íƒ€ìž…ì˜ ì´ë¦„ì„ í™•ì¸í• 때ì—는 í•ìƒ ìœ„ 단어로 표기ëœë‹¤. 예를 들어, í…Œì´ë¸”ì„ ìƒì„±í• 때ì—는 **SHORT**, **SMALLINT** 둘 다 쓸 수 있으며, :ref:`show-columns-statement` 문으로 íƒ€ìž…ì˜ ì´ë¦„ì„ í™•ì¸í• 때ì—는 í•ìƒ **SHORT** 로 표기ëœë‹¤. **ì •ë°€ë„와 스케ì¼(Precision and Scaling)** ìˆ«ìž ë°ì´í„° íƒ€ìž…ì˜ ì •ë°€ë„(precision)는 ê·¸ ê°’ì´ ìœ ì§€í• ìˆ˜ 있는 ìœ íš¨í•œ ìžë¦¿ìˆ˜ë¡œ ì •ì˜ëœë‹¤. ì´ëŠ” ì •í™•í•œ 수치형ì´ë“ 근사치 수치형ì´ë“ 마찬가지ì´ë‹¤. 스케ì¼(scale)ì€ ì†Œìˆ˜ì ì´í•˜ì˜ ìžë¦¿ìˆ˜ë¥¼ 나타내는ë°, ì •í™•í•œ 수치형ì—서만 ì˜ë¯¸ê°€ 있다. ì •í™•í•œ 수치형으로 ì„ ì–¸ëœ ì†ì„±ì€ í•ìƒ ê³ ì •ëœ ì •ë°€ë„와 스케ì¼ì„ 갖게 ëœë‹¤. **NUMERIC** (ë˜ëŠ” **DECIMAL**) ë°ì´í„° íƒ€ìž…ì€ í•ìƒ ìµœì†Œí•œ 한 ìžë¦¬ì˜ ì •ë°€ë„를 갖는다. 스케ì¼ì˜ 범위는 0ê³¼ ì„ ì–¸ëœ ì •ë°€ë„ ì‚¬ì´ì—¬ì•¼ 한다. 스케ì¼ì´ ì •ë°€ë„보다 í´ ìˆ˜ëŠ” 없다. **INTEGER** 나 **SMALLINT**, **BIGINT** ë°ì´í„° 타입ì—서는 스케ì¼ì€ 0ì´ê³ (즉, 소수ì ì´í•˜ê°€ ì—†ìŒ), ì •ë°€ë„는 ì‹œìŠ¤í…œì— ì˜í•´ ê³ ì •ëœë‹¤. **수치형 리터럴(Numeric Literals)** 수치형 ê°’ì„ ìž…ë ¥í•˜ê¸° 위해서는 특별한 기호가 사용ë 수 있는ë°, 플러스(+)는 양수를, 마ì´ë„ˆìФ(-)는 ìŒìˆ˜ë¥¼ 나타내는 ë° ì‚¬ìš©í•œë‹¤. 과학용 í‘œê¸°ë²•ì´ ì‚¬ìš©ë ìˆ˜ë„ ìžˆë‹¤. í™”í ê°’ì„ í‘œí˜„í•˜ê¸° 위하여 ì‹œìŠ¤í…œì— ì§€ì •ëœ í†µí™” 기호를 ì‚¬ìš©í• ìˆ˜ë„ ìžˆë‹¤. 수치형 리터럴로 표현 가능한 최대 ì •ë°€ë„는 255ì´ë‹¤. **수치형 변환(Numeric Coercions)** ëª¨ë“ ìˆ˜ì¹˜í˜• ë°ì´í„° íƒ€ìž…ì€ ìƒí˜¸ ë¹„êµ ê°€ëŠ¥í•˜ê³ , ì´ë¥¼ 위해 서로 ê³µí†µëœ ìˆ˜ì¹˜í˜• ë°ì´í„° 타입으로 ìžë™ ë³€í™˜ì´ ì´ë£¨ì–´ì§„다. 명시ì ì¸ ë³€í™˜ì€ **CAST** ì—°ì‚°ìžë¥¼ ì´ìš©í•´ì•¼ 한다. 서로 다른 수치형 ë°ì´í„°ê°€ 서로 ì •ë ¬ë˜ê±°ë‚˜, 수ì‹ì—서 계산ë 때ì—는 ì‹œìŠ¤í…œì— ì˜í•˜ì—¬ ìžë™ìœ¼ë¡œ 변환ëœë‹¤. 예를 들어, **FLOAT** íƒ€ìž…ì˜ ì†ì„± ê°’ê³¼ **INTEGER** íƒ€ìž…ì˜ ì†ì„± ê°’ì„ ë”하게 ë˜ë©´, ì‹œìŠ¤í…œì´ ìžë™ì 으로 **INTEGER** ì†ì„± ê°’ì„ ê°€ìž¥ 근사한 **FLOAT** 값으로 변환한 후 ë§ì…ˆì„ 수행한다. 다ìŒì€ **FLOAT** 타입 ê°’ê³¼ **INTEGER** 타입 ê°’ì„ ë”하는 경우 **FLOAT** 타입 ê°’ì„ ì¶œë ¥í•˜ëŠ” 예ì´ë‹¤. .. code-block:: sql CREATE TABLE tbl (a INT, b FLOAT); INSERT INTO tbl VALUES (10, 5.5); SELECT a + b FROM tbl; :: 1.550000e+01 다ìŒì€ ë‘ ê°œì˜ ì •ìˆ˜ ê°’ì„ ë”하는 경우 ê²°ê³¼ ê°’ë„ **INTEGER** íƒ€ìž…ì´ ë˜ê¸° ë•Œë¬¸ì— ì˜¤ë²„í”Œë¡œìš°(overflow) ì—러가 ë°œìƒí•˜ëŠ” 예ì´ë‹¤. .. code-block:: sql SELECT 100000000*1000000; :: ERROR: Data overflow on data type integer. 위와 ê°™ì€ ê²½ìš° ì–´ëŠ í•œ ìª½ì˜ íƒ€ìž…ì„ **BIGINT**\ 로 명시하면, **BIGINT**\ 로 ê²°ê³¼ ê°’ì„ ê²°ì •í•˜ê³ , ì •ìƒì ì¸ ê²°ê³¼ë¥¼ ì¶œë ¥í•œë‹¤. .. code-block:: sql SELECT CAST(100000000 AS BIGINT)*1000000; :: 100000000000000 .. warning:: CUBRID 2008 R2.0 미만 ë²„ì „ì—서는 ìž…ë ¥ëœ ìƒìˆ˜ê°€ **INTEGER** 범위를 넘어서면 **NUMERIC**\ 으로 처리ë˜ì—ˆìœ¼ë‚˜, CUBRID 2008 R2.0 ì´ìƒ ë²„ì „ì—서는 **BIGINT**\ 로 처리ëœë‹¤. INT, INTEGER ------------ **INTEGER** ë°ì´í„° íƒ€ìž…ì€ ì •ìˆ˜ í‘œí˜„ì„ ìœ„í•´ 사용하며, í‘œí˜„í• ìˆ˜ 있는 ê°’ì˜ ë²”ìœ„ëŠ” -2,147,483,648ì—서 +2,147,483,647ì´ë‹¤. ìž‘ì€ ì •ìˆ˜ë¥¼ 표현하기 위해 **SMALLINT**\ 를 사용하거나, í° ì •ìˆ˜ë¥¼ 표현하기 위해 **BIGINT**\ 를 ì‚¬ìš©í• ìˆ˜ 있다. * **INTEGER**\ 와 **INT**\ 는 ê°™ì€ ì˜ë¯¸ë¡œ 사용ëœë‹¤. * **INT** íƒ€ìž…ì— ì‹¤ìˆ˜ê°€ ìž…ë ¥ë˜ë©´, 소수ì 아래 숫ìžê°€ 반올림ë˜ì–´ ì •ìˆ˜ê°’ì´ ì €ìž¥ëœë‹¤. * ì´ íƒ€ìž…ì˜ ì¹¼ëŸ¼ì— **DEFAULT** ì†ì„±ì´ ì§€ì •ë 수 있다. :: INTEGERì— 8934를 ì§€ì •í•˜ë©´ 8934ê°€ ì €ìž¥ë¨. INTEGERì— 7823467를 ì§€ì •í•˜ë©´ 7823467ì´ ì €ìž¥ë¨. INTEGERì— 89.8를 ì§€ì •í•˜ë©´ 90ì´ ì €ìž¥ë¨(소수ì ë’¤ì˜ ìˆ˜ì¹˜ëŠ” 반올림ë¨). INTEGERì— 3458901122를 ì§€ì •í•˜ë©´ 오류가 ë°œìƒí•¨(표현 가능 범위를 초과하면 오류 ë°œìƒ). SHORT, SMALLINT --------------- **SMALLINT** ë°ì´í„° íƒ€ìž…ì€ ìž‘ì€ ì •ìˆ˜ í‘œí˜„ì„ ìœ„í•´ 사용ë˜ë©°, í‘œí˜„í• ìˆ˜ 있는 ê°’ì˜ ë²”ìœ„ëŠ” -32,768ì—서 +32,767ì´ë‹¤. * **SMALLINT**\ 와 **SHORT**\ 는 ê°™ì€ ì˜ë¯¸ë¡œ 사용ëœë‹¤. * **SMALLINT** íƒ€ìž…ì— ì‹¤ìˆ˜ê°€ ìž…ë ¥ë˜ë©´, 소수ì 아래 숫ìžê°€ 반올림ë˜ì–´ ì •ìˆ˜ê°’ì´ ì €ìž¥ëœë‹¤. * ì´ íƒ€ìž…ì˜ ì¹¼ëŸ¼ì— **DEFAULT** ì†ì„±ì´ ì§€ì •ë 수 있다. :: SMALLINTì— 8934를 ì§€ì •í•˜ë©´ 8934ê°€ ì €ìž¥ë¨. SMALLINTì— 34.5를 ì§€ì •í•˜ë©´ 35ê°€ ì €ìž¥ë¨(소수ì ì´í•˜ì˜ 숫ìžëŠ” 반올림ë¨). SMALLINTì— 23467를 ì§€ì •í•˜ë©´ 23467ì´ ì €ìž¥ë¨. SMALLINTì— 89354를 ì§€ì •í•˜ë©´ 오류가 ë°œìƒí•¨(표현 가능 범위를 초과하면 오류 ë°œìƒ). BIGINT ------ **BIGINT** ë°ì´í„° íƒ€ìž…ì€ í° ì •ìˆ˜ í‘œí˜„ì„ ìœ„í•´ 사용ë˜ë©°, í‘œí˜„í• ìˆ˜ 있는 ê°’ì˜ ë²”ìœ„ëŠ” -9,223,372,036,854,775,808ì—서 9,223,372,036,854,775,807ì´ë‹¤. * **BIGINT** íƒ€ìž…ì— ì‹¤ìˆ˜ê°€ ìž…ë ¥ë˜ë©´, 소수ì 아래 숫ìžê°€ 반올림ë˜ì–´ ì •ìˆ˜ê°’ì´ ì €ìž¥ëœë‹¤. * ì •ë°€ë„와 í‘œí˜„í• ìˆ˜ 있는 범위를 기준으로는 다ìŒê³¼ ê°™ì´ ì •ë ¬í• ìˆ˜ 있다. **SMALLINT** ⊂ **INTEGER** ⊂ **BIGINT** ⊂ **NUMERIC** * ì´ íƒ€ìž…ì˜ ì¹¼ëŸ¼ì— **DEFAULT** ì†ì„±ì´ ì§€ì •ë 수 있다. :: BIGINTì— 8934를 ì§€ì •í•˜ë©´ 8934ê°€ ì €ìž¥ë¨. BIGINTì— 89.1ì„ ì§€ì •í•˜ë©´ 89ê°€ ì €ìž¥ë¨. BIGINTì— 89.8ì„ ì§€ì •í•˜ë©´ 90ì´ ì €ìž¥ë¨(소수ì ë’¤ì˜ ìˆ˜ì¹˜ëŠ” 반올림ë¨). BIGINTì— 3458901122를 ì§€ì •í•˜ë©´ 3458901122ê°€ ì €ìž¥ë¨. NUMERIC, DECIMAL ---------------- **NUMERIC** ë˜ëŠ” **DECIMAL** ë°ì´í„° íƒ€ìž…ì€ ê³ ì • 소수ì 숫ìžë¥¼ 표현하기 위해 사용ë˜ë©°, 다ìŒê³¼ ê°™ì´ ì „ì²´ ìžë¦¬ 수(ì •ë°€ë„)와 소수ì 아래 ìžë¦¿ìˆ˜(스케ì¼)ì„ ì˜µì…˜ìœ¼ë¡œ ì§€ì •í•˜ì—¬ ì •ì˜í• 수 있다. ì •ë°€ë„ *p*\ ì˜ ìµœì†Œê°’ì€ 1ì´ê³ ìµœëŒ€ê°’ì€ 38ì´ë©°, ì •ë°€ë„ *p*\ ê°€ ìƒëžµë˜ë©´ ê¸°ë³¸ê°’ì€ 15ì´ë¯€ë¡œ, ì •ìˆ˜ë¶€ê°€ 15ìžë¦¬ë¥¼ 초과하는 ë°ì´í„°ë¥¼ ìž…ë ¥í• ìˆ˜ 없다. ë˜í•œ, ìŠ¤ì¼€ì¼ *s*\ ê°€ ìƒëžµë˜ë©´ 스케ì¼ì˜ ê¸°ë³¸ê°’ì€ 0ì´ë¯€ë¡œ 소수ì 아래 첫째 ìžë¦¬ì—서 반올림한 ì •ìˆ˜ë¥¼ 반환한다. :: NUMERIC [(p[, s])] * ì •ë°€ë„는 반드시 ìŠ¤ì¼€ì¼ ì´ìƒì´ì–´ì•¼ 한다. * ì •ë°€ë„는 (ë°ì´í„°ì˜ ì •ìˆ˜ë¶€ ìžë¦¬ 수 + 스케ì¼) ì´ìƒì´ ë˜ë„ë¡ ì§€ì •í•œë‹¤. * **NUMERIC**\ ê³¼ **DECIMAL**, ê·¸ë¦¬ê³ **DEC**\ 는 ê°™ì€ ì˜ë¯¸ë¡œ 사용ëœë‹¤. * **NUMERIC** 타입ë¼ë¦¬ 연산한 ê²°ê³¼ ê°’ì˜ ì •ë°€ë„와 스케ì¼ì´ 어떻게 달ë¼ì§€ëŠ”ì§€ 확ì¸í•˜ë ¤ë©´ :ref:`numeric-data-type-op-and-conversion`\ ì„ ì°¸ê³ í•œë‹¤. * ì´ íƒ€ìž…ì˜ ì¹¼ëŸ¼ì— **DEFAULT** ì†ì„±ì´ ì§€ì •ë 수 있다. :: NUMERICì— 12345.6789를 ì§€ì •í•˜ë©´ 12346ì´ ì €ìž¥ë¨(ìŠ¤ì¼€ì¼ ê¸°ë³¸ê°’ì€ 0ì´ë¯€ë¡œ 소수ì 아래 첫째 ìžë¦¬ì—서 반올림함). NUMERIC(4)ì— 12345.6789를 ì§€ì •í•˜ë©´ 오류가 ë°œìƒí•¨(ì •ë°€ë„는 ë°ì´í„°ì˜ ì •ìˆ˜ë¶€ ìžë¦¿ìˆ˜ ì´ìƒì´ì–´ì•¼ 함). NUMERIC(3,4)를 ì„ ì–¸í•˜ë©´ 오류가 ë°œìƒí•¨(ì •ë°€ë„는 ìŠ¤ì¼€ì¼ ì´ìƒì´ì–´ì•¼ 함). NUMERIC(4,4)ì— 0.123456789를 ì§€ì •í•˜ë©´ .1235ê°€ ì €ìž¥ë¨(소수ì 아래 다섯째 ìžë¦¬ì—서 반올림함). NUMERIC(4,4)ì— -0.123456789를 ì§€ì •í•˜ë©´ -.1235ê°€ ì €ìž¥ë¨(소수ì 아래 다섯째 ìžë¦¬ì—서 반올림한 후, - 부호를 붙임). FLOAT, REAL ----------- **FLOAT** (ë˜ëŠ” **REAL**) ë°ì´í„° íƒ€ìž…ì€ ë¶€ë™ ì†Œìˆ˜ì 숫ìžë¥¼ 표현하기 위해 사용ëœë‹¤. ì •ê·œ ê°’(normalized value)으로 í‘œí˜„í• ìˆ˜ 있는 ê°’ì˜ ë²”ìœ„ëŠ” -3.402823466E+38 ì—서 -1.175494351E-38, 0, ê·¸ë¦¬ê³ +1.175494351E-38 ì—서+3.402823466E+38ì´ë©°, ì´ ë²”ìœ„ë¥¼ 벗어나서 0ì— ê°€ê¹Œìš´ ê°’ì€ ë¹„ì •ê·œ ê°’(denormalized value)으로 표현한다. ì´ëŠ” ANSI/IEEE 754-1985 í‘œì¤€ì„ ì¤€ìˆ˜í•œë‹¤. ì •ë°€ë„ *p*\ ì˜ ìµœì†Œê°’ì€ 1ì´ê³ ìµœëŒ€ê°’ì€ 38ì´ë©°, ì •ë°€ë„ *p*\ ê°€ ìƒëžµë˜ê±°ë‚˜ 7 ì´í•˜ë¡œ ì§€ì •ë˜ë©´ ë‹¨ì¼ ì •ë°€ë„(single-precision, 7ìžë¦¬ì˜ ìœ íš¨ 숫ìž)로 표현ëœë‹¤. 만약 ì •ë°€ë„ *p*\ ê°€ 7보다 í¬ê³ 38 ì´í•˜ì´ë©´ ì´ì¤‘ ì •ë°€ë„(double-precision, 15ìžë¦¬ì˜ ìœ íš¨ 숫ìž)로 표현ë˜ë©°, **DOUBLE** ë°ì´í„° 타입으로 변환ëœë‹¤. **FLOAT** ë°ì´í„° íƒ€ìž…ì€ 7ìžë¦¬ì˜ ìœ íš¨ ìžë¦¿ìˆ˜ë¥¼ 넘는 ìž…ë ¥ ê°’ì— ëŒ€í•´ 근사치를 ì €ìž¥í•˜ëŠ” 타입ì´ë¯€ë¡œ ìœ íš¨ ìžë¦¿ìˆ˜ë¥¼ 넘어서는 ì •í™•í•œ ê°’ì„ ì €ìž¥í•˜ë ¤ë©´ 사용하지 않ë„ë¡ ì£¼ì˜í•œë‹¤. :: FLOAT[(p)] * **FLOAT** íƒ€ìž…ì˜ ìœ íš¨ ìžë¦¬ 수는 7ì´ë‹¤. * **FLOAT** íƒ€ìž…ì€ ê·¼ì‚¬ì¹˜ ë°ì´í„°ë¥¼ ì €ìž¥í•˜ë¯€ë¡œ ë°ì´í„° ë¹„êµ ì‹œ 주ì˜í•´ì•¼ 한다. * **FLOAT**\ 와 **REAL**\ ì€ ê°™ì€ ì˜ë¯¸ë¡œ 사용ëœë‹¤. * ì´ íƒ€ìž…ì˜ ì¹¼ëŸ¼ì— **DEFAULT** ì†ì„±ì´ ì§€ì •ë 수 있다. :: FLOATì— 16777217ì„ ìž…ë ¥í•˜ë©´ 16777216ì´ ì €ìž¥ë˜ê³ , 1.677722e+07ì´ ì¶œë ¥ëœë‹¤(ì •ë°€ë„ê°€ ìƒëžµë˜ë©´, 7ê°œì˜ ìœ íš¨ 숫ìžë¡œ 표현하므로 8번째 숫ìžë¥¼ 반올림함). FLOAT(5)ì— 16777217ì„ ìž…ë ¥í•˜ë©´ 16777216ì´ ì €ìž¥ë˜ê³ , 1.677722e+07ì´ ì¶œë ¥ëœë‹¤(ì •ë°€ë„ê°€ 7 ì´í•˜ì´ë©´, 7ê°œì˜ ìœ íš¨ 숫ìžë¡œ 표현하므로 8번째 숫ìžë¥¼ 반올림함). FLOAT(5)ì— 16777.217ì„ ìž…ë ¥í•˜ë©´ 16777.216ì´ ì €ìž¥ë˜ê³ , 1.677722e+04ê°€ ì¶œë ¥ëœë‹¤(ì •ë°€ë„ê°€ 7 ì´í•˜ì´ë©´, 7ê°œì˜ ìœ íš¨ 숫ìžë¡œ 표현하므로 8번째 숫ìžë¥¼ 반올림함). FLOAT(10)ì— 16777.217를 ì§€ì •í•˜ë©´ 16777.217ì´ ì €ìž¥ë˜ê³ , 1.677721700000000e+04ê°€ ì¶œë ¥ëœë‹¤(ì •ë°€ë„ê°€ 7보다 í¬ê³ 38 ì´í•˜ì´ë©´, DOUBLE 타입으로 변환ë˜ì–´ 15ê°œì˜ ìœ íš¨ 숫ìžë¡œ 표현하므로 0ì„ ì±„ì›€). DOUBLE, DOUBLE PRECISION ------------------------ **DOUBLE** ë°ì´í„° íƒ€ìž…ì€ ë¶€ë™ ì†Œìˆ˜ì 숫ìžë¥¼ 표현하기 위해 사용ëœë‹¤. ì •ê·œ ê°’(normalized value)으로 í‘œí˜„í• ìˆ˜ 있는 ê°’ì˜ ë²”ìœ„ëŠ” -1.7976931348623157E+308ì—서 -2.2250738585072014E-308, 0, ê·¸ë¦¬ê³ 2.2250738585072014E-308ì—서 1.7976931348623157E+308ì´ë©°, ì´ ë²”ìœ„ë¥¼ 벗어나서 0ì— ê°€ê¹Œìš´ ê°’ì€ ë¹„ì •ê·œ ê°’(denormalized value)으로 표현한다. ì´ëŠ” ANSI/IEEE 754-1985 í‘œì¤€ì„ ì¤€ìˆ˜í•œë‹¤. ì •ë°€ë„를 ì§€ì •í• ìˆ˜ 없으며, ì´ íƒ€ìž…ì´ ì§€ì •ëœ ë°ì´í„°ëŠ” ì´ì¤‘ ì •ë°€ë„(double-precision, 15ìžë¦¬ì˜ ìœ íš¨ 숫ìž)로 표현ëœë‹¤. **DOUBLE** ë°ì´í„° íƒ€ìž…ì€ 15ìžë¦¬ì˜ ìœ íš¨ ìžë¦¿ìˆ˜ë¥¼ 넘는 ìž…ë ¥ ê°’ì— ëŒ€í•´ 근사치를 ì €ìž¥í•˜ëŠ” 타입ì´ë¯€ë¡œ ìœ íš¨ ìžë¦¿ìˆ˜ë¥¼ 넘어서는 ì •í™•í•œ ê°’ì„ ì§€ì •í• ë•Œì—는 사용하지 않ë„ë¡ ì£¼ì˜í•œë‹¤. * **DOUBLE**\ ì˜ ìœ íš¨ ìžë¦¬ 수는 15ìžë¦¬ì´ë‹¤. * **DOUBLE** íƒ€ìž…ì€ ê·¼ì‚¬ì¹˜ ë°ì´í„°ë¥¼ ì €ìž¥í•˜ë¯€ë¡œ ë°ì´í„° ë¹„êµ ì‹œ 주ì˜í•´ì•¼ 한다. * **DOUBLE**\ ê³¼ **DOUBLE PRECISION**\ ì€ ê°™ì€ ì˜ë¯¸ë¡œ 사용ëœë‹¤. * ì´ íƒ€ìž…ì˜ ì¹¼ëŸ¼ì— **DEFAULT** ì†ì„±ì´ ì§€ì •ë 수 있다. :: DOUBLEì— 1234.56789를 ìž…ë ¥í•˜ë©´ 1234.56789ê°€ ì €ìž¥ë˜ê³ , 1.234567890000000e+03ì´ ì¶œë ¥ëœë‹¤. DOUBLEì— 9007199254740993ì„ ìž…ë ¥í•˜ë©´ 9007199254740992ê°€ ì €ìž¥ë˜ê³ , 9.007199254740992e+15ê°€ ì¶œë ¥ëœë‹¤. .. note:: MONETARY íƒ€ìž…ì€ ì œê±°ë ì˜ˆì •ì´ë©°(deprecated), ë” ì´ìƒ ì‚¬ìš©ì„ ê¶Œìž¥í•˜ì§€ 않는다. .. _date-time-type: ë‚ ì§œ/시간 ë°ì´í„° 타입 ===================== ë‚ ì§œ/시간 ë°ì´í„° íƒ€ìž…ì€ ë‚ ì§œ, 시간 í˜¹ì€ ì´ ë‘ ê°€ì§€ë¥¼ ëª¨ë‘ í‘œí˜„í• ë•Œ 사용하는 ë°ì´í„° 타입으로 다ìŒê³¼ ê°™ì€ ë°ì´í„° íƒ€ìž…ì„ ì§€ì›í•œë‹¤. +------------------+-----------+---------------------------------+-------------------------------------+-----------------------------------------------------------------------+ | 타입 | bytes | 최소값 | 최대값 | ë¹„ê³ | +==================+===========+=================================+=====================================+=======================================================================+ | **DATE** | 4 | 0001ë…„ 1ì›” 1ì¼ | 9999ë…„ 12ì›” 31ì¼ | 예외ì 으로 DATE '0000-00-00'ì„ ìž…ë ¥í• ìˆ˜ 있다. | +------------------+-----------+---------------------------------+-------------------------------------+-----------------------------------------------------------------------+ | **TIME** | 4 | 00시 00ë¶„ 00ì´ˆ | 23시 59ë¶„ 59ì´ˆ | | +------------------+-----------+---------------------------------+-------------------------------------+-----------------------------------------------------------------------+ | **TIMESTAMP** | 4 | 1970ë…„ 1ì›” 1ì¼ 0시 0ë¶„ 1ì´ˆ(GMT) | 2038ë…„ 1ì›” 19ì¼ 3시 14ë¶„ 7ì´ˆ(GMT) | 예외ì 으로 TIMESTAMP '0000-00-00 00:00:00'ì„ ìž…ë ¥í• ìˆ˜ 있다. | | | | 1970ë…„ 1ì›” 1ì¼ 9시 0ë¶„ 1ì´ˆ(KST) | 2038ë…„ 1ì›” 19ì¼ 12시 14ë¶„ 7ì´ˆ(KST) | | +------------------+-----------+---------------------------------+-------------------------------------+-----------------------------------------------------------------------+ | **DATETIME** | 8 | 0001ë…„ 1ì›” 1ì¼ 0시 0ë¶„ 0.000ì´ˆ | 9999ë…„ 12ì›” 31ì¼ 23시 59ë¶„ 59.999ì´ˆ | 예외ì 으로 DATETIME '0000-00-00 00:00:00'ì„ ìž…ë ¥í• ìˆ˜ 있다. | +------------------+-----------+---------------------------------+-------------------------------------+-----------------------------------------------------------------------+ | **TIMESTAMPLTZ** | 4 | 1970ë…„ 1ì›”1ì¼ 0시 0ë¶„ 1ì´ˆ(GMT) | 2038ë…„1ì›”19ì¼3시14ë¶„7ì´ˆ(GMT) | 로컬 íƒ€ìž„ì¡´ì˜ TIMESTAMP. | | | | íƒ€ìž„ì¡´ì— ë”°ë¼ ë‹¤ë¦„ | íƒ€ìž„ì¡´ì— ë”°ë¼ ë‹¤ë¦„ | 예외ì 으로, TIMESTAMPLTZ'0000-00-00 00:00:00' 형태가 허용ëœë‹¤. | +------------------+-----------+---------------------------------+-------------------------------------+-----------------------------------------------------------------------+ | **TIMESTAMPTZ** | 8 | 1970ë…„ 1ì›”1ì¼ 0시 0ë¶„ 1ì´ˆ(GMT) | 2038ë…„1ì›”19ì¼3시14ë¶„7ì´ˆ(GMT) | 로컬 íƒ€ìž„ì¡´ì˜ TIMESTAMP. | | | | íƒ€ìž„ì¡´ì— ë”°ë¼ ë‹¤ë¦„ | íƒ€ìž„ì¡´ì— ë”°ë¼ ë‹¤ë¦„ | 예외ì 으로, TIMESTAMPTZ '0000-00-00 00:00:00' 형태가 허용ëœë‹¤. | +------------------+-----------+---------------------------------+-------------------------------------+-----------------------------------------------------------------------+ | **DATETIMELTZ** | 8 | 0001ë…„ 1ì›”1ì¼ 0시0ë¶„ 0.000ì´ˆ UTC| 9999ë…„12ì›”31ì¼23시59ë¶„59.999ì´ˆ | 로컬 íƒ€ìž„ì¡´ì˜ DATETIME. | | | | íƒ€ìž„ì¡´ì— ë”°ë¼ ë‹¤ë¦„ | íƒ€ìž„ì¡´ì— ë”°ë¼ ë‹¤ë¦„ | 예외ì 으로, DATETIMELTZ '0000-00-00 00:00:00' 형태가 허용ëœë‹¤. | +------------------+-----------+---------------------------------+-------------------------------------+-----------------------------------------------------------------------+ | **DATETIMETZ** | 12 | 0001ë…„ 1ì›”1ì¼ 0시0ë¶„ 0.000ì´ˆ UTC| 9999ë…„12ì›”31ì¼23시59ë¶„59.999ì´ˆ | íƒ€ìž„ì¡´ì˜ DATETIME. | | | | íƒ€ìž„ì¡´ì— ë”°ë¼ ë‹¤ë¦„ | íƒ€ìž„ì¡´ì— ë”°ë¼ ë‹¤ë¦„ | 예외ì 으로, DATETIMETZ '0000-00-00 00:00:00' 형태가 허용ëœë‹¤. | +------------------+-----------+---------------------------------+-------------------------------------+-----------------------------------------------------------------------+ **범위와 í•´ìƒë„(Range and Resolution)** * 시간 ê°’ì˜ í‘œí˜„ì€ ê¸°ë³¸ì 으로 24시간 ì‹œìŠ¤í…œì— ì˜í•˜ì—¬ ê·¸ 범위가 ê²°ì •ëœë‹¤. ë‚ ì§œëŠ” ê·¸ë ˆê³ ë¦¬ë ¥(Gregorian calendar)ì„ ë”°ë¥¸ë‹¤. ì´ ë‘ ì œì•½ 사í•ì„ ë²—ì–´ë‚˜ëŠ” ê°’ì´ ë‚ ì§œë‚˜ 시간으로 ìž…ë ¥ë˜ë©´ 오류가 ë°œìƒí•œë‹¤. * **DATE** 중 ì—°ë„ì˜ ë²”ìœ„ëŠ” 0001~9999 ADì´ë‹¤. * CUBRID 2008 R3.0 ë²„ì „ë¶€í„°ëŠ” ì—°ë„를 ë‘ ìžë¦¬ë§Œ 표기하면, 00~69는 2000~2069로 변환ë˜ê³ , 70~99는 1970~1999로 변환ëœë‹¤. R3.0 미만 ë²„ì „ì—서는 01~99ê¹Œì§€ì˜ ë‘ ìžë¦¬ ì—°ë„를 표기하면, ê°ê° 0001~0099로 변환ëœë‹¤. * **TIMESTAMP** ì˜ ë²”ìœ„ëŠ” GMT로 1970ë…„ 1ì›” 1ì¼ 0시 0ë¶„ 1초부터 2038ë…„ 1ì›” 19ì¼ 03시 14ë¶„ 07초까지ì´ë‹¤. KST (GMT+9)로는 1970ë…„ 1ì›” 1ì¼ 9시 0ë¶„ 1초부터 2038ë…„ 1ì›” 19ì¼ 12시 14ë¶„ 07초까지 ì €ìž¥í• ìˆ˜ 있다. GMT로 timestamp'1970-01-01 00:00:00'ì€ timestamp'0000-00-00 00:00:00'와 같다. * **TIMESTAMPLTZ**, **TIMESTAMPTZ** 범위는 íƒ€ìž„ì¡´ì— ë”°ë¼ ë‹¤ë¥´ì§€ë§Œ UTC로 변환ë˜ëŠ” ê°’ì€ 1970-01-01 00:00:01ê³¼ 2038-01-19 03 03:14:07 사ì´ì—¬ì•¼ 한다. * **DATETIMELTZ**, **DATETIMETZ** 범위는 íƒ€ìž„ì¡´ì— ë”°ë¼ ë‹¤ë¥´ì§€ë§Œ UTC로 변환ë˜ëŠ” ê°’ì€ 0001-01-01 00:00:0.000ê³¼ 9999-12-31 23:59:59.999 사ì´ì—¬ì•¼ 한다. 세션 íƒ€ìž„ì¡´ì´ ë³€ê²½ë˜ë©´ ë°ì´í„°ë² ì´ìŠ¤ì— ì €ìž¥ëœ ê°’ì´ ë” ì´ìƒ ìœ íš¨í•˜ì§€ 않다. * ë‚ ì§œ, 시간, 타임스탬프와 ê´€ë ¨ëœ ì—°ì‚°ì€ ì‹œìŠ¤í…œì˜ ë°˜ì˜¬ë¦¼ ì‹œìŠ¤í…œì— ë”°ë¼ ê²°ê³¼ê°€ 달ë¼ì§ˆ 수 있다. ì´ëŸ¬í•œ 경우, 시간과 타임스탬프는 가장 ê·¼ì ‘í•œ 초를 최소 í•´ìƒë„로, ë‚ ì§œëŠ” 가장 ê·¼ì ‘í•œ ë‚ ì§œë¥¼ 최소 í•´ìƒë„로 하여 ê²°ì •ëœë‹¤. **변환(Coercion)** ë‚ ì§œ/시간 ë°ì´í„° íƒ€ìž…ì˜ ê°’ì€ ì„œë¡œ ë˜‘ê°™ì€ í•ëª©ì„ ê°€ì§€ê³ ìžˆëŠ” 경우ì—ë§Œ **CAST** ì—°ì‚°ìžë¥¼ ì´ìš©í•œ 명시ì ì¸ ë³€í™˜ì´ ê°€ëŠ¥í•˜ë©°, 묵시ì ë³€í™˜ì€ :ref:`implicit-type-conversion` ì„ ì°¸ê³ í•œë‹¤. ì•„ëž˜ì˜ í‘œëŠ” 명시ì ë³€í™˜ì´ ê°€ëŠ¥í•œ íƒ€ìž…ì„ ì„¤ëª…í•œë‹¤. ë‚ ì§œ/시간 ë°ì´í„° 타입 ê°„ ì‚°ìˆ ì—°ì‚°ì— ëŒ€í•œ ë‚´ìš©ì€ :ref:`arithmetic-op-type-casting` ì„ ì°¸ê³ í•œë‹¤. **명시ì 변환** +----------------+------+------+----------+-----------+ | FROM \\ TO | DATE | TIME | DATETIME | TIMESTAMP | +================+======+======+==========+===========+ | **DATE** | \- | X | O | O | +----------------+------+------+----------+-----------+ | **TIME** | X | \- | X | X | +----------------+------+------+----------+-----------+ | **DATETIME** | O | O | \- | O | +----------------+------+------+----------+-----------+ | **TIMESTAMP** | O | O | O | \- | +----------------+------+------+----------+-----------+ **DATE**, **DATETIME**, **TIMESTAMP** íƒ€ìž…ì˜ ì—°, ì›”, ì¼ì—는 0ì„ ìž…ë ¥í• ìˆ˜ 없으나, 예외ì 으로 ë‚ ì§œì™€ ì‹œê°„ì´ ëª¨ë‘ 0ì¸ ê°’ì€ í—ˆìš©í•œë‹¤. 해당 íƒ€ìž…ì˜ ì¹¼ëŸ¼ì— ëŒ€í•œ ì§ˆì˜ ìˆ˜í–‰ 시 ì¸ë±ìŠ¤ê°€ 있으면 ì´ ê°’ì„ ì‚¬ìš©í• ìˆ˜ 있다는 ì ì—서 **NULL** ëŒ€ì‹ ì‚¬ìš©í•˜ë©´ ìœ ìš©í•˜ë‹¤. * **DATE**, **DATETIME**, **TIMESTAMP** íƒ€ìž…ì´ ì¸ìžì¸ ì¼ë¶€ 함수는 ì¸ìžì˜ ë‚ ì§œì™€ 시간 ê°’ì´ ëª¨ë‘ 0ì´ë©´ 시스템 파ë¼ë¯¸í„° **return_null_on_function_errors** ì˜ ê°’ì— ë”°ë¼ ë‹¤ë¥¸ ê°’ì„ ë°˜í™˜í•œë‹¤. **return_null_on_function_errors** ê°€ yesì´ë©´ **NULL** ì„ ë°˜í™˜í•˜ê³ noì´ë©´ ì—러를 반환하며, ê¸°ë³¸ê°’ì€ **no** ì´ë‹¤. * **DATE**, **DATETIME**, **TIMESTAMP** íƒ€ìž…ì„ ë°˜í™˜í•˜ëŠ” í•¨ìˆ˜ë“¤ì€ ë‚ ì§œì™€ 시간 ê°’ì´ ëª¨ë‘ 0ì¸ ê°’ì„ ë°˜í™˜í• ìˆ˜ 있지만 JAVA ì‘ìš© 프로그램ì—서는 ì´ëŸ¬í•œ ê°’ì„ Date ê°ì²´ì— ì €ìž¥í• ìˆ˜ 없다. ë”°ë¼ì„œ ì—°ê²° URL 문ìžì—´ì˜ zeroDateTimeBehavior ì†ì„±(Property) ì„¤ì •ì— ë”°ë¼ì„œ 예외로 처리하거나 **NULL**\ ì„ ë°˜í™˜í•˜ê±°ë‚˜ ë˜ëŠ” ìµœì†Œê°’ì„ ë°˜í™˜í•œë‹¤(ì´ì— 관한 ìžì„¸í•œ ë‚´ìš©ì€ :ref:`jdbc-connection-conf` ì°¸ê³ ). * 시스템 파ë¼ë¯¸í„° **intl_date_lang**\ ì„ ì„¤ì •í•˜ë©´ :func:`TO_DATE`, :func:`TO_TIIME`, :func:`TO_DATETIME`, :func:`TO_TIMESTAMP`, :func:`DATE_FORMAT`, :func:`TIME_FORMAT`, :func:`TO_CHAR`, :func:`STR_TO_DATE` í•¨ìˆ˜ì˜ ìž…ë ¥ 문ìžì—´ 형ì‹ì´ 해당 ë¡œìº˜ì˜ ë‚ ì§œ 형ì‹ì„ 따른다. ìžì„¸í•œ ë‚´ìš©ì€ :ref:`stmt-type-parameters`\ ê³¼ ê° í•¨ìˆ˜ì˜ ì„¤ëª…ì„ ì°¸ê³ í•œë‹¤. * íƒ€ìž„ì¡´ì´ í¬í•¨ëœ íƒ€ìž…ì€ ìƒìœ„ 타입과 ë™ì¼í•œ 변환 ê·œì¹™ì„ ë”°ë¥¸ë‹¤. .. note:: ë‚ ì§œ/시간 타입 ë° íƒ€ìž„ì¡´ì´ ìžˆëŠ” ë‚ ì§œ/시간 íƒ€ìž…ì˜ ë¦¬í„°ëŸ´ì— ëŒ€í•´ì„œëŠ” :ref:`date-time-literal`\ì„ ì°¸ê³ í•œë‹¤. DATE ---- **DATE** ë°ì´í„° íƒ€ìž…ì€ ì—°ë„(*yyyy*), ì›”(*mm*), ì¼(*dd*)ì„ í‘œí˜„í•˜ë©°, ì§€ì› ë²”ìœ„ëŠ” '01/01/0001'ì—서 '12/31/9999'까지ì´ë‹¤. ì—°ë„는 ìƒëžµ 가능하며, ìƒëžµë 경우 현재 ì‹œìŠ¤í…œì˜ ì—°ë„ ê°’ì´ ìžë™ìœ¼ë¡œ ì§€ì •ëœë‹¤. ìž…ë ¥ 형ì‹ì€ 다ìŒê³¼ 같다. :: date'mm/dd[/yyyy]' date'[yyyy-]mm-dd' * ëª¨ë“ í•ëª©ì€ ì •ìˆ˜ 형태로 ìž…ë ¥ë˜ì–´ì•¼ 한다. * CSQLì€ '*MM*/*DD*/*YYYY*' 형ì‹ìœ¼ë¡œ ë‚ ì§œ ê°’ì„ ì¶œë ¥í•˜ê³ , JDBC ì‘ìš© 프로그램 ë° CUBRID ë§¤ë‹ˆì €ëŠ” '*YYYY*-*MM*-*DD*' 형ì‹ìœ¼ë¡œ ë‚ ì§œ ê°’ì„ ì¶œë ¥í•œë‹¤. * 문ìžì—´ íƒ€ìž…ì˜ ë°ì´í„°ë¥¼ **DATE** 타입으로 변환하는 함수는 :func:`TO_DATE` ì´ë‹¤. * ì—°, ì›”, ì¼ì—는 0ì„ ìž…ë ¥í• ìˆ˜ 없으나 예외ì 으로 ì—°, ì›”, ì¼ì´ ëª¨ë‘ 0ì¸ '0000-00-00'ì€ ìž…ë ¥í• ìˆ˜ 있다. * ì´ íƒ€ìž…ì˜ ì¹¼ëŸ¼ì— **DEFAULT** ì†ì„±ì´ ì§€ì •ë 수 있다. :: DATE'2008-10-31'ì€ '10/31/2008'로 ì¶œë ¥ëœë‹¤. DATE'10/31'ì€ '10/31/2011'으로 ì¶œë ¥ëœë‹¤(ì—°ë„ê°€ ìƒëžµë˜ë©´ 현재 ì—°ë„ê°€ ìžë™ìœ¼ë¡œ ì§€ì •ë¨). DATE'00-10-31'ì€ '10/31/2000'로 ì¶œë ¥ëœë‹¤. DATE'0000-10-31'ì€ ì—러가 ì¶œë ¥ëœë‹¤(ì—°ë„ì˜ ìµœì†Œê°’ì€ 1). DATE'70-10-31'ì€ '10/31/1970'로 ì¶œë ¥ëœë‹¤. DATE'0070-10-31'ì€ '10/31/0070'로 ì¶œë ¥ëœë‹¤. TIME ---- **TIME** ë°ì´í„° íƒ€ìž…ì€ ì‹œê°(*hh*), ë¶„(*mi*), ì´ˆ(*ss*) 를 표현하며, ì§€ì› ë²”ìœ„ëŠ” '00:00:00'ì—서 '23:59:59'까지ì´ë‹¤. 초는 ìƒëžµ 가능하며, ìƒëžµë 경우 0초로 ì§€ì •ëœë‹¤. ìž…ë ¥ 형ì‹ì€ 12시간 표기법(AM/PM표기법) ë˜ëŠ” 24시간 í‘œê¸°ë²•ì´ ëª¨ë‘ í—ˆìš©ë˜ë©°, 다ìŒê³¼ ê°™ì´ ìž‘ì„±í•œë‹¤. :: time'hh:mi[:ss] [am | pm]' * ëª¨ë“ í•ëª©ì€ ì •ìˆ˜ë¡œ ìž…ë ¥ë˜ì–´ì•¼ 한다. * CSQLì€ í•ìƒ AM/PM 표기법으로 시간 ê°’ì„ ì¶œë ¥í•˜ê³ , JDBC ì‘ìš© 프로그램 ë° CUBRID ë§¤ë‹ˆì €ëŠ” 24시간 표기법으로 시간 ê°’ì„ ì¶œë ¥í•œë‹¤. * 24시간 표기법으로 시간 ê°’ì„ ìž…ë ¥í• ë•Œì—ë„ AM/PMì„ ì§€ì •í• ìˆ˜ 있으며, ì´ë•Œ 시간 ê°’ê³¼ ì§€ì •ëœ AM ë˜ëŠ” PMì´ ì¼ì¹˜í•˜ì§€ 않으면 오류가 ë°œìƒí•œë‹¤. * ëª¨ë“ ì‹œê°„ ê°’ì€ ë°ì´í„°ë² ì´ìФì—는 24시간 표기법으로 ì €ìž¥ëœë‹¤. * 문ìžì—´ íƒ€ìž…ì˜ ë°ì´í„°ë¥¼ **TIME** 타입으로 변환하는 함수는 :func:`TO_TIME` ì´ë‹¤. * ì´ íƒ€ìž…ì˜ ì¹¼ëŸ¼ì— **DEFAULT** ì†ì„±ì´ ì§€ì •ë 수 있다. :: TIME'00:00:00'ì€ '12:00:00 AM'으로 ì¶œë ¥ëœë‹¤. TIME'1:15'는 '01:15:00 AM'으로 간주ëœë‹¤. TIME'13:15:45'는 '01:15:45 PM'으로 간주ëœë‹¤. TIME'13:15:45 pm'ì€ ì •ìƒì 으로 ì €ìž¥ëœë‹¤. TIME'13:15:45 am'ì€ ì˜¤ë¥˜ê°€ ë°œìƒí•œë‹¤(주어진 시간 ê°’ê³¼ AM/PMì´ ë¶ˆì¼ì¹˜). TIMESTAMP --------- **TIMESTAMP** ë°ì´í„° íƒ€ìž…ì€ ë‚ ì§œ(ì—°, ì›”, ì¼)와 시간(시, ë¶„, ì´ˆ)ì„ ê²°í•©í•œ ë°ì´í„° ê°’ì„ í‘œí˜„í•˜ë©°, GMT로 '1970-01-01 00:00:01'부터 '2038-01-19 03:14:07'까지 í‘œí˜„í• ìˆ˜ 있다. ì´ ë²”ìœ„ë¥¼ 초과하거나 밀리초 ë‹¨ìœ„ì˜ ì‹œê°„ ë°ì´í„°ë¥¼ ì €ìž¥í•˜ëŠ” 경우ë¼ë©´, **DATETIME** ë°ì´í„° íƒ€ìž…ì„ ì´ìš©í• 수 있다. **TIMESTAMP** ë°ì´í„° íƒ€ìž…ì˜ ìž…ë ¥ 형ì‹ì€ 다ìŒê³¼ 같다. :: timestamp'hh:mi[:ss] [am|pm] mm/dd[/yyyy]' timestamp'hh:mi[:ss] [am|pm] [yyyy-]mm-dd' timestamp'mm/dd[/yyyy] hh:mi[:ss] [am|pm]' timestamp'[yyyy-]mm-dd hh:mi[:ss] [am|pm]' * ëª¨ë“ í•ëª©ì€ ì •ìˆ˜ë¡œ ìž…ë ¥ë˜ì–´ì•¼ 한다. * ì—°ë„를 ìƒëžµí•˜ë©´ 기본값으로 현재 ì—°ë„ê°€ ì§€ì •ë˜ê³ , 시간 ê°’(시/ë¶„/ì´ˆ)를 ìƒëžµí•˜ë©´ 12:00:00 AM으로 ì§€ì •ëœë‹¤. * ì‹œìŠ¤í…œì˜ í˜„ìž¬ 타임스탬프 ê°’ì€ :c:macro:`SYS_TIMESTAMP` (ë˜ëŠ” :c:macro:`SYSTIMESTAMP`, :c:macro:`CURRENT_TIMESTAMP`) 함수를 ì´ìš©í•˜ì—¬ **TIMESTAMP** ë°ì´í„° íƒ€ìž…ì— ì €ìž¥í• ìˆ˜ 있다. * :func:`TIMESTAMP` 함수 ë˜ëŠ” :func:`TO_TIMESTAMP` 함수를 사용하면, 문ìžì—´ ë°ì´í„° íƒ€ìž…ì˜ ë°ì´í„°ë¥¼ **TIMESTAMP** ë°ì´í„° 타입으로 ë³€í™˜í• ìˆ˜ 있다. * ì—°, ì›”, ì¼ì—는 0ì„ ìž…ë ¥í• ìˆ˜ 없으나 예외ì 으로 ì—°, ì›”, ì¼, 시, ë¶„, 초가 ëª¨ë‘ 0ì¸ '0000-00-00 00:00:00'ì€ ìž…ë ¥í• ìˆ˜ 있다. GMT timestamp'1970-01-01 12:00:00 AM' ë˜ëŠ” KST timestamp'1970-01-01 09:00:00 AM'ì€ timestamp'0000-00-00 00:00:00'으로 í•´ì„ëœë‹¤. * ì´ íƒ€ìž…ì˜ ì¹¼ëŸ¼ì— **DEFAULT** ì†ì„±ì´ ì§€ì •ë 수 있다. :: TIMESTAMP'10/31'ì€ '12:00:00 AM 10/31/2011'으로 ì¶œë ¥ëœë‹¤(ì—°ë„/ì‹œê°„ì´ ìƒëžµë 경우, 기본값으로 ì¶œë ¥). TIMESTAMP'10/31/2008'ì€ '12:00:00 AM 10/31/2008'로 ì¶œë ¥ëœë‹¤(ì‹œê°„ì´ ìƒëžµë 경우, 기본값으로 ì¶œë ¥). TIMESTAMP'13:15:45 10/31/2008'ì€ '01:15:45 PM 10/31/2008'로 ì¶œë ¥ëœë‹¤. TIMESTAMP'01:15:45 PM 2008-10-31'ì€ '01:15:45 PM 10/31/2008'로 ì¶œë ¥ëœë‹¤. TIMESTAMP'13:15:45 2008-10-31'ì€ '01:15:45 PM 10/31/2008'로 ì¶œë ¥ëœë‹¤. TIMESTAMP'10/31/2008 01:15:45 PM'ì€ '01:15:45 PM 10/31/2008'로 ì¶œë ¥ëœë‹¤. TIMESTAMP'10/31/2008 13:15:45'는 '01:15:45 PM 10/31/2008'로 ì¶œë ¥ëœë‹¤. TIMESTAMP'2008-10-31 01:15:45 PM'ì€ '01:15:45 PM 10/31/2008'로 ì¶œë ¥ëœë‹¤. TIMESTAMP'2008-10-31 13:15:45'는 '01:15:45 PM 10/31/2008'로 ì¶œë ¥ëœë‹¤. TIMESTAMP'2099-10-31 01:15:45 PM'ì€ ì˜¤ë¥˜ê°€ ë°œìƒí•œë‹¤(TIMESTAMP 표현 가능 범위 초과). DATETIME -------- **DATETIME** íƒ€ìž…ì€ ë‚ ì§œ(ë…„, ì›”, ì¼)와 시간(시, ë¶„, ì´ˆ, 밀리초)ì„ ê²°í•©í•œ ë°ì´í„° ê°’ì„ í‘œí˜„í•˜ë©°, GMT로 0001-01-01 00:00:00.000부터 9999-12-31 23:59:59.999까지 í‘œí˜„í• ìˆ˜ 있다. **DATETIME** 타입 ë°ì´í„°ì˜ ìž…ë ¥ 형ì‹ì€ 다ìŒê³¼ 같다. :: datetime'hh:mi[:ss[.msec]] [am|pm] mm/dd[/yyyy]' datetime'hh:mi[:ss[.msec]] [am|pm] [yyyy-]mm-dd' datetime'mm/dd[/yyyy] hh:mi[:ss[.ff]] [am|pm]' datetime'[yyyy-]mm-dd hh:mi[:ss[.ff]] [am|pm]' * ëª¨ë“ í•ëª©ì€ ì •ìˆ˜ë¡œ ìž…ë ¥ë˜ì–´ì•¼ 한다. * ì—°ë„를 ìƒëžµí•˜ë©´ 기본값으로 현재 ì—°ë„ê°€ ì§€ì •ë˜ê³ , 시간 ê°’(시/ë¶„/ì´ˆ/밀리초)를 ìƒëžµí•˜ë©´ 12:00:00.000 AM으로 ì§€ì •ëœë‹¤. * ì‹œìŠ¤í…œì˜ í˜„ìž¬ 타임스탬프 ê°’ì€ :c:macro:`SYS_DATETIME` (ë˜ëŠ” :c:macro:`SYSDATETIME`, :c:macro:`CURRENT_DATETIME`, :func:`CURRENT_DATETIME`, :func:`NOW`)를 ì´ìš©í•˜ì—¬ **DATETIME** íƒ€ìž…ì— ì €ìž¥í• ìˆ˜ 있다. * 문ìžì—´ íƒ€ìž…ì˜ ë°ì´í„°ë¥¼ **DATETIME** 타입으로 변환하는 함수는 :func:`TO_DATETIME` ì´ë‹¤. * ì—°, ì›”, ì¼ì—는 0ì„ ìž…ë ¥í• ìˆ˜ 없으나 예외ì 으로 ì—°, ì›”, ì¼, 시, ë¶„, 초가 ëª¨ë‘ 0ì¸ '0000-00-00 00:00:00'ì€ ìž…ë ¥í• ìˆ˜ 있다. * ì´ íƒ€ìž…ì˜ ì¹¼ëŸ¼ì— **DEFAULT** ì†ì„±ì´ ì§€ì •ë 수 있다. :: DATETIME'10/31'ì€ '12:00:00.000 AM 10/31/2011'으로 ì¶œë ¥ëœë‹¤(ì—°ë„/ì‹œê°„ì´ ìƒëžµë 경우, 기본값으로 ì¶œë ¥). DATETIME'10/31/2008'ì€ '12:00:00.000 AM 10/31/2008'로 ì¶œë ¥ëœë‹¤. DATETIME'13:15:45 10/31/2008'ì€ '01:15:45.000 PM 10/31/2008'로 ì¶œë ¥ëœë‹¤. DATETIME'01:15:45 PM 2008-10-31'ì€ '01:15:45.000 PM 10/31/2008'로 ì¶œë ¥ëœë‹¤. DATETIME'13:15:45 2008-10-31'ì€ '01:15:45.000 PM 10/31/2008'로 ì¶œë ¥ëœë‹¤. DATETIME'10/31/2008 01:15:45 PM'ì€ '01:15:45.000 PM 10/31/2008'로 ì¶œë ¥ëœë‹¤. DATETIME'10/31/2008 13:15:45'는 '01:15:45.000 PM 10/31/2008'로 ì¶œë ¥ëœë‹¤. DATETIME'2008-10-31 01:15:45 PM'ì€ '01:15:45.000 PM 10/31/2008'로 ì¶œë ¥ëœë‹¤. DATETIME'2008-10-31 13:15:45'는 '01:15:45.000 PM 10/31/2008'로 ì¶œë ¥ëœë‹¤. DATETIME'2099-10-31 01:15:45 PM'ì€ '01:15:45.000 PM 10/31/2099'로 ì¶œë ¥ëœë‹¤. .. _cast-string-to-datetime: 문ìžì—´ì„ ë‚ ì§œ/시간 타입으로 CAST -------------------------------- .. _cast-to-datetime-recommend: ë‚ ì§œ/시간 타입 문ìžì—´ 권장 í˜•ì‹ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :func:`CAST` ì—°ì‚°ìžë¥¼ 사용하여 문ìžì—´ì„ ë‚ ì§œ/시간 타입으로 ë³€í™˜í• ë•Œì—는 문ìžì—´ì„ 다ìŒê³¼ ê°™ì€ í˜•ì‹ìœ¼ë¡œ 작성하는 ê²ƒì„ ê¶Œìž¥í•œë‹¤. ì°¸ê³ ë¡œ, :func:`CAST` ì—°ì‚°ìžì—서 사용하는 ë‚ ì§œ/시간 문ìžì—´ 형ì‹ì€ DB ìƒì„± 시 ì§€ì •í•˜ëŠ” ë¡œìº˜ì˜ ì˜í–¥ì„ 받지 않는다. ë˜í•œ, :func:`TO_DATE`, :func:`TO_TIME`, :func:`TO_DATETIME`, :func:`TO_TIMESTAMP` 함수ì—서 문ìžì—´ì— 대한 ë‚ ì§œ/시간 형ì‹ì„ ìƒëžµí•˜ëŠ” 경우ì—ë„ ë‚ ì§œ/시간 문ìžì—´ 형ì‹ì„ 아래와 ê°™ì´ ìž‘ì„±í•œë‹¤. * **DATE** 타입 :: YYYY-MM-DD MM/DD/YYYY * **TIME** 타입 :: HH:MI:SS [AM|PM] * **DATETIME** 타입 :: YYYY-MM-DD HH:MI:SS[.msec] [AM|PM] HH:MI:SS[.msec] [AM|PM] YYYY-MM-DD MM/DD/YYYY HH:MI:SS[.msec] [AM|PM] HH:MI:SS[.msec] [AM|PM] MM/DD/YYYY * **TIMESTAMP** 타입 :: YYYY-MM-DD HH:MI:SS [AM|PM] HH:MI:SS [AM|PM] YYYY-MM-DD MM/DD/YYYY HH:MI:SS [AM|PM] HH:MI:SS [AM|PM] MM/DD/YYYY ë‚ ì§œ/시간 타입 문ìžì—´ 허용 í˜•ì‹ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :func:`CAST` ì—°ì‚°ìžëŠ” ë‚ ì§œ/시간 문ìžì—´ì— 대해 아래와 ê°™ì€ í˜•ì‹ì„ 허용한다. **DATE 문ìžì—´ 허용 형ì‹** :: [year sep] month sep day * 2011-04-20 : 2011ë…„ 4ì›” 20ì¼ * 04-20 : 올해 4ì›” 20ì¼ êµ¬ë¶„ìž(*sep*)ê°€ 빗금(/)ì¼ ë•Œì—는 다ìŒê³¼ ê°™ì€ ìˆœì„œë¡œ ì¸ì‹í•œë‹¤. :: month/day[/year] * 04/20/2011 : 2011ë…„ 4ì›” 20ì¼ * 04/20 : 올해 4ì›” 20ì¼ êµ¬ë¶„ìž(*sep*)를 사용하지 ì•Šì„ ë•Œì—는 다ìŒê³¼ ê°™ì€ í˜•ì‹ìœ¼ë¡œ ì¸ì‹í•œë‹¤. ì—°ë„는 한 ìžë¦¬, ë‘ ìžë¦¬, 네 ìžë¦¬ë¥¼ í—ˆìš©í•˜ê³ , ì›”ì€ í•œ ìžë¦¬, ë‘ ìžë¦¬ë¥¼ 허용한다. ì¼ì€ í•ìƒ ë‘ ìžë¦¬ë¥¼ ìž…ë ¥í•´ì•¼ 한다. :: YYYYMMDD YYMMDD YMMDD MMDD MDD * 20110420 : 2011ë…„ 4ì›” 20ì¼ * 110420 : 2011ë…„ 4ì›” 20ì¼ * 420 : 올해 4ì›” 20ì¼ **TIME 문ìžì—´ 허용 형ì‹** :: [hour]:min[:[sec]][.[msec]] [am|pm] * 09:10:15.359 am : ì˜¤ì „ 9시 10ë¶„ 15ì´ˆ(0.359초는 버림) * 09:10:15 : ì˜¤ì „ 9시 10ë¶„ 15ì´ˆ * 09:10 : ì˜¤ì „ 9시 10ë¶„ * \:10 : ì˜¤ì „ 12시 10ë¶„ :: [[[[[[Y]Y]Y]Y]M]MDD]HHMISS[.[msec]] [am|pm] * 20110420091015.359 am : ì˜¤ì „ 9시 10ë¶„ 15ì´ˆ * 0420091015 : ì˜¤ì „ 9시 10ë¶„ 15ì´ˆ :: [H]HMMSS[.[msec]] [am|pm] * 091015.359 am : ì˜¤ì „ 9시 10ë¶„ 15ì´ˆ * 91015 : ì˜¤ì „ 9시 10ë¶„ 15ì´ˆ :: [M]MSS[.[msec]] [am|pm] * 1015.359 am : ì˜¤ì „ 12시 10ë¶„ 15ì´ˆ * 1015 : ì˜¤ì „ 12시 10ë¶„ 15ì´ˆ :: [S]S[.[msec]] [am|pm] * 15.359 am : ì˜¤ì „ 12시 0ë¶„ 15ì´ˆ * 15 : ì˜¤ì „ 12시 0ë¶„ 15ì´ˆ .. note:: CUBRID 2008 R3.1 ì´í•˜ ë²„ì „ì—서는 [H]H 형ì‹ì„ 허용했다. 즉 R3.1 ì´í•˜ ë²„ì „ì—서 문ìžì—´ '10'ì€ **TIME**'10:00:00'으로 변환ë˜ì—ˆìœ¼ë‚˜, R4.0부터는 **TIME**'00:00:10' 으로 변환ëœë‹¤. **DATETIME 문ìžì—´ 허용 형ì‹** :: [year sep] month sep day [sep] [sep] hour [sep min[sep sec[.[msec]]]] * 04-20 09 : 올해 4ì›” 20ì¼ ì˜¤ì „ 9시 :: month/day[/year] [sep] hour [sep min [sep sec[.[msec]]]] * 04/20 09 : 올해 4ì›” 20ì¼ ì˜¤ì „ 9시 :: year sep month sep day sep hour [sep min[sep sec[.[msec]]]] * 2011-04-20 09 : 2011ë…„ 4ì›” 20ì¼ ì˜¤ì „ 9시 :: month/day/year sep hour [sep min[sep sec [.[msec]]]] * 04/20/2011 09 : 2011ë…„ 4ì›” 20ì¼ ì˜¤ì „ 9시 :: YYMMDDH (ì‹œê°„ì´ í•œ ìžë¦¬ ìˆ˜ì¼ ë•Œì—ë§Œ 허용) * 1104209 : 2011ë…„ 4ì›” 20ì¼ ì˜¤ì „ 9시 :: YYMMDDHHMI[SS[.msec]] * 1104200910.359 : 2011ë…„ 4ì›” 20ì¼ ì˜¤ì „ 9시 10ë¶„(0.359초는 버림) * 110420091000.359 : 2011ë…„ 4ì›” 20ì¼ ì˜¤ì „ 9시 10ë¶„ 0.359ì´ˆ :: YYYYMMDDHHMISS[.msec] * 201104200910.359 : 2020ë…„ 11ì›” 4ì¼ ì˜¤í›„ 8시 9ë¶„ 10.359ì´ˆ * 20110420091000.359 : 2011ë…„ 4ì›” 20ì¼ ì˜¤ì „ 9시 10ë¶„ 0.359ì´ˆ **시간-ë‚ ì§œ ìˆœì„œì˜ ë¬¸ìžì—´ 허용 형ì‹** :: [hour]:min[:sec[.msec]] [am|pm] [year-]month-day * 09:10:15.359 am 2011-04-20 : 2011ë…„ 4ì›” 20ì¼ ì˜¤ì „ 9시 10ë¶„ 15.359ì´ˆ * \:10 04-20 : 올해 4ì›” 20ì¼ ì˜¤ì „ 12시 10ë¶„ :: [hour]:min[:sec[.msec]] [am|pm] month/day[/[year]] * 09:10:15.359 am 04/20/2011 : 2011ë…„ 4ì›” 20ì¼ ì˜¤ì „ 9시 10ë¶„ 15.359ì´ˆ * \:10 04/20 : 올해 4ì›” 20ì¼ ì˜¤ì „ 12시 10ë¶„ :: hour[:min[:sec[.[msec]]]] [am|pm] [year-]month-day * 09:10:15.359 am 04-20 : 올해 4ì›” 20ì¼ ì˜¤ì „ 9시 10ë¶„ 15.359ì´ˆ * 09 04-20 : 올해 4ì›” 20ì¼ ì˜¤ì „ 9시 :: hour[:min[:sec[.[msec]]]] [am|pm] month/day[/[year]] * 09:10:15.359 am 04/20 : 올해 4ì›” 20ì¼ ì˜¤ì „ 9시 10ë¶„ 15.359ì´ˆ * 09 04/20 : 올해 4ì›” 20ì¼ ì˜¤ì „ 9시 **규칙** *msec*\ì€ ë°€ë¦¬ì´ˆë¥¼ 나타내는 ì¼ë ¨ì˜ 숫ìžì´ë‹¤. 앞ì—서 네 번째 ìžë¦¬ë¶€í„° ì´í›„ì˜ ìˆ«ìžëŠ” 무시ëœë‹¤. ê°’ 사ì´ë¥¼ 구분하는 구분ìžì˜ ê·œì¹™ì€ ë‹¤ìŒê³¼ 같다. * **TIME** 문ìžì—´ì€ 시간 구분ìžë¡œ í•ìƒ í•˜ë‚˜ì˜ ì½œë¡ (:)ì„ ì‚¬ìš©í•´ì•¼ 한다. * **DATE** 와 **DATETIME** 문ìžì—´ì€ êµ¬ë¶„ìž ì—†ì´ ì—°ì†ëœ 숫ìžë¡œ 나타낼 수 ìžˆê³ , **DATETIME** 문ìžì—´ì€ 시간과 ë‚ ì§œë¥¼ 공백으로 êµ¬ë¶„í• ìˆ˜ 있다. * ìž…ë ¥ 문ìžì—´ 안ì—서 구분ìžë“¤ì€ ë™ì¼í•´ì•¼ 한다. * 시간-ë‚ ì§œ ìˆœì„œì˜ ë¬¸ìžì—´ì€ 시간 구분ìžë¡œ ì½œë¡ (:)ë§Œ ì‚¬ìš©í• ìˆ˜ 있으며, ë‚ ì§œ 구분ìžë¡œëŠ” 하ì´í”ˆ(-)ì´ë‚˜ 빗금(/)ë§Œ ì‚¬ìš©í• ìˆ˜ 있다. ë‚ ì§œ ìž…ë ¥ 시 하ì´í”ˆì„ 사용하는 경우 yyyy-mm-dd 순으로 ìž…ë ¥í•˜ë©°, 빗금(/)ì„ ì‚¬ìš©í•˜ëŠ” 경우 mm/dd/yyyy 순으로 ìž…ë ¥í•œë‹¤. ë‚ ì§œ ë¶€ë¶„ì˜ ë¬¸ìžì—´ì—는 ë‹¤ìŒ ê·œì¹™ì´ ì ìš©ëœë‹¤. * ì—°ë„는 êµ¬ë¬¸ì´ í—ˆìš©í•˜ëŠ” 한 ìƒëžµí• 수 있다. * ì—°ë„를 ë‘ ìžë¦¬ë¡œ ìž…ë ¥í•˜ë©´ 1970ë…„~2069ë…„ ë²”ìœ„ì˜ ì—°ë„를 나타낸다. 즉, YY<70 ì´ë©´ 2000+YY으로 ì²˜ë¦¬í•˜ê³ , YY>=70ì´ë©´ 1900+YY으로 처리한다. 한 ìžë¦¬ë‚˜ 세 ìžë¦¬, 네 ìžë¦¬ 숫ìžë¡œ ì—°ë„를 ìž…ë ¥í•˜ë©´ 해당 ìˆ«ìž ê·¸ëŒ€ë¡œë¥¼ 나타낸다. * 문ìžì—´ ì•žë’¤ì˜ ê³µë°±ê³¼ ë’¤ì˜ ë¬¸ìžì—´ì€ 무시ëœë‹¤. **DATETIME**, **TIME** 문ìžì—´ì„ 위한 am/pm ì§€ì •ìžëŠ” 시간 ê°’ì˜ ì¼ë¶€ë¡œ ì¸ì‹í•˜ì§€ë§Œ, ê³µë°±ì´ ì•„ë‹Œ 문ìžê°€ ë’¤ì— ë¶™ìœ¼ë©´ am/pm ì§€ì •ìžë¡œ ì¸ì‹ë˜ì§€ 않는다. CUBRIDì˜ **TIMESTAMP** íƒ€ìž…ì€ **DATE** 타입과 **TIME** 타입으로 구성ë˜ê³ , **DATETIME** íƒ€ìž…ì€ **DATE** 타입과 **TIME** íƒ€ìž…ì— ë°€ë¦¬ì´ˆ(milliseconds)ê°€ ë”í•´ì ¸ì„œ 구성ëœë‹¤. ìž…ë ¥ 문ìžì—´ì€ ë‚ ì§œ(**DATE** 문ìžì—´), 시간(**TIME** 문ìžì—´), í˜¹ì€ ë‘˜ 다(**DATETIME** 문ìžì—´) í¬í•¨í• 수 있다. íŠ¹ì • íƒ€ìž…ì˜ ë°ì´í„°ë¥¼ ë³´ìœ í•œ 문ìžì—´ì€ 다른 íƒ€ìž…ìœ¼ë¡œë„ ë³€í™˜ë 수 있으며 다ìŒê³¼ ê°™ì€ ê·œì¹™ì´ ì ìš©ëœë‹¤. * **DATE** 문ìžì—´ì„ **DATETIME** 타입으로 변환하면 시간 ê°’ì€ '00:00:00'ì´ ëœë‹¤. * **TIME** 문ìžì—´ì„ **DATETIME** 타입으로 변환하면 ì½œë¡ (:)ì´ ë‚ ì§œ 구분ìžë¡œ ì¸ì‹ë˜ì–´ **TIME** 문ìžì—´ì´ ë‚ ì§œë¥¼ 나타내는 문ìžì—´ë¡œ ì¸ì‹ë˜ê³ , 시간 ê°’ì€ '00:00:00'ì´ ëœë‹¤. * **DATETIME** 문ìžì—´ì„ **DATE** 타입으로 변환하면 결과값ì—서 시간 ë¶€ë¶„ì€ ë¬´ì‹œë˜ì§€ë§Œ, 시간 ìž…ë ¥ê°’ì˜ í˜•ì‹ì€ ìœ íš¨í•´ì•¼ 한다. * **DATETIME** 문ìžì—´ì„ **TIME** 타입으로 ë³€í™˜í• ìˆ˜ 있지만, 다ìŒê³¼ ê°™ì€ ê·œì¹™ì´ ì ìš©ëœë‹¤. * 문ìžì—´ì— 있는 ë‚ ì§œì™€ ì‹œê°„ì€ ìµœì†Œí•œ í•˜ë‚˜ì˜ ê³µë°±ì— ì˜í•´ 구분ë˜ì–´ì•¼ 한다. * 결과값ì—서 ë‚ ì§œ ë¶€ë¶„ì€ ë¬´ì‹œë˜ì§€ë§Œ, ë‚ ì§œ ìž…ë ¥ê°’ì˜ í˜•ì‹ì´ ìœ íš¨í•´ì•¼ 한다. * ë‚ ì§œ ë¶€ë¶„ì˜ ì—°ë„ê°€ 4ìžë¦¬ ì´ìƒì´ê±°ë‚˜(0으로 ì‹œìž‘í• ìˆ˜ 있ìŒ), 시간 ë¶€ë¶„ì´ ìµœì†Œí•œ 시와 ë¶„([H]H:[M]M)ì„ í¬í•¨í•´ì•¼ 한다. ê·¸ë ‡ì§€ 않으면 ë‚ ì§œ ë¶€ë¶„ì´ [MM]SS í¬ë§·ì˜ **TIME** 타입으로 ì¸ì‹ë˜ê³ , ë’¤ì´ì–´ 나오는 문ìžì—´ì€ 무시ëœë‹¤. * **DATETIME** 문ìžì—´ì˜ ê° ë‹¨ìœ„(ë…„, ì›”, ì¼, 시, ë¶„, ì´ˆ) 중 하나가 999999보다 í¬ë©´, 숫ìžê°€ 아닌 것으로 ì¸ì‹í•˜ì—¬ 해당 단위가 í¬í•¨ëœ 문ìžì—´ì´ 무시ëœë‹¤. 예를 들어 '2009-10-21 20:9943:10'ì€ ë¶„ ë‹¨ìœ„ì˜ ê°’ì´ ë²”ìœ„ë¥¼ 벗어나므로 ì—러가 ë°œìƒí•œë‹¤. 그러나 '2009-10-21 20:1000123:10'ì´ ìž…ë ¥ë˜ë©´ '2009'를 MMSS í¬ë§·ì˜ **TIME** 타입으로 ì¸ì‹í•˜ì—¬ **TIME**'00:20:09'를 반환한다. * 시간-ë‚ ì§œ ìˆœì„œì˜ ë¬¸ìžì—´ì„ **TIME** 타입으로 변환하면 문ìžì—´ì˜ ë‚ ì§œ ë¶€ë¶„ì€ ë¬´ì‹œë˜ì§€ë§Œ, ë‚ ì§œ ë¶€ë¶„ì˜ í˜•ì‹ì€ ìœ íš¨í•´ì•¼ 한다. * 시간 ë¶€ë¶„ì´ ìžˆëŠ” ëª¨ë“ ìž…ë ¥ 문ìžì—´ì€ 변환 시 [*msec*] ì„ í—ˆìš©í•˜ì§€ë§Œ, **DATETIME** 타입만 ê·¸ ê°’ì„ ìœ ì§€í•œë‹¤. **DATE**, **TIMESTAMP**, **TIME** 와 ê°™ì€ íƒ€ìž…ìœ¼ë¡œ 변환하면 *msec* ê°’ì„ ë²„ë¦°ë‹¤. * **DATETIME**, **TIME** 문ìžì—´ì—ì„œì˜ ëª¨ë“ ë³€í™˜ì€ ì‹œê°„ ê°’ ë’¤ì— ë‚˜ì˜¤ëŠ” ì˜ë¬¸ 로캘(locale) ë˜ëŠ” ì„œë²„ì˜ í˜„ìž¬ 로캘로 쓰여진 am/pm ì§€ì •ìžë¥¼ 허용한다. .. code-block:: sql SELECT CAST('420' AS DATE); :: cast('420' as date) ====================== 04/20/2012 .. code-block:: sql SELECT CAST('91015' AS TIME); :: cast('91015' as time) ======================== 09:10:15 AM .. code-block:: sql SELECT CAST('110420091035.359' AS DATETIME); :: cast('110420091035.359' as datetime) ======================================= 09:10:35.359 AM 04/20/2011 .. code-block:: sql SELECT CAST('110420091035.359' AS TIMESTAMP); :: cast('110420091035.359' as timestamp) ======================================== 09:10:35 AM 04/20/2011 .. CUBRIDSUS-14182 현재 timeltzê°€ offsetì„ í—ˆìš©í•˜ë ¤ë©´ timezone 파ë¼ë¯¸í„° ê°’ ì—시 오프셋으로 ì„¤ì •ë˜ì–´ì•¼ 함. 버그로 ìˆ˜ì • ì˜ˆì •(?): ìˆ˜ì • ì—¬ë¶€ì— ë”°ë¼ ì•„ëž˜ ì„¤ëª…ì„ ë°”ê¿€ 것. .. _timezone-type: íƒ€ìž„ì¡´ì´ ìžˆëŠ” ë‚ ì§œ/시간 ë°ì´í„° 타입 =================================== íƒ€ìž„ì¡´ì´ ìžˆëŠ” ë‚ ì§œ/시간 ë°ì´í„° íƒ€ìž…ì€ íƒ€ìž„ì¡´ì„ ëª…ì‹œí•˜ì—¬ ìž…ë ¥í•˜ê±°ë‚˜ ì¶œë ¥í• ìˆ˜ 있는 ë‚ ì§œ/시간 타입ì´ë‹¤. íƒ€ìž„ì¡´ì„ ì„¤ì •í•˜ëŠ” ë°©ë²•ì€ ì§€ì— ì´ë¦„ì„ ëª…ì‹œí•˜ëŠ” 방법과 ì‹œê°„ì˜ ì˜¤í”„ì…‹ì„ ëª…ì‹œí•˜ëŠ” ë°©ë²•ì´ ìžˆë‹¤. ê¸°ì¡´ì˜ ë‚ ì§œ/시간 타입 ì´ë¦„ ë’¤ì— TZ ë˜ëŠ” LTZê°€ 붙어 있는 경우 타임존 ì •ë³´ë¥¼ ê³ ë ¤í•˜ê²Œ ë˜ëŠ”ë°, TZ는 íƒ€ìž„ì¡´ì„ ì˜ë¯¸í•˜ë©°, LTZ는 로컬 íƒ€ìž„ì¡´ì„ ì˜ë¯¸í•œë‹¤. * TZ íƒ€ìž…ì€ <date/time type> WITH TIME ZONEìœ¼ë¡œë„ í‘œí˜„ì´ ê°€ëŠ¥í•˜ë‹¤. ë‚´ë¶€ì 으로 UTC 시간과 ìƒì„± 시 타임존 ì •ë³´(사용ìžê°€ 명시하거나 세션 íƒ€ìž„ì¡´ì— ì˜í•´ ê²°ì •ë¨)를 ì €ìž¥í•œë‹¤. TZ íƒ€ìž…ì€ íƒ€ìž„ì¡´ì„ ì €ìž¥í•˜ê¸° 위해 4ë°”ì´íŠ¸ê°€ 추가로 필요하다. * LTZ íƒ€ìž…ì€ <date/time type> WITH LOCAL TIME ZONEìœ¼ë¡œë„ í‘œí˜„ì´ ê°€ëŠ¥í•˜ë‹¤. ë‚´ë¶€ì 으로 UTC ì‹œê°„ì„ ì €ìž¥í•˜ë©°, ì¶œë ¥ 시 로컬(í˜„ìž¬ì˜ ì„¸ì…˜) 타임존으로 변환ëœë‹¤. íƒ€ìž„ì¡´ì´ ì—†ëŠ” 타입과 비êµí•˜ê¸° 위해, ë‹¤ìŒ í‘œì—는 íƒ€ìž„ì¡´ì´ ì—†ëŠ” 타입과 íƒ€ìž„ì¡´ì´ ìžˆëŠ” íƒ€ìž…ì„ í•¨ê»˜ 설명하였다. í‘œì˜ ì„¤ëª…ì— ìžˆëŠ” UTC는 í˜‘ì • 세계시(Coordinated Universal Time)를 나타낸다. +-----------+----------------+-------------------------+-----------------------------------+--------------------------------------------+-----------------------------------------------------------------+ | 구분 | 타입 | ìž…ë ¥ | ì €ìž¥ | ì¶œë ¥ | 설명 | +===========+================+=========================+===================================+============================================+=================================================================+ | DATE | DATE | 타임존 비í¬í•¨ | ìž…ë ¥ ê°’ | ì ˆëŒ€ ê°’(ìž…ë ¥ ê°’ê³¼ ë™ì¼) | ë‚ ì§œ | +-----------+----------------+-------------------------+-----------------------------------+--------------------------------------------+-----------------------------------------------------------------+ | DATETIME | DATETIME | 타임존 비í¬í•¨ | ìž…ë ¥ ê°’ | ì ˆëŒ€ ê°’(ìž…ë ¥ ê°’ê³¼ ë™ì¼) | 밀리초를 í¬í•¨í•œ ë‚ ì§œ/시간 | | +----------------+-------------------------+-----------------------------------+--------------------------------------------+-----------------------------------------------------------------+ | | DATETIMETZ | 타임존 í¬í•¨ | UTC + 타임존(ì§€ì— ë˜ëŠ” 오프셋) | ì ˆëŒ€ ê°’(ìž…ë ¥í•œ 타임존 ìœ ì§€) | ë‚ ì§œ/시간 + 타임존 ì •ë³´ | | +----------------+-------------------------+-----------------------------------+--------------------------------------------+-----------------------------------------------------------------+ | | DATETIMELTZ | 타임존 í¬í•¨ | UTC | ìƒëŒ€ ê°’(세션 íƒ€ìž„ì¡´ì— ë”°ë¼ ë³€í™˜ë¨) | 세션 타임존ì—ì„œì˜ ë‚ ì§œ/시간 | +-----------+----------------+-------------------------+-----------------------------------+--------------------------------------------+-----------------------------------------------------------------+ | TIME | TIME | 타임존 비í¬í•¨ | ìž…ë ¥ ê°’ | ì ˆëŒ€ ê°’(ìž…ë ¥ ê°’ê³¼ ë™ì¼) | 시간 | +-----------+----------------+-------------------------+-----------------------------------+--------------------------------------------+-----------------------------------------------------------------+ | TIMESTAMP | TIMESTAMP | 타임존 비í¬í•¨ | UTC | ìƒëŒ€ ê°’(세션 타임 ì¡´ì— ë”°ë¼ ë³€í™˜ë¨) | ìž…ë ¥ ê°’ì„ ì„¸ì…˜ íƒ€ìž„ì¡´ì˜ ê°’ìœ¼ë¡œ í•´ì„함 | | +----------------+-------------------------+-----------------------------------+--------------------------------------------+-----------------------------------------------------------------+ | | TIMESTAMPTZ | 타임존 í¬í•¨ | UTC + 타임존(ì§€ì— ë˜ëŠ” 오프셋) | ì ˆëŒ€ ê°’(ìž…ë ¥í•œ 타임존 ìœ ì§€) | UTC + íƒ€ìž„ì¡´ì´ ìžˆëŠ” 타임스탬프 | | +----------------+-------------------------+-----------------------------------+--------------------------------------------+-----------------------------------------------------------------+ | | TIMESTAMPLTZ | 타임존 í¬í•¨ | UTC | ìƒëŒ€ ê°’(세션 íƒ€ìž„ì¡´ì— ë”°ë¼ ë³€í™˜ë¨) | 세션 타임존. TIMESTAMPì˜ ê°’ê³¼ ê°™ìŒ. | | | | | | | ì¶œë ¥í• ë•Œ 타임존 ì§€ì •ìžë¥¼ í¬í•¨í•¨ | +-----------+----------------+-------------------------+-----------------------------------+--------------------------------------------+-----------------------------------------------------------------+ íƒ€ìž„ì¡´ì´ ìžˆëŠ” ë‚ ì§œ/시간 íƒ€ìž…ì˜ ìµœëŒ€ê°’, 최소값, 범위와 í•´ìƒë„ 등 나머지 íŠ¹ì§•ë“¤ì€ ì¼ë°˜ì ì¸ ë‚ ì§œ/시간 íƒ€ìž…ì˜ íŠ¹ì§•ê³¼ ë™ì¼í•˜ë‹¤. .. note:: * CUBRIDì—서, TIMESTAMPê°€ 1970ë…„ 1ì›” 1ì¼ UTC ì´í›„ ê²½ê³¼ëœ 'ì´ˆ'로 ë³´ê´€ëœë‹¤(UNIX 시간). * 타 DBMSì˜ TIMESTAMP는 CUBRID ì˜ DATETIME ê³¼ 비슷한 ë°©ì‹ì´ë©° 'milliseconds'를 보관한다. 타임존 íƒ€ìž…ì„ ì‚¬ìš©í•˜ëŠ” í•¨ìˆ˜ì˜ ì˜ˆë¥¼ ë³´ë ¤ë©´ 다ìŒì„ ì°¸ê³ í•œë‹¤. :doc:`function/datetime_fn` 다ìŒì€ 세션 íƒ€ìž„ì¡´ì˜ ë³€ê²½ì— ë”°ë¼ DATETIME, DATETIMETZ와 DATETIMELTZì˜ ì¶œë ¥ ê°’ì´ ë‹¤ë¥´ê²Œ 나타나는 예ì´ë‹¤. .. code-block:: sql -- csql> ;set timezone="+09" CREATE TABLE tbl (a DATETIME, b DATETIMETZ, c DATETIMELTZ); INSERT INTO tbl VALUES (datetime'2015-02-24 12:30', datetimetz'2015-02-24 12:30', datetimeltz'2015-02-24 12:30'); SELECT * FROM tbl :: 12:30:00.000 PM 02/24/2015 12:30:00.000 PM 02/24/2015 +09:00 12:30:00.000 PM 02/24/2015 +09:00 .. code-block:: sql -- csql> ;set timezone="+07" SELECT * FROM tbl; :: 12:30:00.000 PM 02/24/2015 12:30:00.000 PM 02/24/2015 +09:00 10:30:00.000 AM 02/24/2015 +07:00 다ìŒì€ 세션 íƒ€ìž„ì¡´ì˜ ë³€ê²½ì— ë”°ë¼ TIMESTAMP, TIMESTAMPTZ와 TIMESTAMPLTZì˜ ì¶œë ¥ ê°’ì´ ë‹¤ë¥´ê²Œ 나타나는 예ì´ë‹¤. .. code-block:: sql -- ;set timezone="+09" CREATE TABLE tbl (a TIMESTAMP, b TIMESTAMPTZ, c TIMESTAMPLTZ); INSERT INTO tbl VALUES (timestamp'2015-02-24 12:30', timestamptz'2015-02-24 12:30', timestampltz'2015-02-24 12:30'); SELECT * FROM tbl; :: 12:30:00 PM 02/24/2015 12:30:00 PM 02/24/2015 +09:00 12:30:00 PM 02/24/2015 +09:00 .. code-block:: sql -- csql> ;set timezone="+07" SELECT * FROM tbl; :: 10:30:00 AM 02/24/2015 12:30:00 PM 02/24/2015 +09:00 10:30:00 AM 02/24/2015 +07:00 **문ìžì—´ì„ TIMESTAMP 타입으로 변환** 문ìžì—´ì„ timestamp/timestampltz/timestamptz로 변환하는 ìž‘ì—…ì€ ë¬¸ìžì—´ë¡œë¶€í„° TIMESTAMP ê°ì²´ë¥¼ ìƒì„±í•˜ëŠ” ê³¼ì •ì—서 수행ëœë‹¤. +----------------------------+-----------------------------+----------------------------+------------------------------+ | From/to | Timestamp | Timestampltz | Timestamptz | +============================+=============================+============================+==============================+ | String (타임존 ìƒëžµ) | 세션 타임존으로 | 세션 타임존으로 | 세션 타임존으로 | | | ë‚ ì§œ/ì‹œê°„ì„ UTC로 ë³€í™˜í•˜ê³ | ë‚ ì§œ/ì‹œê°„ì„ UTC로 ë³€í™˜í•˜ê³ | ë‚ ì§œ/ì‹œê°„ì„ UTC로 ë³€í™˜í•˜ê³ | | | Unix 시간으로 ì¸ì½”딩하여 | Unix 시간으로 ì¸ì½”딩하여 | Unix 시간과 ì„¸ì…˜ì˜ TZ_ID로 | | | ì €ìž¥ | ì €ìž¥ | ì¸ì½”딩하여 ì €ìž¥ | | | | | | +----------------------------+-----------------------------+----------------------------+------------------------------+ | String (타임존 í¬í•¨) | 오류 (timestamp ì—서는 | 문ìžì—´ì˜ 타임존으로 | 문ìžì—´ì˜ 타임존으로 | | | íƒ€ìž„ì¡´ì„ í—ˆìš© 하지 않ìŒ) | ë‚ ì§œ/ì‹œê°„ì„ UTC로 ë³€í™˜í•˜ê³ | ë‚ ì§œ/ì‹œê°„ì„ UTC로 ë³€í™˜í•˜ê³ | | | | Unix 시간으로 ì¸ì½”딩하여 | Unix 시간과 ì„¸ì…˜ì˜ TZ_ID로 | | | | ì €ìž¥ | ì¸ì½”딩하여 ì €ìž¥ | | | | | | +----------------------------+-----------------------------+----------------------------+------------------------------+ **문ìžì—´ì„ DATETIME 타입으로 변환** 문ìžì—´ì„ datetime/datetimeltz/datetimetz로 변환하는 ìž‘ì—…ì€ ë¬¸ìžì—´ë¡œë¶€í„° DATETIME ê°ì²´ë¥¼ ìƒì„±í•˜ëŠ” ê³¼ì •ì—서 수행ëœë‹¤. +----------------------------+-----------------------------+----------------------------+------------------------------+ | From/to | Datetime | Datetimeltz | Datetimetz | +============================+=============================+============================+==============================+ | String (타임존 ìƒëžµ) | 문ìžì—´ì—서 ë¶„ì„ëœ | 세션 타임존으로 | 세션 타임존으로 | | | ê°’ì„ ì €ìž¥ | ë‚ ì§œ/ì‹œê°„ì„ UTC로 ë³€í™˜í•˜ê³ | ë‚ ì§œ/ì‹œê°„ì„ UTC로 ë³€í™˜í•˜ê³ | | | | 새로운 값들로 ì €ìž¥ | 새로운 ê°’ê³¼ ì„¸ì…˜ì˜ TZ_ID로 | | | | | ì €ìž¥ | | | | | | +----------------------------+-----------------------------+----------------------------+------------------------------+ | String (타임존 í¬í•¨) | 오류 (datetime ì—서는 | 문ìžì—´ì˜ 타임존으로 | 문ìžì—´ì˜ 타임존으로 | | | íƒ€ìž„ì¡´ì„ í—ˆìš© 하지 않ìŒ) | ë‚ ì§œ/ì‹œê°„ì„ UTC로 ë³€í™˜í•˜ê³ | ë‚ ì§œ/ì‹œê°„ì„ UTC로 ë³€í™˜í•˜ê³ | | | | 새로운 값들로 ì €ìž¥ | 새로운 ê°’ê³¼ ì„¸ì…˜ì˜ TZ_ID로 | | | | | ì €ìž¥ | | | | | | +----------------------------+-----------------------------+----------------------------+------------------------------+ **DATETIME ë° TIMESTAMP íƒ€ìž…ì„ ë¬¸ìžì—´ë¡œ 변환** +----------------------------+-----------------------------+----------------------------+------------------------------+ | From/to | String (타임존 ì¶œë ¥ 불허) | String (타임존 | String (타임존 ë¹„ìš”ì² - ìžë™ | | | | ê°•ì œì¶œë ¥) | ì„ íƒ) | +============================+=============================+============================+==============================+ | TIMESTAMP | 세션 타임존으로 Unix ì‹œê°„ì„ | 세션 타임존으로 Unix 시간ì„| 세션 타임존으로 Unix ì‹œê°„ì„ | | | 디코딩한 후 ì¶œë ¥ | 디코딩한 후 세션 타임존 | 디코딩한 후 ì¶œë ¥. 세션 타임존| | | | 문ìžì—´ê³¼ 함께 ì¶œë ¥ | 문ìžì—´ì€ ì¶œë ¥í•˜ì§€ ì•ŠìŒ | +----------------------------+-----------------------------+----------------------------+------------------------------+ | TIMESTAMPLTZ | 세션 타임존으로 Unix ì‹œê°„ì„ | 세션 타임존으로 Unix 시간ì„| 세션 타임존으로 Unix ì‹œê°„ì„ | | | 디코딩한 후 ì¶œë ¥ | 디코딩한 후 세션 타임존 | 디코딩한 후 ì¶œë ¥. | | | | 문ìžì—´ê³¼ 함께 ì¶œë ¥ | 세션 타임존 문ìžì—´ ì¶œë ¥ | +----------------------------+-----------------------------+----------------------------+------------------------------+ | TIMESTAMPTZ | ê°’ì˜ íƒ€ìž„ì¡´ìœ¼ë¡œ Unix ì‹œê°„ì„ | ê°’ì˜ íƒ€ìž„ì¡´ìœ¼ë¡œ Unix 시간ì„| ê°’ì˜ íƒ€ìž„ì¡´ìœ¼ë¡œ Unix ì‹œê°„ì„ | | | 디코딩한 후 ì¶œë ¥ | 디코딩한 후 | 디코딩한 후 ì¶œë ¥. | | | | ê°’ì˜ íƒ€ìž„ì¡´ 문ìžì—´ê³¼ 함께 | | | | | ì¶œë ¥ | ê°’ì˜ íƒ€ìž„ì¡´ 문ìžì—´ ì¶œë ¥ | +----------------------------+-----------------------------+----------------------------+------------------------------+ | DATETIME | ì €ìž¥ëœ ê°’ì„ ì¶œë ¥ | 세션 타임존 문ìžì—´ê³¼ 함께 | ì €ìž¥ëœ ê°’ì„ ì¶œë ¥. | | | | ì €ìž¥ëœ ê°’ì„ ì¶œë ¥ | 타임존 문ìžì—´ì€ ì¶œë ¥í•˜ì§€ 않ìŒ| +----------------------------+-----------------------------+----------------------------+------------------------------+ | DATETIMELTZ | 세션 타임존으로 UTC ê°’ì„ | 세션 타임존으로 UTC ê°’ì„ | 세션 타임존으로 UTC ê°’ì„ | | | 변환후 ì¶œë ¥ | 변환 후 세션 타임존 | 변환후 ì¶œë ¥. | | | | 문ìžì—´ê³¼ 함께 ì¶œë ¥ | 세션 타임존 문ìžì—´ ì¶œë ¥ | +----------------------------+-----------------------------+----------------------------+------------------------------+ | DATETIMETZ | ê°’ì˜ íƒ€ìž„ì¡´ìœ¼ë¡œ UTC ê°’ì„ | ê°’ì˜ íƒ€ìž„ì¡´ìœ¼ë¡œ UTC ê°’ì„ | ê°’ì˜ íƒ€ìž„ì¡´ìœ¼ë¡œ UTC ê°’ì„ | | | 변환후 ì¶œë ¥ | 변환 후 ê°’ì˜ íƒ€ìž„ì¡´ | 변환후 ì¶œë ¥. | | | | 문ìžì—´ê³¼ 함께 ì¶œë ¥ | ê°’ì˜ íƒ€ìž„ì¡´ 문ìžì—´ ì¶œë ¥ | +----------------------------+-----------------------------+----------------------------+------------------------------+ 타임존 ì„¤ì • ----------- 다ìŒì€ cubrid.conf 파ì¼ì—서 ì„¤ì •í•˜ëŠ” 타임존 ê´€ë ¨ 파ë¼ë¯¸í„°ë“¤ì´ë‹¤. 파ë¼ë¯¸í„°ì˜ ì„¤ì •ê³¼ ê´€ë ¨í•´ì„œëŠ” :ref:`cubrid-conf`\를 ì°¸ê³ í•œë‹¤. * **timezone** ì„¸ì…˜ì— ëŒ€í•œ íƒ€ìž„ì¡´ì„ ì„¤ì •í•˜ë©°, ê¸°ë³¸ê°’ì€ **server_timezone**\ì˜ ê°’ì´ë‹¤. * **server_timezone** ì„œë²„ì— ëŒ€í•œ íƒ€ìž„ì¡´ì„ ì„¤ì •í•˜ë©°, ê¸°ë³¸ê°’ì€ OSì˜ íƒ€ìž„ì¡´ì´ë‹¤. * **tz_leap_second_support** 윤초(leap second)ì— ëŒ€í•œ ì§€ì› ì—¬ë¶€ë¥¼ yes ë˜ëŠ” no로 ì„¤ì •í•˜ë©°, ê¸°ë³¸ê°’ì€ noì´ë‹¤. 타임존 함수 ----------- 다ìŒì€ 타임존과 ê´€ë ¨ëœ í•¨ìˆ˜ë“¤ì´ë‹¤. ì„¤ëª…ì„ ë³´ë ¤ë©´ ê° í•¨ìˆ˜ì˜ ì´ë¦„ì„ í´ë¦í•œë‹¤. * :func:`DBTIMEZONE` * :func:`SESSIONTIMEZONE` * :func:`FROM_TZ` * :func:`NEW_TIME` * :func:`TZ_OFFSET` 타임존 íƒ€ìž…ì„ ì‚¬ìš©í•˜ëŠ” 함수 --------------------------- DATETIME, TIMESTAMP, TIME íƒ€ìž…ì˜ ê°’ì„ ìž…ë ¥ 값으로 사용하는 í•¨ìˆ˜ë“¤ì€ ëª¨ë‘ íƒ€ìž„ì¡´ íƒ€ìž…ì„ ì‚¬ìš©í• ìˆ˜ 있다. 다ìŒì€ 타임존 타입 ê°’ì„ ì‚¬ìš©í•˜ëŠ” 예ì¸ë°, íƒ€ìž„ì¡´ì´ ì—†ëŠ” 경우와 ë™ì¼í•˜ê²Œ ë™ìž‘한다. 다만, LTZ로 ë나는 íƒ€ìž…ì˜ ê²½ìš° ì¶œë ¥ ê°’ì€ ë¡œì»¬ íƒ€ìž„ì¡´ì˜ ì„¤ì •(timezone 파ë¼ë¯¸í„°)ì„ ë”°ë¥¸ë‹¤. ë‹¤ìŒ ì˜ˆì—서 숫ìžì˜ 기본 단위는 DATETIME íƒ€ìž…ì˜ ìµœì†Œ ë‹¨ìœ„ì¸ ë°€ë¦¬ì´ˆì´ë‹¤. .. code-block:: sql SELECT datetimeltz '09/01/2009 03:30:30 pm' + 1; :: 03:30:30.001 PM 09/01/2009 Asia/Seoul .. code-block:: sql SELECT datetimeltz '09/01/2009 03:30:30 pm' - 1; :: 03:30:29.999 PM 09/01/2009 Asia/Seoul ë‹¤ìŒ ì˜ˆì—서 숫ìžì˜ 기본 단위는 TIMESTAMP íƒ€ìž…ì˜ ìµœì†Œ ë‹¨ìœ„ì¸ ì´ˆì´ë‹¤. .. code-block:: sql SELECT timestamptz '09/01/2009 03:30:30 pm' + 1; :: 03:30:31 PM 09/01/2009 Asia/Seoul .. code-block:: sql SELECT timestamptz '09/01/2009 03:30:30 pm' - 1; :: 03:30:29 PM 09/01/2009 Asia/Seoul .. code-block:: sql SELECT EXTRACT (hour from datetimetz'10/15/1986 5:45:15.135 am Europe/Bucharest'); 5 ì´ë¦„ì´ LTZ로 ë나는 íƒ€ìž…ì€ ì¶œë ¥ 시 로컬 íƒ€ìž„ì¡´ì˜ ì„¤ì •ì„ ë”°ë¥¸ë‹¤. ë”°ë¼ì„œ 아래 예와 ê°™ì´ timezone 파ë¼ë¯¸í„°ì˜ ê°’ì´ 'Asia/Seoul'로 ì„¤ì •ë˜ì–´ 있다면 EXTRACT 함수는 해당 íƒ€ìž„ì¡´ì˜ ì‹œ(hour)를 ì¶œë ¥í•œë‹¤. .. code-block:: sql -- csql> ;set timezone='Asia/Seoul' SELECT EXTRACT (hour from datetimeltz'10/15/1986 5:45:15.135 am Europe/Bucharest'); :: 12 타임존 íƒ€ìž…ì— ëŒ€í•œ 변환 함수 ---------------------------- 다ìŒì€ 문ìžì—´ì—서 ë‚ ì§œ/시간 타입 값으로 변환하거나 반대로 ë‚ ì§œ/시간 타입 ê°’ì—서 문ìžì—´ë¡œ 변환하는 함수들ì¸ë°, ì´ë“¤ì˜ ìž…ë ¥ ê°’ì—는 오프셋, ì¡´, ì¼ê´‘ ì ˆì•½ê³¼ ê°™ì€ íƒ€ìž„ì¡´ ì •ë³´ê°€ 추가ë 수 있다. * :func:`DATE_FORMAT` * :func:`STR_TO_DATE` * :func:`TO_CHAR` * :func:`TO_DATETIME_TZ` * :func:`TO_TIMESTAMP_TZ` ê° í•¨ìˆ˜ë“¤ì˜ ì‚¬ìš© ë°©ë²•ì€ í•¨ìˆ˜ ì´ë¦„ì„ í´ë¦í•˜ì—¬ 해당 í•¨ìˆ˜ì˜ ì„¤ëª…ì„ ì°¸ê³ í•œë‹¤. .. code-block:: sql SELECT DATE_FORMAT (datetimetz'2012-02-02 10:10:10 Europe/Zurich CET', '%TZR %TZD %TZH %TZM'); SELECT STR_TO_DATE ('2001-10-11 02:03:04 AM Europe/Bucharest EEST', '%Y-%m-%d %h:%i:%s %p %TZR %TZD'); SELECT TO_CHAR (datetimetz'2001-10-11 02:03:04 AM Europe/Bucharest EEST'); SELECT TO_DATETIME_TZ ('2001-10-11 02:03:04 AM Europe/Bucharest EEST'); SELECT TO_TIMESTAMP_TZ ('2001-10-11 02:03:04 AM Europe/Bucharest'); .. note:: :func:`TO_TIMESTAMP_TZ` , :func:`TO_DATETIME_TZ` 함수는 ë‚ ì§œ/시간 ì¸ìžì— TZR, TZD, TZH ë° TZM ì •ë³´ë¥¼ í¬í•¨í• 수 있다는 ê²ƒì„ ì œì™¸í•˜ê³ ëŠ” :func:`TO_TIMESTAMP` ë° :func:`TO_DATETIME` 함수와 ë™ì¼í•˜ë‹¤. íƒ€ìž„ì¡´ì˜ ì§€ì— ì´ë¦„ì€ IANA(Internet Assigned Numbers Authority) 타임존 ë°ì´í„°ë² ì´ìŠ¤ì— ìžˆëŠ” ì§€ì—ì„ ì‚¬ìš©í•˜ëŠ”ë°, IANA íƒ€ìž„ì¡´ì— ëŒ€í•´ì„œëŠ” http://www.iana.org/time-zones\ì„ ì°¸ê³ í•œë‹¤. IANA 타임존 ----------- IANA(Internet Assigned Numbers Authority) 타임존 ë°ì´í„°ë² ì´ìФì—는 ìˆ˜ë§Žì€ ì„¸ê³„ 대표 ìž¥ì†Œì— ëŒ€í•œ ì§€ì— ì‹œê°„ì˜ ì—사를 표현하는 코드와 ë°ì´í„°ê°€ 들어 있다. ì´ ë°ì´í„°ë² ì´ìŠ¤ëŠ” 타임 ì¡´ 경계, UTC 오프셋, ê·¸ë¦¬ê³ ì¼ê´‘ ì ˆì•½ ê·œì¹™ì— ëŒ€í•´ ì •ì¹˜ì²´ì— ì˜í•´ ë³€ê²½ëœ ì‚¬í•ì„ ë°˜ì˜í•˜ê¸° 위해 ì •ê¸°ì 으로 ì—…ë°ì´íЏë˜ê³ 있으며, 관리 ì ˆì°¨ëŠ” `BCP 175: Procedures for Maintaining the Time Zone Database. <http://tools.ietf.org/html/rfc6557>`\ì— ì„¤ëª…ë˜ì–´ 있다. ìžì„¸í•œ 사í•ì€ http://www.iana.org/time-zones\ 를 ì°¸ê³ í•œë‹¤. CUBRID는 IANA íƒ€ìž„ì¡´ì„ ì§€ì›í•˜ë©°, CUBRID 설치 íŒ¨í‚¤ì§€ì— í¬í•¨ë˜ì–´ 있는 IANA 타임존 ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 그대로 ì‚¬ìš©í• ìˆ˜ 있다. ìµœì‹ íƒ€ìž„ì¡´ìœ¼ë¡œ ì—…ë°ì´íŠ¸í•˜ê³ ì‹¶ì€ ê²½ìš° 타임존 ë°ì´í„°ë¥¼ ì—…ë°ì´íŠ¸í•˜ê³ , 타임존 ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 컴파ì¼í•œ 후 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 재구ë™í•´ì•¼ 한다. ì´ì™€ ê´€ë ¨í•˜ì—¬ :ref:`timezone-library`\ì„ ì°¸ê³ í•œë‹¤. 비트 문ìžì—´ ë°ì´í„° 타입 ======================= 비트 문ìžì—´ì€ 0ê³¼ 1로 ì´ë£¨ì–´ì§„ 8비트 ë‹¨ìœ„ì˜ ì´ì§„ ê°’ì˜ ìˆœì—´(sequence)ì´ë‹¤. CUBRID는 ë‘ ê°€ì§€ 비트 문ìžì—´ì„ ì§€ì›í•œë‹¤. * ê³ ì •ê¸¸ì´ ë¹„íŠ¸ 문ìžì—´(**BIT**) * ê°€ë³€ê¸¸ì´ ë¹„íŠ¸ 문ìžì—´(**BIT VARYING**) ë©”ì„œë“œì˜ ì¸ìžë‚˜ ì†ì„±ì˜ 타입으로 ë¹„íŠ¸ì—´ì„ ì‚¬ìš©í• ìˆ˜ 있으며, 비트열 ë¦¬í„°ëŸ´ì€ 2진수 형ì‹ì´ë‚˜ 16진수 형ì‹ì„ 사용한다. 2진수 형ì‹ìœ¼ë¡œ ì‚¬ìš©í• ë•Œì—는 다ìŒê³¼ ê°™ì´ ë¬¸ìž **B** ë’¤ì— 0ê³¼ 1로 ì´ë£¨ì–´ì§„ 문ìžì—´ì„ ë¶™ì´ê±°ë‚˜, **0b** ë’¤ì— ê°’ì„ ë¶™ì—¬ 표현한다. :: B'1010' 0b1010 16진수 형ì‹ì€ ëŒ€ë¬¸ìž **X** ë’¤ì— 0-9 ê·¸ë¦¬ê³ A-F 문ìžë¡œ ì´ë£¨ì–´ì§„ 문ìžì—´ì„ ë¶™ì´ê±°ë‚˜ **0x** ë’¤ì— ê°’ì„ ë¶™ì—¬ 표현한다. 예를 들어, 아래는 앞ì—서 2진수로 표현한 것과 ê°™ì€ ê°’ì„ 16진수로 나타낸 것ì´ë‹¤. :: X'a' 0xA 16진수ì—서 사용ë˜ëŠ” 문ìžëŠ” 대소문ìžë¥¼ 구분하지 않는다. 즉, X'4f'와 X'4F'는 ê°™ì€ ê°’ìœ¼ë¡œ 간주한다. **길ì´(Length)** ë¹„íŠ¸ì—´ì´ í…Œì´ë¸” ì†ì„±ì´ë‚˜ 메서드 ì„ ì–¸ì— ì‚¬ìš©ë 때ì—는 최대 길ì´ë¥¼ 표시해야 한다. ë¹„íŠ¸ì—´ì´ ê°€ì§ˆ 수 있는 최대 길ì´ëŠ” 1,073,741,823비트ì´ë‹¤. **ë¹„íŠ¸ì—´ì˜ ë³€í™˜(Bit String Coercion)** ê³ ì •ê¸¸ì´ì™€ ê°€ë³€ê¸¸ì´ ë¹„íŠ¸ì—´ ê°„ì—는 서로 비êµë¥¼ 위하여 ìžë™ ë³€í™˜ì´ ì´ë£¨ì–´ì§„다. 명시ì ì¸ ë³€í™˜ì€ **CAST** ì—°ì‚°ìžë¥¼ ì´ìš©í•´ì•¼ 한다. BIT(n) ------ ê³ ì •ê¸¸ì´ 2진수 í˜¹ì€ 16진수 ë¹„íŠ¸ì—´ì€ **BIT** (*n*)로 나타내는ë°, 여기서 *n* ì€ ìµœëŒ€ ë¹„íŠ¸ì˜ ê°œìˆ˜ë¥¼ 나타낸다. 만약, *n* ì´ ìƒëžµë˜ë©´ 길ì´ëŠ” 1로 ì§€ì •ëœë‹¤. ë¹„íŠ¸ì—´ì€ 8비트 단위로 왼쪽부터 ê°’ì´ ì±„ì›Œì§„ë‹¤. 예를 들어, B'1'ì˜ ê°’ì€ B'10000000'ê³¼ ê°™ì€ ê°’ìœ¼ë¡œ ì¶œë ¥ëœë‹¤. ë”°ë¼ì„œ, 8비트 단위로 길ì´ë¥¼ ì„ ì–¸í•˜ê³ 8비트 단위로 ê°’ì„ ìž…ë ¥í• ê²ƒì„ ê¶Œìž¥í•œë‹¤. .. note:: BIT(4)로 ì„ ì–¸ëœ ì¹¼ëŸ¼ì— B'1'ì„ INSERT하면 CSQLì—서는 X'8'로 ì¶œë ¥ë˜ê³ , CUBRID Managerì—서는 X'80'으로 ì¶œë ¥ëœë‹¤. * *n* ì€ 0보다 í° ìˆ«ìžì—¬ì•¼ 한다. * ë¹„íŠ¸ì—´ì˜ í¬ê¸°ê°€ *n* ì„ ë„˜ì–´ì„¤ 경우ì—는 ì ˆì‚ë˜ê³ , 0으로 채워진다. * *n* 보다 ìž‘ì€ ë¹„íŠ¸ì—´ì´ ì €ìž¥ë 때ì—는 나머지 오른쪽 ë¶€ë¶„ì´ 0으로 채워진다. * ì´ íƒ€ìž…ì˜ ì¹¼ëŸ¼ì— **DEFAULT** ì†ì„±ì´ ì§€ì •ë 수 있다. .. code-block:: sql CREATE TABLE bit_tbl(a1 BIT, a2 BIT(1), a3 BIT(8), a4 BIT VARYING); INSERT INTO bit_tbl VALUES (B'1', B'1', B'1', B'1'); INSERT INTO bit_tbl VALUES (0b1, 0b1, 0b1, 0b1); INSERT INTO bit_tbl(a3,a4) VALUES (B'1010', B'1010'); INSERT INTO bit_tbl(a3,a4) VALUES (0xaa, 0xaa); SELECT * FROM bit_tbl; :: a1 a2 a3 a4 ========================================================================= X'8' X'8' X'80' X'8' X'8' X'8' X'80' X'8' NULL NULL X'a0' X'a' NULL NULL X'aa' X'aa' BIT VARYING(n) -------------- ê°€ë³€ê¸¸ì´ ë¹„íŠ¸ì—´ì€ **BIT VARYING** (*n*)으로 나타낸다. 여기서 *n* ì€ ìµœëŒ€ ë¹„íŠ¸ì˜ ê°œìˆ˜ë¥¼ 나타낸다. 만약, *n* ì´ ìƒëžµë˜ë©´ 최대 길ì´ì¸ 1,073,741,823으로 ì§€ì •ëœë‹¤. ë¹„íŠ¸ì—´ì€ 8비트 단위로 왼쪽부터 ê°’ì´ ì±„ì›Œì§„ë‹¤. 예를 들어, B'1'ì˜ ê°’ì„ ìž…ë ¥í•˜ë©´ B'10000000'ê³¼ ê°™ì€ ê°’ìœ¼ë¡œ ì¶œë ¥ëœë‹¤. ë”°ë¼ì„œ, 8비트 단위로 í¬ê¸°ë¥¼ ì„ ì–¸í•˜ê³ 8비트 단위로 ê°’ì„ ìž…ë ¥í• ê²ƒì„ ê¶Œìž¥í•œë‹¤. .. note:: BIT VARYING(4)로 ì„ ì–¸ëœ ì¹¼ëŸ¼ì— B'1'ì„ INSERT하면 CSQLì—서는 X'8'로 ì¶œë ¥ë˜ê³ , CUBRID Manager ë˜ëŠ” ì‘ìš© 프로그램ì—서는 X'80'으로 ì¶œë ¥ëœë‹¤. * ë¹„íŠ¸ì—´ì˜ í¬ê¸°ê°€ *n* ì„ ë„˜ì–´ì„¤ 경우ì—는 ì ˆì‚ë˜ê³ 0으로 채워진다. * *n* 보다 ìž‘ì€ ë¹„íŠ¸ì—´ì´ ì €ìž¥ë 때ì—ë„ ë‚˜ë¨¸ì§€ ë¶€ë¶„ì´ 0으로 채워지지 않는다. * *n* ì€ 0보다 í° ìˆ«ìžì—¬ì•¼ 한다. * ì´ íƒ€ìž…ì˜ ì¹¼ëŸ¼ì— **DEFAULT** ì†ì„±ì´ ì§€ì •ë 수 있다. .. code-block:: sql CREATE TABLE bitvar_tbl(a1 BIT VARYING, a2 BIT VARYING(8)); INSERT INTO bitvar_tbl VALUES (B'1', B'1'); INSERT INTO bitvar_tbl VALUES (0b1010, 0b1010); INSERT INTO bitvar_tbl VALUES (0xaa, 0xaa); INSERT INTO bitvar_tbl(a1) VALUES (0xaaa); INSERT INTO bitvar_tbl(a2) VALUES (0xaaa); SELECT * FROM bitvar_tbl; :: a1 a2 ============================================ X'8' X'8' X'a' X'a' X'aa' X'aa' X'aaa' NULL NULL X'aa' .. _char-data-type: 문ìžì—´ ë°ì´í„° 타입 ================== CUBRID는 ë‘ ì¢…ë¥˜ì˜ ë¬¸ìžì—´(character string) íƒ€ìž…ì„ ì§€ì›í•œë‹¤. * ê³ ì •ê¸¸ì´ ë¬¸ìžì—´ : **CHAR** (*n*) * ê°€ë³€ê¸¸ì´ ë¬¸ìžì—´ : **VARCHAR** (*n*) .. note:: **NCHAR**, **NCHAR VARYING** ì€ 9.0 ë²„ì „ë¶€í„° ë” ì´ìƒ ì§€ì›í•˜ì§€ 않으며, ëŒ€ì‹ **CHAR**, **VARCHAR** íƒ€ìž…ì„ ì‚¬ìš©í•˜ë„ë¡ í•œë‹¤. 다ìŒì€ 문ìžì—´ íƒ€ìž…ì„ ì‚¬ìš©í• ë•Œ ì ìš©ë˜ëŠ” 규칙ì´ë‹¤. * 문ìžì—´ì€ ìž‘ì€ ë”°ì˜´í‘œë¡œ ê°ì‹¸ì„œ 표현한다. SQL 구문 ê´€ë ¨ 파ë¼ë¯¸í„°ì¸ **ansi_quotes** ì˜ ê°’ì— ë”°ë¼ ë¬¸ìžì—´ì„ ê°ì‹¸ëŠ” 부호로 í° ë”°ì˜´í‘œë„ ì‚¬ìš©í• ìˆ˜ 있다. **ansi_quotes** ê°’ì„ no로 ì„¤ì •í•˜ë©´ í° ë”°ì˜´í‘œë¡œ ê°ì‹¼ 문ìžì—´ì„ ì‹ë³„ìžë¡œ 처리하지 ì•Šê³ ë¬¸ìžì—´ë¡œ 처리한다. ê¸°ë³¸ê°’ì€ **yes** ì´ë‹¤. ìžì„¸í•œ ì„¤ëª…ì€ :ref:`stmt-type-parameters` 를 ì°¸ê³ í•œë‹¤. * ANSI í‘œì¤€ì— ë”°ë¼ ë‘ ê°œì˜ ë¬¸ìžì—´ 사ì´ì— 공간으로 ì·¨ê¸‰í• ìˆ˜ 있는 문ìž(예: 공백, íƒ, 줄바꿈 등)ê°€ 있다면, ë‘ ê°œì˜ ë¬¸ìžì—´ì€ ì—°ì†ëœ í•˜ë‚˜ì˜ ë¬¸ìžì—´ë¡œ 취급ëœë‹¤. 예를 들면, 다ìŒê³¼ ê°™ì´ ë‘ ê°œì˜ ë¬¸ìžì—´ 사ì´ì— ì¤„ë°”ê¿ˆì´ ìžˆëŠ” 경우가 있다. :: 'abc' 'def' 위 문ìžì—´ì€ ì•„ëž˜ì— ìžˆëŠ” í•˜ë‚˜ì˜ ë¬¸ìžì—´ê³¼ ë™ì¼í•˜ë‹¤. :: 'abcdef' * ìž‘ì€ ë”°ì˜´í‘œ ìžì²´ë¥¼ 문ìžì—´ì— í¬í•¨ì‹œí‚¤ë ¤ë©´, ë‘ ê°œì˜ ìž‘ì€ ë”°ì˜´í‘œë¥¼ ì—°ì†ìœ¼ë¡œ ìž…ë ¥í•˜ë©´ ëœë‹¤. 예를 들어, ì•„ëž˜ì˜ ì™¼ìª½ 문ìžì—´ì€ ì‹¤ì œë¡œ 오른쪽과 ê°™ì´ ì €ìž¥ëœë‹¤. :: '''abcde''fghij' 'abcde'fghij * ëª¨ë“ ë¬¸ìžì—´ì— 대한 í† í°ì˜ 최대 í¬ê¸°ëŠ” 16KBì´ë‹¤. * íŠ¹ì • êµê°€ì˜ 언어를 ìž…ë ¥í•˜ê³ ìž í•˜ëŠ” 경우 DB ìƒì„± 시 ì–¸ì–´ì˜ ë¡œìº˜ ì´ë¦„ê³¼ 문ìžì…‹ì„ ì§€ì •í•˜ë©°, ì´í›„ **CHARSET** 소개ìž(í˜¹ì€ **COLLATE** ìˆ˜ì •ìž)ì— ì˜í•´ ë¡œìº˜ì„ ë³€ê²½í•˜ì—¬ ì‚¬ìš©í• ìˆ˜ë„ ìžˆë‹¤. ì´ì— 대한 ìžì„¸í•œ ì„¤ëª…ì€ :doc:`i18n` ì„ ì°¸ê³ í•œë‹¤. **길ì´(Length)** 문ìžì˜ 개수를 ì§€ì •í•œë‹¤. ìž…ë ¥ëœ ë¬¸ìžì—´ì´ ì§€ì •ëœ ê¸¸ì´ë¥¼ 초과하는 경우, ì§€ì •ëœ ê¸¸ì´ì— ë§žë„ë¡ ë°ì´í„°ë¥¼ ìžë¥´ë¯€ë¡œ(truncate) 주ì˜í•œë‹¤. ë˜í•œ, ê³ ì • ê¸¸ì´ ë¬¸ìžì—´ íƒ€ìž…ì¸ **CHAR** ì—서는 ì„ ì–¸í•œ 길ì´ì— ê³ ì •ë˜ë¯€ë¡œ, 문ìžë¥¼ ì €ìž¥í• ë•Œ ì˜¤ë¥¸ìª½ì— ê³µë°± 문ìž(trailing space)를 채운다. 한편, 가변 ê¸¸ì´ ë¬¸ìžì—´ íƒ€ìž…ì¸ **VARCHAR** ì—서는 공백 문ìžë¥¼ 채우지 ì•Šê³ ì‹¤ì œ ìž…ë ¥ëœ ë¬¸ìžì—´ë§Œí¼ ì €ìž¥í•œë‹¤. **VARCHAR** 타입ì—서 ì§€ì •í• ìˆ˜ 있는 최대 길ì´ëŠ” 1,073,741,823ì´ë©°, **CHAR** 타입ì—서 ì§€ì •í• ìˆ˜ 있는 최대 길ì´ëŠ” 268,435,455ì´ë‹¤. ë˜í•œ, **CSQL** 문장으로 한 ë²ˆì— ìž…ë ¥ ë˜ëŠ” ì¶œë ¥í• ìˆ˜ 있는 최대 í¬ê¸°ëŠ” 8192KBì´ë‹¤. .. note:: 9.0 미만 ë²„ì „ì—서 **CHAR** 나 **VARCHAR** íƒ€ìž…ì˜ ê¸¸ì´ëŠ” 문ìžì˜ 개수가 아닌 문ìžì˜ ë°”ì´íЏ í¬ê¸°ë¥¼ 나타내었다. **문ìžì…‹(Character Set, charset)** 문ìžì…‹(ë¬¸ìž ì§‘í•©)ì€ íŠ¹ì • 문ìž(symbol)를 ì»´í“¨í„°ì— ì €ìž¥í• ë•Œ, ì–´ë– í•œ 코드로 ì¸ì½”ë”©í• ê²ƒì¸ì§€ì— 대한 ê·œì¹™ì´ ì •ì˜ëœ ì§‘í•©ì„ ì˜ë¯¸í•œë‹¤. CUBRIDê°€ ì‚¬ìš©í• ë¬¸ìžì…‹ì€ DB ìƒì„± 시, **CHARSET** ì†Œê°œìž ë˜ëŠ” **COLLATE** ìˆ˜ì •ìž ì‚¬ìš© 시 ì§€ì •ë 수 있다. 문ìžì…‹ì— 대한 ìžì„¸í•œ ì„¤ëª…ì€ :doc:`i18n` ì„ ì°¸ê³ í•œë‹¤. **문ìžì…‹ì˜ ì •ë ¬(Collating Character Set)** ì½œë ˆì´ì…˜(collation)ì€ ì–´ëŠ ë¬¸ìžì…‹ì´ ì„¤ì •ëœ ìƒíƒœì—서 ë°ì´í„°ë² ì´ìŠ¤ì— ì €ìž¥ëœ ê°’ë“¤ì„ ê²€ìƒ‰í•˜ê±°ë‚˜ ì •ë ¬í•˜ëŠ” ìž‘ì—…ì„ ìœ„í•´ 문ìžë“¤ì„ 서로 비êµí• 때 사용하는 ê·œì¹™ë“¤ì˜ ì§‘í•©ì´ë‹¤. 문ìžì…‹ì— 대한 ìžì„¸í•œ ì„¤ëª…ì€ :doc:`i18n` ì„ ì°¸ê³ í•œë‹¤. **문ìžì—´ 변환(Character String Coercion)** ê³ ì •ê¸¸ì´ì™€ ê°€ë³€ê¸¸ì´ ë¬¸ìžì—´ 사ì´ì—는 ë‘ ë¬¸ìžì˜ 길ì´ê°€ ë¹„êµ ê°€ëŠ¥í• ìˆ˜ 있ë„ë¡ ìžë™ 변환ëœë‹¤. ìžë™ ë³€í™˜ì€ ë™ì¼í•œ 문ìžì…‹ì— ì†í•˜ëŠ” 문ìžì—´ì—ë§Œ ì ìš©ëœë‹¤. 예를 들어, ë°ì´í„° íƒ€ìž…ì´ **CHAR** (5)ì¸ ì¹¼ëŸ¼ì„ ì¶”ì¶œí•˜ì—¬ ë°ì´í„° íƒ€ìž…ì´ **CHAR** (10)ì¸ ì¹¼ëŸ¼ì— ì‚½ìž…í•˜ëŠ” 경우 ìžë™ìœ¼ë¡œ ë°ì´í„° íƒ€ìž…ì´ **CHAR** (10)으로 변환ë˜ì–´ 삽입ëœë‹¤. 문ìžì—´ì„ 명시ì 으로 ë³€í™˜í• ìˆ˜ë„ ìžˆëŠ”ë°, ì´ ë•Œì—는 **CAST** ì—°ì‚°ìžë¥¼ 사용한다(:func:`CAST` 참조). .. _string_compression: **문ìžì—´ ì••ì¶•(String compression)** 가변 문ìžì—´ 타입 ê°’(VARCHAR(n))ì€ ë°ì´í„°ë² ì´ìФ(íž™ 파ì¼, ì¸ë±ìФ íŒŒì¼ ë˜ëŠ” ëª©ë¡ íŒŒì¼)ì— ì €ìž¥í•˜ê¸° ì „ì— ì••ì¶•í• ìˆ˜ 있다(LZO1X ì•Œê³ ë¦¬ì¦˜ 사용). 최소 255ë°”ì´íЏ ì´ìƒì´ë©´ ì••ì¶•ì´ ì‹œë„ëœë‹¤(ì´ ê°’ì€ ë¯¸ë¦¬ ì •ì˜ë˜ì–´ 있으며 ë³€ê²½í• ìˆ˜ ì—†ìŒ). ì••ì¶•ì´ íš¨ìœ¨ì ì´ì§€ 않으면(ì••ì¶• ê°’ì˜ í¬ê¸° ë° ì˜¤ë²„í—¤ë“œê°€ ì••ì¶• ì „ì˜ ì›ëž˜ ê°’ê³¼ ë™ì¼í•˜ê±°ë‚˜ í° ê²½ìš°) ì••ì¶•ë˜ì§€ ì•Šì€ ì±„ë¡œ ê°’ì´ ì €ìž¥ëœë‹¤. ì••ì¶•ì€ ê¸°ë³¸ì 으로 활성화ë˜ì–´ 있으며 시스템 파ë¼ë¯¸í„° :ref:`enable_string_compression<enable_string_compression>` 를 ì„¤ì •í•˜ì—¬ ë¹„í™œì„±í™”í• ìˆ˜ 있다. ì••ì¶• 오버헤드는 8ë°”ì´íЏ(ì••ì¶• ë²„í¼ í¬ê¸° 4ë°”ì´íЏ, ì••ì¶• í•´ì œ 문ìžì—´ ì˜ˆìƒ í¬ê¸° 4ë°”ì´íЏ)ì´ë‹¤. ì••ì¶•ëœ ë¬¸ìžì—´ì€ ë°ì´í„°ë² ì´ìФì—서 ì½ì„ 때 ì••ì¶•ì´ í’€ì–´ì§„ë‹¤. ë°ì´í„° ê°’ì˜ ì••ì¶• 여부를 íŒŒì•…í•˜ë ¤ë©´ :ref:`DISK_SIZE<disk_size>` 함수 결과를 ì¸ìžê°€ ë™ì¼í•œ :ref:`OCTET_LENGTH<octet_length>` 함수 결과와 비êµí•œë‹¤. DISK_SIZE ê°’ì´ ë” ìž‘ìœ¼ë©´(ê°’ 오버헤드 무시) ì••ì¶•ì´ ì‚¬ìš©ë˜ì—ˆìŒì„ 나타낸다. CHAR(n) ------- ê³ ì •ê¸¸ì´ ë¬¸ìžì—´ì€ **CHAR** (*n*)로 표현하며, 여기서 *n* ì€ ë¬¸ìžì˜ 개수를 나타낸다. *n* ì´ ìƒëžµë˜ë©´ 길ì´ëŠ” ê¸°ë³¸ê°’ì¸ 1로 ì§€ì •ëœë‹¤. 문ìžì—´ì˜ 길ì´ê°€ *n* ì„ ì´ˆê³¼í•˜ë©´ **allow_truncated_string** ì„¤ì • ê°’ì´ **yes** ì¸ ê²½ìš° 초과 ë¶€ë¶„ì„ ì ˆì‚하지만, ì„¤ì • ê°’ì´ **no**\ì¸ê²½ìš° ì—러가 ë°œìƒí•œë‹¤. *n* 보다 ìž‘ì€ ë¬¸ìžì—´ì´ ì €ìž¥ë˜ë©´ 나머지 ë¶€ë¶„ì€ ê³µë°± 문ìžë¡œ 채워진다. **CHAR** (*n*)와 **CHARACTER** (*n*)는 ê°™ì€ ì˜ë¯¸ë¡œ 사용ëœë‹¤. .. note:: CUBRID 9.0 미만 ë²„ì „ì—서는 *n* ì´ ë¬¸ìžì˜ 개수가 ì•„ë‹ˆë¼ ë°”ì´íЏ 길ì´ë¥¼ 나타낸다. * *n* ì€ 1부터 268,435,455 (256M) 사ì´ì˜ ì •ìˆ˜ì´ë‹¤. * 공백 ê°’ì€ ë¹ˆ 따옴표('')로 처리하며, ì´ ê²½ìš° **LENGTH** í•¨ìˆ˜ì˜ ë¦¬í„´ ê°’ì€ 0ì´ ì•„ë‹ˆë¼ **CHAR** (*n*)ì—서 ì •ì˜í•œ ê³ ì •ê¸¸ì´ì´ë‹¤. 즉, **CHAR** (10)ì¸ ì¹¼ëŸ¼ì— ê³µë°± ê°’ì„ ë„£ë”ë¼ë„ 리턴 ê°’ì€ 10ì´ë©°, *n* ì´ ìƒëžµë˜ë©´ ê¸°ë³¸ê°’ì´ **1** ì´ë¯€ë¡œ **CHAR** (1)로 간주ëœë‹¤. * 채우는(padding) 문ìžë¡œ 사용ë˜ëŠ” ê³µë°±ì€ íŠ¹ìˆ˜ 문ìžë¥¼ 비롯한 ì–´ëŠ ë¬¸ìžë³´ë‹¤ë„ ìž‘ì€ ê²ƒìœ¼ë¡œ 간주ëœë‹¤. :: CHAR(12)ì— 'pacesetter'를 ì €ìž¥í•˜ë©´ 'pacesetter 'ê°€ ëœë‹¤(10ìžë¦¬ 문ìžì—´ê³¼ 공백 ë¬¸ìž 2개로 구성ë¨). CHAR(10)ì— 'pacesetter '를 ì €ìž¥í•˜ë©´ 'pacesetter'ê°€ ëœë‹¤(10ì„ ë„˜ì–´ì„œëŠ” ë¶€ë¶„ì´ ê³µë°± 문ìžì´ë¯€ë¡œ ì´ë¥¼ ì ˆì‚í•˜ê³ 10ìžë¦¬ 문ìžì—´ë¡œ 구성ë¨. 단, **allow_truncated_string** ì„¤ì • ê°’ì´ **no**\ì¸ ê²½ìš° ì—러가 ë°œìƒ). CHAR(4)ì— 'pacesetter'를 ì €ìž¥í•˜ë©´ 'pace'ê°€ ëœë‹¤(문ìžì—´ì˜ í¬ê¸°ê°€ 4보다 í¬ë¯€ë¡œ ì ˆì‚함. 단, **allow_truncated_string** ì„¤ì • ê°’ì´ **no**\ì¸ ê²½ìš° ì—러가 ë°œìƒ). CHARì— 'p '를 ì €ìž¥í•˜ë©´ 'p'ê°€ ëœë‹¤(nì´ ìƒëžµë˜ë©´ 길ì´ëŠ” ê¸°ë³¸ê°’ì¸ 1로 ì§€ì •ë¨). * ì´ íƒ€ìž…ì˜ ì¹¼ëŸ¼ì— **DEFAULT** ì†ì„±ì´ ì§€ì •ë 수 있다. VARCHAR(n) ë˜ëŠ” CHAR VARYING(n) ------------------------------- ê°€ë³€ê¸¸ì´ ë¬¸ìžì—´ì€ **VARCHAR** (*n*)로 표현하며, 여기서 *n* ì€ ë¬¸ìžì˜ 개수를 나타낸다. *n* ì´ ìƒëžµë˜ë©´ 길ì´ëŠ” 최대 길ì´ì¸ 1,073,741,823로 ì§€ì •ëœë‹¤. 문ìžì—´ì˜ 길ì´ê°€ *n* ì„ ì´ˆê³¼í•˜ë©´ **allow_truncated_string** ì„¤ì • ê°’ì´ **yes**\ì¸ ê²½ìš° 초과 ë¶€ë¶„ì„ ì ˆì‚하지만, ì„¤ì • ê°’ì´ **no**\ì¸ê²½ìš° ì—러가 ë°œìƒí•œë‹¤. *n* 보다 ìž‘ì€ ë¬¸ìžì—´ì´ ì €ìž¥ë˜ë©´ **CHAR** (*n*)는 나머지 ë¶€ë¶„ì„ ê³µë°± 문ìžë¡œ 채우지만 **VARCHAR** (*n*)ì—는 해당 문ìžì—´ 길ì´ë§Œí¼ë§Œ ì €ìž¥í•œë‹¤. **VARCHAR** (*n*)와 **CHARACTER VARYING** (*n*), **CHAR VARYING** (*n*)ì€ ê°™ì€ ì˜ë¯¸ë¡œ 사용ëœë‹¤. .. note:: CUBRID 9.0 미만 ë²„ì „ì—서는 *n* ì´ ë¬¸ìžì˜ 개수가 ì•„ë‹ˆë¼ ë°”ì´íЏ 길ì´ë¥¼ 나타낸다. * **STRING** ì€ **VARCHAR** (최대 길ì´)와 같다. * *n* ì€ 1부터 1,073,741,823(1G) 사ì´ì˜ ì •ìˆ˜ì´ë‹¤. * 공백 ê°’ì€ ë¹ˆ 따옴표('')로 처리하며, ì´ ê²½ìš° **LENGTH** í•¨ìˆ˜ì˜ ë¦¬í„´ ê°’ì€ 0ì´ë‹¤. :: VARCHAR(4)ì— 'pacesetter'를 ì €ìž¥í•˜ë©´ 'pace'ê°€ ëœë‹¤(문ìžì—´ì˜ í¬ê¸°ê°€ 4보다 í¬ë¯€ë¡œ ì ˆì‚함. 단, **allow_truncated_string** ì„¤ì • ê°’ì´ **no**\ì¸ ê²½ìš° ì—러가 ë°œìƒ). VARCHAR(12)ì— 'pacesetter'를 ì €ìž¥í•˜ë©´ 'pacesetter'ê°€ ëœë‹¤(10ìžë¦¬ 문ìžì—´ë¡œ 구성ë¨). VARCHAR(12)ì— 'pacesetter '를 ì €ìž¥í•˜ë©´ 'pacesetter 'ê°€ ëœë‹¤(10ìžë¦¬ 문ìžì—´ê³¼ 공백 ë¬¸ìž 2개로 구성ë¨). VARCHAR(10)ì— 'pacesetter '를 ì €ìž¥í•˜ë©´ 'pacesetter'ê°€ ëœë‹¤(10ì„ ë„˜ì–´ì„œëŠ” ë¶€ë¶„ì´ ê³µë°± 문ìžì´ë¯€ë¡œ ì´ë¥¼ ì ˆì‚í•˜ê³ 10ìžë¦¬ 문ìžì—´ë¡œ 구성ë¨. 단, **allow_truncated_string** ì„¤ì • ê°’ì´ **no**\ì¸ ê²½ìš° ì—러가 ë°œìƒ). VARCHARì— 'p '를 ì €ìž¥í•˜ë©´ 'p 'ê°€ ëœë‹¤(nì´ ìƒëžµë˜ë©´ 최대 길ì´ëŠ” ê¸°ë³¸ê°’ì¸ 1,073,741,823로 ì§€ì •ë˜ê³ , ì €ìž¥ 시 나머지 ë¶€ë¶„ì€ ê³µë°± 문ìžë¡œ 채워지지 않ìŒ). * ì´ íƒ€ìž…ì˜ ì¹¼ëŸ¼ì— **DEFAULT** ì†ì„±ì´ ì§€ì •ë 수 있다. STRING ------ **STRING** ì€ ê°€ë³€ê¸¸ì´ ë¬¸ìžì—´ ë°ì´í„° 타입ì´ë‹¤. **STRING** ì€ **VARCHAR** 를 최대 길ì´ë¡œ ì§€ì •í•œ 것과 같다. 즉 **STRING** ì€ **VARCHAR** (1,073,741,823)ê³¼ ë™ì¼í•˜ë‹¤. .. _escape-characters: 특수 ë¬¸ìž ì´ìŠ¤ì¼€ì´í”„ -------------------- CUBRID는 특수 문ìžë¥¼ ì´ìŠ¤ì¼€ì´í”„(escape)하는 ë°©ë²•ì„ ë‘ ê°€ì§€ ì§€ì›í•œë‹¤. 하나는 따옴표를 ì´ìš©í•œ 방법ì´ê³ , 다른 하나는 백슬래시(\\)를 ì´ìš©í•œ 방법ì´ë‹¤. * 따옴표 ì´ìŠ¤ì¼€ì´í”„ **cubrid.conf** ì˜ ì‹œìŠ¤í…œ 파ë¼ë¯¸í„° **ansi_quotes**\ ê°€ no로 ì„¤ì •ë˜ì–´ 있으면 문ìžì—´ì„ ê°ìŒ€ 때 í°ë”°ì˜´í‘œ(")와 ìž‘ì€ë”°ì˜´í‘œ(') 둘 다 ì‚¬ìš©í• ìˆ˜ 있다. **ansi_quotes** 파ë¼ë¯¸í„°ì˜ ê¸°ë³¸ê°’ì€ **yes** 로, 문ìžì—´ì„ ê°ìŒ€ 때 ìž‘ì€ë”°ì˜´í‘œë§Œ ì‚¬ìš©í• ìˆ˜ 있다. * ìž‘ì€ë”°ì˜´í‘œë¡œ ê°ì‹¼ 문ìžì—´ì— í¬í•¨ëœ ìž‘ì€ë”°ì˜´í‘œëŠ” ë‘ ê°œì˜ ìž‘ì€ë”°ì˜´í‘œ('')를 쓴다. * í°ë”°ì˜´í‘œë¡œ ê°ì‹¼ 문ìžì—´ì— í¬í•¨ëœ í°ë”°ì˜´í‘œëŠ” ë‘ ê°œì˜ í°ë”°ì˜´í‘œ("")를 쓴다. (**ansi_quotes** ê°’ì´ noì¸ ê²½ìš°) * í°ë”°ì˜´í‘œë¡œ ê°ì‹¼ 문ìžì—´ì— í¬í•¨ëœ ìž‘ì€ë”°ì˜´í‘œëŠ” ì´ìŠ¤ì¼€ì´í”„하지 ì•Šì•„ë„ ëœë‹¤. (**ansi_quotes** ê°’ì´ noì¸ ê²½ìš°) * ìž‘ì€ë”°ì˜´í‘œë¡œ ê°ì‹¼ 문ìžì—´ì— í¬í•¨ëœ í°ë”°ì˜´í‘œëŠ” ì´ìŠ¤ì¼€ì´í”„하지 ì•Šì•„ë„ ëœë‹¤. * 백슬래시 ì´ìŠ¤ì¼€ì´í”„ 백슬래시(\\)를 ì´ìš©í•œ ì´ìŠ¤ì¼€ì´í”„는 **cubrid.conf**\ ì˜ ì‹œìŠ¤í…œ 파ë¼ë¯¸í„° **no_backslash_escapes**\ 를 no로 ì„¤ì •í–ˆì„ ë•Œì—ë§Œ ì‚¬ìš©í• ìˆ˜ 있다. **no_backslash_escapes** 파ë¼ë¯¸í„°ì˜ ê¸°ë³¸ê°’ì€ **yes** ì´ë‹¤. **no_backslash_escapes**\ ì˜ ê°’ì´ noì¸ ê²½ìš°, 다ìŒê³¼ ê°™ì€ íŠ¹ìˆ˜ 문ìžë¥¼ ì˜ë¯¸í•œë‹¤. * \\' : ìž‘ì€ë”°ì˜´í‘œ(') * \\" : í°ë”°ì˜´í‘œ(") * \\n : 뉴ë¼ì¸(newline, linefeed) ë¬¸ìž * \\r : ìºë¦¬ì§€ 리턴(carriage return) ë¬¸ìž * \\t : íƒ(tab) ë¬¸ìž * \\\\ : 백슬래시(backslash) * \\% : í¼ì„¼íЏ 기호(%). ìžì„¸í•œ ë‚´ìš©ì€ ì•„ëž˜ ì„¤ëª…ì„ ì°¸ê³ í•œë‹¤. * \\_ : ì–¸ë”ë°”(\_). ìžì„¸í•œ ë‚´ìš©ì€ ì•„ëž˜ ì„¤ëª…ì„ ì°¸ê³ í•œë‹¤. 다른 ëª¨ë“ ì´ìŠ¤ì¼€ì´í”„ì— ëŒ€í•´ì„œëŠ” 백슬래시가 무시ëœë‹¤. 예를 들어 "\x"는 그냥 "x"ë¼ê³ ìž…ë ¥í•œ 것과 같다. **\\%** 와 **\\_** 는 **LIKE** 와 ê°™ì€ íŒ¨í„´ ë§¤ì¹ êµ¬ë¬¸ì—서 í¼ì„¼íЏ 기호와 ì–¸ë”바를 ì°¾ì„ ë•Œ ì“°ì´ë©°, 백슬래시가 없으면 와ì¼ë“œì¹´ë“œ 문ìž(wildcard character)로 ì“°ì¸ë‹¤. 패턴 ë§¤ì¹ êµ¬ë¬¸ ë°–ì—서는 와ì¼ë“œì¹´ë“œ 문ìžê°€ 아닌 ì¼ë°˜ 문ìžì—´ "\\%"와 "\\_"로 그대로 ì“°ì¸ë‹¤. ìžì„¸í•œ ë‚´ìš©ì€ :ref:`like-expr` ì„ ì°¸ê³ í•œë‹¤. 다ìŒì€ **cubrid.conf**\ ì˜ ì‹œìŠ¤í…œ 파ë¼ë¯¸í„° **ansi_quotes**\ ê°€ yes(기본값)ì´ê³ **no_backslash_escapes**\ ê°€ noì¼ ë•Œ ë°±ìŠ¬ëž˜ì‹œì— ëŒ€í•´ ì´ìŠ¤ì¼€ì´í”„를 수행한 ê²°ê³¼ì´ë‹¤. .. code-block:: sql -- ansi_quotes=yes, no_backslash_escapes=no SELECT STRCMP('single quotes test('')', 'single quotes test(\')'); ìœ„ì˜ êµ¬ë¬¸ì„ ì‹¤í–‰í•˜ë©´, 백슬래시가 ì´ìŠ¤ì¼€ì´í”„ 문ìžë¡œ ì¸ì‹ë˜ë¯€ë¡œ ë‘ ë¬¸ìžì—´ì€ ê°™ì€ ê²ƒìœ¼ë¡œ ì¸ì‹ëœë‹¤. :: strcmp('single quotes test('')', 'single quotes test('')') ============================================================= 0 .. code-block:: sql SELECT STRCMP('\a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z', 'a\bcdefghijklm\nopq\rs\tuvwxyz'); ìœ„ì˜ êµ¬ë¬¸ì„ ì‹¤í–‰í•˜ë©´, 백슬래시가 ì´ìŠ¤ì¼€ì´í”„ 문ìžë¡œ ì¸ì‹ë˜ë¯€ë¡œ ë‘ ë¬¸ìžì—´ì€ ê°™ì€ ê²ƒìœ¼ë¡œ ì¸ì‹ëœë‹¤. :: strcmp('abcdefghijklm s uvwxyz', 'abcdefghijklm s uvwxyz') ===================================================================== 0 .. code-block:: sql SELECT LENGTH('\\'); ìœ„ì˜ êµ¬ë¬¸ì„ ì‹¤í–‰í•˜ë©´, 백슬래시가 ì´ìŠ¤ì¼€ì´í”„ 문ìžë¡œ ì¸ì‹ë˜ë¯€ë¡œ 문ìžì—´ì˜ 길ì´ëŠ” 1ì´ ëœë‹¤. :: char_length('\') =================== 1 다ìŒì€ **cubrid.conf**\ ì˜ ì‹œìŠ¤í…œ 파ë¼ë¯¸í„° **ansi_quotes**\ ê°€ yes(기본값)ì´ê³ **no_backslash_escapes**\ ê°€ yes(기본값)ì¼ ë•Œ 수행한 ê²°ê³¼ì´ë‹¤. 백슬래시는 ì¼ë°˜ 문ìžë¡œ ì¸ì‹ëœë‹¤. .. code-block:: sql -- ansi_quotes=yes, no_backslash_escapes=yes SELECT STRCMP('single quotes test('')', 'single quotes test(\')'); ìœ„ì˜ êµ¬ë¬¸ì„ ì‹¤í–‰í•˜ë©´, ì•„ì§ ë”°ì˜´í‘œê°€ 열린 것으로 간주하여 아래와 ê°™ì€ ì—러가 ë°œìƒí•œë‹¤. CSQL ì¸í„°í”„ë¦¬í„°ì˜ SQL ìž…ë ¥ 화면ì—서 ìœ„ì˜ êµ¬ë¬¸ì„ ìž…ë ¥í•˜ë©´ ë‹¤ìŒ ë”°ì˜´í‘œê°€ ìž…ë ¥ë˜ê¸°ë¥¼ 대기한다. :: ERROR: syntax error, unexpected UNTERMINATED_STRING, expecting SELECT or VALUE or VALUES or '(' .. code-block:: sql SELECT STRCMP('\a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z', 'a\bcdefghijklm\nopq\rs\tuvwxyz'); ìœ„ì˜ êµ¬ë¬¸ì„ ì‹¤í–‰í•˜ë©´, 백슬래시가 ì¼ë°˜ 문ìžë¡œ ì¸ì‹ë˜ë¯€ë¡œ ë‘ ë¬¸ìžì—´ì˜ ë¹„êµ ê²°ê³¼ëŠ” 서로 다른 것으로 ì¸ì‹ëœë‹¤. :: strcmp('\a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z', 'a\bcdefghijklm\nopq\rs\tuvwxyz') =================================================================================================== -1 .. code-block:: sql SELECT LENGTH('\\'); ìœ„ì˜ êµ¬ë¬¸ì„ ì‹¤í–‰í•˜ë©´, 백슬래시가 ì¼ë°˜ 문ìžë¡œ ì¸ì‹ë˜ë¯€ë¡œ 문ìžì—´ì˜ 길ì´ëŠ” 2ê°€ ëœë‹¤. :: char_length('\\') ==================== 2 다ìŒì€ **cubrid.conf**\ ì˜ ì‹œìŠ¤í…œ 파ë¼ë¯¸í„° **ansi_quotes**\ ê°€ yesì´ê³ **no_backslash_escapes**\ ê°€ noì¼ ë•Œ LIKE ì ˆì— ëŒ€í•´ ì´ìŠ¤ì¼€ì´í”„를 수행한 ê²°ê³¼ì´ë‹¤. .. code-block:: sql -- ansi_quotes=yes, no_backslash_escapes=no CREATE TABLE t1 (a VARCHAR(200)); INSERT INTO t1 VALUES ('aaabbb'), ('aaa%'); SELECT a FROM t1 WHERE a LIKE 'aaa\%' ESCAPE '\\'; :: a ====================== 'aaa%' '%'ê°€ 패턴 ë§¤ì¹ ë¬¸ìžê°€ 아닌 ì¼ë°˜ 문ìžë¡œ ì¸ì‹ë˜ê¸° 때문ì—, 질ì˜ë¥¼ 수행하면 1ê°œì˜ í–‰ë§Œ 리턴한다. LIKE ì ˆì˜ ë¬¸ìžì—´ì—서는 백슬래시가 í•ìƒ ì¼ë°˜ 문ìžë¡œ 간주ë˜ê¸° 때문ì—, '%'를 패턴 ë§¤ì¹ ë¬¸ìžê°€ 아닌 ì¼ë°˜ 문ìžë¡œ ì¸ì‹ì‹œí‚¤ë ¤ë©´ ESCAPE ì ˆì„ ì§€ì •í•˜ì—¬ 백슬래시가 ì´ìŠ¤ì¼€ì´í”„ 문ìžìž„ì„ ëª…ì‹œí•´ì•¼ 한다. ESCAPE ì ˆì—서는 백슬래시가 ì´ìŠ¤ì¼€ì´í”„ 문ìžë¡œ 간주ë˜ê¸° 때문ì—, ë‘ ê°œì˜ ë°±ìŠ¬ëž˜ì‹œ 문ìžë¥¼ 사용했다. ìœ„ì˜ SELECT 질ì˜ì—서 ì´ìŠ¤ì¼€ì´í”„ 문ìžë¥¼ 백슬래시가 아닌 다른 문ìžë¡œ ì“°ë ¤ë©´ 아래와 ê°™ì´ ì‚¬ìš©í• ìˆ˜ 있다. .. code-block:: sql SELECT a FROM t1 WHERE a LIKE 'aaa#%' ESCAPE '#'; ë¹„êµ ê·œì¹™ --------- ë‘ ë¬¸ìžì—´ ê°’ì„ ë¹„êµí• 때 후행 ê³µë°±ì— ëŒ€í•œ ë¹„êµ ê·œì¹™ì€ ë‹¤ìŒê³¼ 같다. * 후행 공백 무시 * 후행 공백 í¬í•¨ **후행 공백 무시** ë‘ ë¬¸ìžì—´ ê°’ì´ ëª¨ë‘ ê³ ì • ê¸¸ì´ íƒ€ìž… (CHAR) ì¸ ê²½ìš°ì˜ ë¹„êµëŠ” 아래 예와 ê°™ì´ í›„í–‰ ê³µë°±ì„ ë¬´ì‹œí•œë‹¤. 'abc'와 'abc ' ë¹„êµ ê²°ê³¼ëŠ” "ì¼ì¹˜" ì´ë‹¤. **후행 공백 í¬í•¨** ë‘ ë¬¸ìžì—´ ê°’ì´ ëª¨ë‘ ê°€ë³€ ê¸¸ì´ íƒ€ìž… (VARCHAR) ì¸ ê²½ìš°ì˜ ë¹„êµëŠ” 아래 예와 ê°™ì´ í›„í–‰ ê³µë°±ì„ ë¬´ì‹œí•˜ì§€ 않는다. 'abc'를 'abc ' ë¹„êµ ê²°ê³¼ëŠ” 'abc 'ê°€ 'abc'보다 "í¬ë‹¤" ì´ë‹¤. **예외** ë‘ ë¬¸ìžì—´ ê°’ì„ ë¹„êµí• 때 하나는 ê³ ì •í˜•ì´ê³ 다른 하나는 변수형ì´ë©´ CUBRID는 **후행 공백 í¬í•¨** ê·œì¹™ì„ ë”°ë¥¸ë‹¤. ENUM ë°ì´í„° 타입 ================ **ENUM** íƒ€ìž…ì€ ì—´ê±°í˜• 문ìžì—´ ìƒìˆ˜ë“¤ì˜ 중복 없는 순서 집합으로 구성ë˜ì–´ 있는 타입ì´ë‹¤. 열거형 ì¹¼ëŸ¼ì„ ìƒì„±í•˜ëŠ” êµ¬ë¬¸ì€ ë‹¤ìŒê³¼ 같다. :: <enum_type> ::= ENUM '(' <char_string_literal_list> ')' <char_string_literal_list> ::= <char_string_literal_list> ',' CHAR_STRING | CHAR_STRING 다ìŒì€ **ENUM** ì¹¼ëŸ¼ì„ ì •ì˜í•˜ëŠ” 예ì´ë‹¤. .. code-block:: sql CREATE TABLE tbl ( color ENUM ('red', 'yellow', 'blue', 'green') ); * ì´ íƒ€ìž…ì˜ ì¹¼ëŸ¼ì— **DEFAULT** ì†ì„±ì´ ì§€ì •ë 수 있다. 색ì¸ì€ ì›ì†Œë“¤ì´ 열거형 íƒ€ìž…ì— ì •ì˜ëœ ìˆœì„œì— ë”°ë¼ ê° ì›ì†Œì— ì—°ê´€ë˜ì–´ 있다. 예를 들어, *color* 칼럼(NULL ê°’ì„ í—ˆìš©í•œë‹¤ê³ ê°€ì •)ì€ ë‹¤ìŒ ê°’ 중 하나를 가질 수 있다. ========= ============ ê°’ ìƒ‰ì¸ ë²ˆí˜¸ ========= ============ NULL NULL 'red' 1 'yellow' 2 'blue' 3 'green' 4 ========= ============ **ENUM** 타입 ê°’ì˜ ì§‘í•©ì€ 512 개보다 ë§Žì€ ì›ì†Œë¥¼ 가질 수 없으며, ì§‘í•©ì˜ ê° ì›ì†ŒëŠ” ê³ ìœ í•´ì•¼ 한다. ê° **ENUM** 타입 ê°’ì— ëŒ€í•´ 해당 색ì¸ë§Œ ì €ìž¥í•˜ê¸° 때문ì—, **ENUM** íƒ€ìž…ì€ 2 ë°”ì´íŠ¸ì˜ ì €ìž¥ ê³µê°„ì„ ì‚¬ìš©í•œë‹¤. 문ìžì—´ ê°’ì´ ì•„ë‹ˆë¼ í•´ë‹¹ 색ì¸ë§Œ ì €ìž¥í•¨ìœ¼ë¡œì¨ ì €ìž¥ ê³µê°„ì„ ì¤„ì¼ ìˆ˜ 있으며 ì´ë¡œ ì¸í•œ 성능 ì´ì ë„ ì–»ì„ ìˆ˜ 있다. **ENUM** íƒ€ìž…ì„ ì‚¬ìš©í• ë•Œ 열거형 ê°’ê³¼ ê°’ì˜ ìƒ‰ì¸ ë‘˜ 다 í™œìš©í• ìˆ˜ 있다. 예를 들어, **ENUM** 타입 ì¹¼ëŸ¼ì— ê°’ì„ ì‚½ìž…í• ë•Œ 사용ìžëŠ” **ENUM** íƒ€ìž…ì˜ ê°’ ë˜ëŠ” 색ì¸ì„ ì‚¬ìš©í• ìˆ˜ 있다. .. code-block:: sql -- insert enum element 'yellow' with index 2 INSERT INTO tbl (color) VALUES ('yellow'); -- insert enum element 'red' with index 1 INSERT INTO tbl (color) VALUES (1); 표현ì‹ì—서 사용ë 때 **ENUM** íƒ€ìž…ì€ ë¬¸ë§¥ì— ë”°ë¼ **CHAR** 타입 ë˜ëŠ” 숫ìžë¡œ ë™ìž‘한다. .. code-block:: sql -- the first result column has ENUM type, the second has INTEGER type and the third has VARCHAR type SELECT color, color + 0, CONCAT(color, '') FROM tbl; :: color color+0 concat(color, '') ========================================================= 'yellow' 2 'yellow' 'red' 1 'red' 문맥 ìƒ CHAR나 ìˆ«ìž íƒ€ìž…ì´ ì•„ë‹Œ 다른 타입으로 사용ë 때, ì—´ê±°í˜•ì€ ìƒ‰ì¸ ë˜ëŠ” 열거형 ê°’ì„ ì‚¬ìš©í•˜ëŠ” 해당 타입으로 변환ëœë‹¤. 아래 표는 타입 변환 시 **ENUM** íƒ€ìž…ì˜ ì–´ë–¤ ë¶€ë¶„ì´ ì‚¬ìš©ë˜ëŠ”ì§€ë¥¼ 보여준다. +---------------+----------------------+ | 타입 | ê°’(색ì¸/ê°’) | +===============+======================+ | SHORT | ìƒ‰ì¸ | +---------------+----------------------+ | INTEGER | ìƒ‰ì¸ | +---------------+----------------------+ | BIGINT | ìƒ‰ì¸ | +---------------+----------------------+ | FLOAT | ìƒ‰ì¸ | +---------------+----------------------+ | DOUBLE | ìƒ‰ì¸ | +---------------+----------------------+ | NUMERIC | ìƒ‰ì¸ | +---------------+----------------------+ | TIME | ê°’ | +---------------+----------------------+ | DATE | ê°’ | +---------------+----------------------+ | DATETIME | ê°’ | +---------------+----------------------+ | TIMESTAMP | ê°’ | +---------------+----------------------+ | CHAR | ê°’ | +---------------+----------------------+ | VARCHAR | ê°’ | +---------------+----------------------+ | BIT | ê°’ | +---------------+----------------------+ | VARBIT | ê°’ | +---------------+----------------------+ ENUM 타입 ë¹„êµ -------------- **=** ë˜ëŠ” **IN** ì—°ì‚°ìžê°€ (<enum_칼럼> <ì—°ì‚°ìž> <ìƒìˆ˜>) 형ì‹ìœ¼ë¡œ 주어지면, ì‹œìŠ¤í…œì€ ìƒìˆ˜ë¥¼ **ENUM** 타입으로 ë³€í™˜í•˜ë ¤ê³ í•œë‹¤. ë³€í™˜ì— ì‹¤íŒ¨í•˜ë©´ 오류를 반환하지 ì•Šê³ ë¹„êµ ê²°ê³¼ë¥¼ FALSE로 반환하는ë°, ì´ì™€ ê°™ì€ ë™ìž‘ì€ ì´ëŸ¬í•œ ë‘ ê°œì˜ ì—°ì‚°ìžì— 대한 ì¸ë±ìФ 스캔 ì§ˆì˜ ê³„íšì„ 허용하기 위해서ì´ë‹¤. 다른 ëª¨ë“ :doc:`ë¹„êµ ì—°ì‚°ìž<function/comparison_op>`\ì— ëŒ€í•´ **ENUM** íƒ€ìž…ì€ ë‹¤ë¥¸ 피연산ìžì˜ 타입으로 변환ëœë‹¤. ë‘ ê°œì˜ **ENUM** 타입 ê°„ì— ë¹„êµ ì—°ì‚°ì´ ìˆ˜í–‰ë˜ë©´ ë‘ í”¼ì—°ì‚°ìž ëª¨ë‘ **CHAR** 타입으로 변환ë˜ë©° **CHAR** íƒ€ìž…ì˜ ê·œì¹™ì„ ë”°ë¥¸ë‹¤. **=**\ê³¼ **IN** ì¡°ê±´ì„ ì œì™¸í•œ **ENUM** ì¹¼ëŸ¼ì„ í¬í•¨í•œ 나머지 ì¡°ê±´ì€ ì¸ë±ìФ ìŠ¤ìº”ì˜ ê³ ë ¤ 대ìƒì´ 아니다. ì´ëŸ¬í•œ ê·œì¹™ì„ ì´í•´í•˜ê¸° 위해 다ìŒì˜ 예를 살펴보ìž. .. code-block:: sql CREATE TABLE tbl ( color ENUM ('red', 'yellow', 'blue', 'green') ); INSERT INTO tbl (color) VALUES (1), (2), (3), (4); ë‹¤ìŒ ì§ˆì˜ëŠ” ìƒìˆ˜ 'red'를 ìƒ‰ì¸ ë²ˆí˜¸ 1ì„ ê°€ì§„ 열거형 ê°’ 'red'로 변환한다. .. code-block:: sql SELECT color FROM tbl WHERE color = 'red'; :: color ====================== 'red' .. code-block:: sql SELECT color FROM tbl WHERE color = 1; :: color ====================== 'red' ë‹¤ìŒ ì§ˆì˜ëŠ” 변환 오류를 반환하지는 않지만 ì–´ë– í•œ ê²°ê³¼ë„ ë°˜í™˜í•˜ì§€ 않는다. .. code-block:: sql SELECT color FROM tbl WHERE color = date'2010-01-01'; SELECT color FROM tbl WHERE color = 15; SELECT color FROM tbl WHERE color = 'asdf'; ë‹¤ìŒ ì§ˆì˜ì—서 **ENUM** íƒ€ìž…ì€ ë‹¤ë¥¸ 피연산ìžì˜ 타입으로 변환ëœë‹¤. .. code-block:: sql -- CHAR comparison using the enum value SELECT color FROM tbl WHERE color < 'pink'; :: color ====================== 'blue' 'green' .. code-block:: sql -- INTEGER comparison using the enum index SELECT color FROM tbl WHERE color > 3; :: color ====================== 'green' .. code-block:: sql -- Conversion error SELECT color FROM tbl WHERE color > date'2012-01-01'; :: ERROR: Cannot coerce value of domain "enum" to domain "date". ENUM 타입 ì •ë ¬ -------------- **ENUM** 타입 ê°’ì€ ì—´ê±°í˜• ê°’ì´ ì•„ë‹ˆë¼ ê°’ì˜ ìƒ‰ì¸ì— ì˜í•´ ì •ë ¬ëœë‹¤. **ENUM** 타입 ì¹¼ëŸ¼ì„ ì •ì˜í• 때는 ì—´ê±°ë˜ëŠ” ê°’ì˜ ìˆœì„œë„ í•¨ê»˜ ê³ ë ¤í•´ì•¼ 한다. .. code-block:: sql SELECT color FROM tbl ORDER BY color ASC; :: color ====================== 'red' 'yellow' 'blue' 'green' **ENUM** 타입 칼럼으로 ì €ìž¥ëœ ê°’ì„ **CHAR** 값으로 ì •ë ¬í•˜ë ¤ë©´ 열거형 ê°’ì„ **CHAR** 타입으로 변환(CAST)하면 ëœë‹¤. .. code-block:: sql SELECT color FROM tbl ORDER BY CAST (color AS VARCHAR) ASC; :: color ====================== 'blue' 'green' 'red' 'yellow' ì°¸ê³ ì‚¬í• --------- **ENUM** íƒ€ìž…ì€ ìž¬ì‚¬ìš© 가능한 íƒ€ìž…ì´ ì•„ë‹ˆë‹¤. 여러 ê°œì˜ ì¹¼ëŸ¼ì´ ê°™ì€ ENUM ì§‘í•©ì˜ ê°’ì„ ìš”êµ¬í•œë‹¤ 하ë”ë¼ë„, ê°ê°ì˜ ì¹¼ëŸ¼ì— ëŒ€í•´ **ENUM** íƒ€ìž…ì´ ì •ì˜ë˜ì–´ì•¼ 한다. **ENUM** íƒ€ìž…ì˜ ë‘ ì¹¼ëŸ¼ì„ ë¹„êµí•˜ëŠ” 경우 ë¹„ë¡ ë‘ **ENUM** íƒ€ìž…ì´ ê°™ì€ ì§‘í•© ê°’ì„ ì •ì˜í–ˆë‹¤ê³ 하ë”ë¼ë„, ë‘ ì¹¼ëŸ¼ì´ **CHAR** 타입으로 ë³€í™˜ëœ ê²ƒì²˜ëŸ¼ ë™ìž‘한다. **ALTER ... CHANGE** ë¬¸ì„ ì‚¬ìš©í•˜ì—¬ **ENUM** 타입 ê°’ì˜ ì§‘í•©ì„ ìˆ˜ì •í•˜ë ¤ë©´ **alter_table_change_type_strict** 파ë¼ë¯¸í„°ì˜ ê°’ì´ ë°˜ë“œì‹œ yes여야 한다. ì´ ê²½ìš° ì‹œìŠ¤í…œì€ ìƒˆë¡œìš´ 타입으로 변환한 열거형 ê°’(문ìžì—´ 리터럴)ì„ ì‚¬ìš©í•œë‹¤. 기존 ê°’ì´ ìƒˆë¡œìš´ **ENUM** 타입 ê°’ì˜ ì§‘í•©ì„ ë²—ì–´ë‚˜ë©´ ìžë™ìœ¼ë¡œ 공백 문ìžì—´('')로 매핑ëœë‹¤. .. code-block:: sql CREATE TABLE tbl(color ENUM ('red', 'green', 'blue')); INSERT INTO tbl VALUES('red'), ('green'), ('blue'); ë‹¤ìŒ ë¬¸ìž¥ì€ **ENUM** íƒ€ìž…ì´ 'yellow' ê°’ì„ ê°€ì§€ë„ë¡ ë³€ê²½í•œë‹¤. .. code-block:: sql ALTER TABLE tbl CHANGE color color ENUM ('red', 'green', 'blue', 'yellow'); INSERT into tbl VALUES(4); SELECT color FROM tbl; :: color ====================== 'red' 'green' 'blue' 'yellow' 다ìŒì˜ 예ì—서 'green' ê°’ì´ ìƒˆë¡œìš´ **ENUM** 타입 ì •ì˜ì— 매핑ë˜ì§€ 않기 때문ì—, ëª¨ë“ íˆ¬í”Œì˜ 'green'ì´ ''로 변경ëœë‹¤. .. code-block:: sql ALTER TABLE tbl CHANGE color color ENUM ('red', 'yellow', 'blue'); SELECT color FROM tbl; :: color ====================== 'red' '' 'blue' 'yellow' **ENUM** íƒ€ìž…ì€ CUBRID 드ë¼ì´ë²„ì—서 문ìžì—´ë¡œ 매핑ëœë‹¤. 다ìŒì€ JDBC ì‘ìš©ì—서 **ENUM** íƒ€ìž…ì„ ì‚¬ìš©í•˜ëŠ” 예ì´ë‹¤. .. code-block:: java Statement stmt = connection.createStatement("SELECT color FROM tbl"); ResultSet rs = stmt.executeQuery(); while(rs.next()){ System.out.println(rs.getString()); } 다ìŒì€ CCI ì‘ìš©ì—서 **ENUM** íƒ€ìž…ì„ ì‚¬ìš©í•˜ëŠ” 예ì´ë‹¤. .. code-block:: c req_id = cci_prepare (conn, "SELECT color FROM tbl", 0, &err); error = cci_execute (req_id, 0, 0, &err); if (error < CCI_ER_NO_ERROR) { /* handle error */ } error = cci_cursor (req_id, 1, CCI_CURSOR_CURRENT, &err); if (error < CCI_ER_NO_ERROR) { /* handle error */ } error = cci_fetch (req_id, &err); if (error < CCI_ER_NO_ERROR) { /* handle error */ } cci_get_data (req, idx, CCI_A_TYPE_STR, &data, 1); .. _blob-clob: BLOB/CLOB ë°ì´í„° 타입 ===================== External LOB(Large Object) íƒ€ìž…ì€ í…스트 ë˜ëŠ” ì´ë¯¸ì§€ 등 í¬ê¸°ê°€ í° ê°ì²´ë¥¼ 처리하기 위한 ë°ì´í„° 타입ì´ë‹¤. **LOB** 타입 ë°ì´í„°ê°€ ìƒì„± ë° ì‚½ìž…ë˜ë©´ ì´ëŠ” 외부 ì €ìž¥ì†Œì— íŒŒì¼ë¡œ ì €ìž¥ë˜ê³ CUBRID ë°ì´í„°ë² ì´ìФì—는 해당 파ì¼ì˜ 위치 ì •ë³´(**LOB** locator)ê°€ ì €ìž¥ëœë‹¤. ë°ì´í„°ë² ì´ìФì—서 해당 ë°ì´í„°(**LOB** locator)ê°€ ì‚ì œë˜ë©´, 외부 ì €ìž¥ì†Œì— ì €ìž¥ëœ í•´ë‹¹ 파ì¼ì´ 함께 ì‚ì œëœë‹¤. CUBRID는 ë‘ ê°€ì§€ **LOB** íƒ€ìž…ì„ ì§€ì›í•œë‹¤. * Binary Large Object(**BLOB**) * Character Large Object(**CLOB**) .. note:: ê´€ë ¨ 용어 * **LOB** (Large Object): ì´ì§„ ë°”ì´ë„ˆë¦¬ ë˜ëŠ” í…스트 등 í¬ê¸°ê°€ í° ê°ì²´ì´ë‹¤. * **FBO** (File Based Object): DB ë°ì´í„°ë¥¼ DB ì™¸ë¶€ì˜ íŒŒì¼ë¡œ ì €ìž¥í•˜ëŠ” ê°ì²´ì´ë‹¤. * **External LOB**\ : LOB ë°ì´í„°ë¥¼ DB ì™¸ë¶€ì— íŒŒì¼ë¡œ ì €ìž¥í•˜ëŠ” ê°ì²´ë¡œì„œ FBOë¼ê³ ë„ í•˜ë©°, CUBRID는 ì´ë¥¼ ì§€ì›í•œë‹¤. Internal LOBì€ **LOB** ë°ì´í„°ë¥¼ DB ë‚´ë¶€ì— ì €ìž¥í•˜ëŠ” ê°ì²´ì´ë‹¤. * **External Storage**\ : LOBì„ ì €ìž¥í•˜ëŠ” 외부 ì €ìž¥ì†Œì´ë‹¤(예: POSIX íŒŒì¼ ì‹œìŠ¤í…œ). * **LOB Locator**\ : 외부 ì €ìž¥ì†Œì— ì €ìž¥ëœ íŒŒì¼ì˜ 경로명ì´ë‹¤. * **LOB Data**\ : LOB Locatorì— ëª…ì‹œëœ ìœ„ì¹˜ì— ìžˆëŠ” 파ì¼ì˜ ë‚´ìš©ì´ë‹¤. **LOB** ë°ì´í„°ëŠ” 외부 ì €ìž¥ì†Œì— ë‹¤ìŒê³¼ ê°™ì€ íŒŒì¼ëª…으로 ì €ìž¥ëœë‹¤. :: {table_name}_{unique_name} * *table_name* : prefix로 삽입ë˜ì–´ í•˜ë‚˜ì˜ ì™¸ë¶€ ì €ìž¥ì†Œì— ì—¬ëŸ¬ í…Œì´ë¸”ì˜ **LOB** ë°ì´í„°ë¥¼ ì €ìž¥í• ìˆ˜ 있다. * *unique_name* : ë°ì´í„°ë² ì´ìФ 서버가 ìž„ì˜ë¡œ ìƒì„±í•˜ëŠ” ì´ë¦„ì´ë‹¤. **LOB** ë°ì´í„°ì˜ ì €ìž¥ì†ŒëŠ” ë°ì´í„°ë² ì´ìФ 서버 ìƒì˜ 로컬 íŒŒì¼ ì‹œìŠ¤í…œì´ë‹¤. **LOB** ë°ì´í„°ëŠ” **cubrid createdb** ìœ í‹¸ë¦¬í‹°ì˜ **-lob-base-path** 옵션 값으로 ì§€ì •ëœ ê²½ë¡œì— ì €ìž¥ë˜ë©°, ì˜µì…˜ì´ ìƒëžµë 경우 ë°ì´í„°ë² ì´ìФ ë³¼ë¥¨ì´ ìƒì„±ë˜ëŠ” [db-vol path]/lob ê²½ë¡œì— ì €ìž¥ëœë‹¤. 보다 ìžì„¸í•œ ë‚´ìš©ì€ :ref:`creating-database` ë° :ref:`lob-storage` 를 ì°¸ê³ í•œë‹¤. CUBRIDê°€ ì œê³µí•˜ëŠ” API나 ë„구를 사용하지 ì•Šê³ ì‚¬ìš©ìžê°€ ìž„ì˜ë¡œ **LOB** íŒŒì¼ ë‚´ìš©ì„ ìˆ˜ì •í•˜ë©´, 해당 ë‚´ìš©ì˜ ì¼ì¹˜ì„±ì´ 보장ë˜ì§€ 않으므로 주ì˜í•œë‹¤. ë°ì´í„°ë² ì´ìФ 위치 ì •ë³´ 파ì¼(**databases.txt**)ì— **LOB** ë°ì´í„° íŒŒì¼ ê²½ë¡œê°€ 등ë¡ë˜ì–´ 있ìŒì—ë„ ë¶ˆêµ¬í•˜ê³ í•´ë‹¹ 경로가 ì‚ì œëœ ê²½ìš°, ë°ì´í„°ë² ì´ìФ 서버(**cub_server**) ë° ë…립 모드(standalone)로 ë™ìž‘하는 ìœ í‹¸ë¦¬í‹°ê°€ ì •ìƒì 으로 실행ë˜ì§€ 않으므로 주ì˜í•œë‹¤. BLOB ---- ë°”ì´ë„ˆë¦¬ ë°ì´í„°ë¥¼ DB ì™¸ë¶€ì— ì €ìž¥í•˜ê¸° 위한 타입으로, **BLOB** ë°ì´í„°ì˜ 최대 길ì´ëŠ” 외부 ì €ìž¥ì†Œì—서 ìƒì„± 가능한 íŒŒì¼ í¬ê¸°ì´ë‹¤. **BLOB** íƒ€ìž…ì€ SQL 문ì—서 비트열 타입으로 ìž…ì¶œë ¥ ê°’ì„ í‘œí˜„í•œë‹¤. 즉, **BIT** (n), **BIT VARYING** (n) 타입과 호환ë˜ë©°, 명시ì 타입 변환만 허용ëœë‹¤. ë°ì´í„° 길ì´ê°€ 서로 다른 경우ì—는 최대 길ì´ê°€ ìž‘ì€ íƒ€ìž…ì— ë§žì¶”ì–´ ì ˆì‚(truncate)ëœë‹¤. **BLOB** 타입 ê°’ì„ ë°”ì´ë„ˆë¦¬ 값으로 변환하는 경우, ë³€í™˜ëœ ë°ì´í„°ëŠ” 최대 1GB를 ë„˜ì„ ìˆ˜ 없다. 반대로 ë°”ì´ë„ˆë¦¬ë¥¼ **BLOB** 타입으로 변환하는 경우, ë³€í™˜ëœ ë°ì´í„°ëŠ” **BLOB** ì €ìž¥ì†Œì—서 ì œê³µí•˜ëŠ” 최대 íŒŒì¼ í¬ê¸°ë¥¼ ë„˜ì„ ìˆ˜ 없다. CLOB ---- 문ìžì—´ ë°ì´í„°ë¥¼ DB ì™¸ë¶€ì— ì €ìž¥í•˜ê¸° 위한 타입으로, **CLOB** ë°ì´í„°ì˜ 최대 길ì´ëŠ” 외부 ì €ìž¥ì†Œì—서 ìƒì„± 가능한 íŒŒì¼ í¬ê¸°ì´ë‹¤. **CLOB** íƒ€ìž…ì€ SQL 문ì—서 문ìžì—´ 타입으로 ìž…ì¶œë ¥ ê°’ì„ í‘œí˜„í•œë‹¤. 즉, **CHAR** (n), **VARCHAR** (n) 타입과 호환ëœë‹¤. 단, 명시ì 타입 변환만 허용ë˜ë©°, ë°ì´í„° 길ì´ê°€ 서로 다른 경우ì—는 최대 길ì´ê°€ ìž‘ì€ íƒ€ìž…ì— ë§žì¶”ì–´ ì ˆì‚(truncate)ëœë‹¤. **CLOB** 타입 ê°’ì„ ë¬¸ìžì—´ 값으로 변환하는 경우, ë³€í™˜ëœ ë°ì´í„°ëŠ” 최대 1GB를 ë„˜ì„ ìˆ˜ 없다. 반대로 문ìžì—´ì„ **CLOB** 타입으로 변환하는 경우, ë³€í™˜ëœ ë°ì´í„°ëŠ” **CLOB** ì €ìž¥ì†Œì—서 ì œê³µí•˜ëŠ” 최대 íŒŒì¼ í¬ê¸°ë¥¼ ë„˜ì„ ìˆ˜ 없다. ì •ì˜ ë° ë³€ê²½ ------------ **CREATE TABLE** 문 ë˜ëŠ” **ALTER TABLE** ë¬¸ì„ ì‚¬ìš©í•˜ì—¬ **BLOB** / **CLOB** 타입 ì¹¼ëŸ¼ì„ ìƒì„±/추가/ì‚ì œí• ìˆ˜ 있다. * **LOB** 타입 ì¹¼ëŸ¼ì— ëŒ€í•´ì„œëŠ” ì¸ë±ìŠ¤ë¥¼ ìƒì„±í• 수 없다. * **LOB** 타입 ì¹¼ëŸ¼ì— ëŒ€í•´ì„œëŠ” **PRIMARY KEY**, **FOREIGN KEY**, **UNIQUE**, **NOT NULL** ì œì•½ ì¡°ê±´ì„ ì •ì˜í• 수 없다. ë˜í•œ, **SHARED** ì†ì„±ì„ ì •ì˜í• 수 없으며, **DEFAULT** ì†ì„±ì€ **NULL** ê°’ì— ëŒ€í•´ì„œë§Œ ì •ì˜í• 수 있다. * **LOB** 타입 칼럼/ë°ì´í„°ëŠ” ì»¬ë ‰ì…˜ íƒ€ìž…ì˜ ì›ì†Œê°€ ë 수 없다. * **LOB** 타입 ì¹¼ëŸ¼ì´ ìžˆëŠ” ë ˆì½”ë“œë¥¼ ì‚ì œí•˜ëŠ” 경우, **LOB** 칼럼 ê°’(Locator) ë° ì™¸ë¶€ ì €ìž¥ì†Œ ë‚´ 파ì¼ì„ ëª¨ë‘ ì‚ì œí•œë‹¤. ë˜í•œ, 기본 키 í…Œì´ë¸”ì—서 **LOB** 타입 ì¹¼ëŸ¼ì´ ìžˆëŠ” ë ˆì½”ë“œê°€ ì‚ì œë¨ì— ë”°ë¼ ì´ë¥¼ 참조하는 외래 키 í…Œì´ë¸”ì˜ ë ˆì½”ë“œê°€ 함께 ì‚ì œë˜ëŠ” 경우, **LOB** 칼럼 ê°’(Locator) ë° ì™¸ë¶€ ì €ìž¥ì†Œ ë‚´ **LOB** 파ì¼ì„ ëª¨ë‘ ì‚ì œí•œë‹¤. 단, **ALTER TABLE ... DROP** ë¬¸ì„ ì‚¬ìš©í•˜ì—¬ **LOB** ì¹¼ëŸ¼ì„ ì‚ì œí•˜ê±°ë‚˜ **DROP TABLE** ë¬¸ì„ ì‚¬ìš©í•˜ì—¬ 해당 í…Œì´ë¸”ì„ ì‚ì œí•˜ëŠ” 경우, **LOB** 칼럼 ê°’(Lob locator)ë§Œ ì‚ì œí•˜ê³ **LOB** ì¹¼ëŸ¼ì´ ì°¸ì¡°í•˜ëŠ” 외부 ì €ìž¥ì†Œ ë‚´ **LOB** 파ì¼ì€ ì‚ì œí•˜ì§€ 않는다. .. code-block:: sql -- creating a table and CLOB column CREATE TABLE doc_t (doc_id VARCHAR(64) PRIMARY KEY, content CLOB); -- an error occurs when UNIQUE constraint is defined on CLOB column ALTER TABLE doc_t ADD CONSTRAINT content_unique UNIQUE(content); -- an error occurs when creating an index on CLOB column CREATE INDEX i_doc_t_content ON doc_t (content); -- creating a table and BLOB column CREATE TABLE image_t (image_id VARCHAR(36) PRIMARY KEY, doc_id VARCHAR(64) NOT NULL, image BLOB); -- an error occurs when adding a BOLB column with NOT NULL constraint ALTER TABLE image_t ADD COLUMN thumbnail BLOB NOT NULL; -- an error occurs when adding a BLOB column with DEFAULT attribute ALTER TABLE image_t ADD COLUMN thumbnail2 BLOB DEFAULT BIT_TO_BLOB(X'010101'); ì €ìž¥ ë° ë³€ê²½ ------------ **BLOB** / **CLOB** 타입 칼럼ì—는 ê°ê° **BLOB** / **CLOB** 타입 ê°’ì´ ì €ìž¥ë˜ë©°, ë°”ì´ë„ˆë¦¬ ë˜ëŠ” 문ìžì—´ ë°ì´í„°ë¥¼ ìž…ë ¥í•˜ëŠ” 경우ì—는 ê°ê° :func:`BIT_TO_BLOB`, :func:`CHAR_TO_CLOB` 함수를 사용하여 명시ì 으로 íƒ€ìž…ì„ ë³€í™˜ì„ ìˆ˜í–‰í•˜ì—¬ì•¼ 한다. **INSERT** ë¬¸ì„ ì‚¬ìš©í•˜ì—¬ **LOB** ì¹¼ëŸ¼ì— ê°’ì„ ìž…ë ¥í•˜ë©´, ë‚´ë¶€ì 으로는 외부 ì €ìž¥ì†Œì— íŒŒì¼ì„ ìƒì„±í•˜ì—¬ 해당 ë°ì´í„°ë¥¼ ì €ìž¥í•˜ê³ , ì‹¤ì œ 칼럼 값으로 해당 파ì¼ì˜ 경로(Locator) ì •ë³´ë¥¼ ì €ìž¥í•œë‹¤. **DELETE** ë¬¸ì„ ì‚¬ìš©í•˜ì—¬ **LOB** ì¹¼ëŸ¼ì´ ì¡´ìž¬í•˜ëŠ” ë ˆì½”ë“œë¥¼ ì‚ì œí•˜ë©´, 해당 **LOB** 칼럼 ê°’ì´ ì°¸ì¡°í•˜ëŠ” 파ì¼ì„ 함께 ì‚ì œí•œë‹¤. **UPDATE** ë¬¸ì„ ì‚¬ìš©í•˜ì—¬ **LOB** 칼럼 ê°’ì„ ë³€ê²½í•˜ëŠ” 경우, 새로운 ê°’ì´ **NULL** ì¸ì§€ì— ë”°ë¼ ë‹¤ìŒê³¼ ê°™ì´ ë™ìž‘하면서 칼럼 ê°’ì„ ë³€ê²½í•œë‹¤. * **LOB** 타입 칼럼 ê°’ì„ **NULL** ì´ ì•„ë‹Œ 값으로 변경하는 경우: **LOB** ì¹¼ëŸ¼ì— ì´ë¯¸ 외부 파ì¼ì„ 참조하는 Locator ê°€ ì €ìž¥ë˜ì–´ 있다면, 해당 파ì¼ì„ ì‚ì œí•œë‹¤. ê·¸ë¦¬ê³ ìƒˆë¡œìš´ 파ì¼ì„ ìƒì„±í•˜ì—¬ NULLì´ ì•„ë‹Œ ê°’ì„ ì €ìž¥í•œ 후, **LOB** 칼럼 ê°’ì— ìƒˆë¡œìš´ 파ì¼ì— 대한 locator를 ì €ìž¥í•œë‹¤. * **LOB** 타입 칼럼 ê°’ì„ **NULL** 로 변경하는 경우: LOB ì¹¼ëŸ¼ì— ì´ë¯¸ 외부 파ì¼ì„ 참조하는 Locator ê°€ ì €ìž¥ë˜ì–´ 있다면, 해당 파ì¼ì„ ì‚ì œí•œë‹¤. ê·¸ë¦¬ê³ **LOB** 칼럼 ê°’ì— **NULL**\ ì„ ë°”ë¡œ ì €ìž¥í•œë‹¤. .. code-block:: sql -- inserting data after explicit type conversion into CLOB type column INSERT INTO doc_t (doc_id, content) VALUES ('doc-1', CHAR_TO_CLOB('This is a Dog')); INSERT INTO doc_t (doc_id, content) VALUES ('doc-2', CHAR_TO_CLOB('This is a Cat')); -- inserting data after explicit type conversion into BLOB type column INSERT INTO image_t VALUES ('image-0', 'doc-0', BIT_TO_BLOB(X'000001')); INSERT INTO image_t VALUES ('image-1', 'doc-1', BIT_TO_BLOB(X'000010')); INSERT INTO image_t VALUES ('image-2', 'doc-2', BIT_TO_BLOB(X'000100')); -- inserting data from a sub-query result INSERT INTO image_t SELECT 'image-1010', 'doc-1010', image FROM image_t WHERE image_id = 'image-0'; -- updating CLOB column value to NULL UPDATE doc_t SET content = NULL WHERE doc_id = 'doc-1'; -- updating CLOB column value UPDATE doc_t SET content = CHAR_TO_CLOB('This is a Dog') WHERE doc_id = 'doc-1'; -- updating BLOB column value UPDATE image_t SET image = (SELECT image FROM image_t WHERE image_id = 'image-0') WHERE image_id = 'image-1'; -- deleting BLOB column value and its referencing files DELETE FROM image_t WHERE image_id = 'image-1010'; 조회 ---- **LOB** 타입 ì¹¼ëŸ¼ì„ ì¡°íšŒí•˜ë©´ ì¹¼ëŸ¼ì´ ì°¸ì¡°í•˜ëŠ” 파ì¼ì— ì €ìž¥ëœ ë°ì´í„°ë¥¼ ì¶œë ¥í•œë‹¤. :func:`CAST` ì—°ì‚°ìž, :func:`CLOB_TO_CHAR` 함수, :func:`BLOB_TO_BIT` 함수를 사용하여 명시ì 타입 ë³€í™˜ì„ ìˆ˜í–‰í• ìˆ˜ 있다. * CSQLì—서 질ì˜ë¥¼ ì‹¤í–‰í• ê²½ìš°, 파ì¼ì— ì €ìž¥ëœ ë°ì´í„°ê°€ 아닌 칼럼 ê°’(Locator)ì„ ì¶œë ¥í•œë‹¤. **BLOB** / **CLOB** ì¹¼ëŸ¼ì´ ì°¸ì¡°í•˜ëŠ” ë°ì´í„°ë¥¼ ì¶œë ¥í•˜ê¸° 위해서는 :func:`CLOB_TO_CHAR` 함수를 사용하여 문ìžì—´ë¡œ 변환해야 한다. * 문ìžì—´ 처리 함수를 사용하기 위해서는 :func:`CLOB_TO_CHAR` 함수를 사용하여 문ìžì—´ë¡œ 변환해야 한다. * **GROUP BY** ì ˆ, **ORDER BY** ì ˆì— **LOB** ì¹¼ëŸ¼ì„ ëª…ì‹œí• ìˆ˜ 없다. * ë¹„êµ ì—°ì‚°ìž, 관계 ì—°ì‚°ìž, **IN**, **NOT IN** ì—°ì‚°ìžë¥¼ 사용하여 **LOB** ì¹¼ëŸ¼ì„ ë¹„êµí• 수 없다. 단, **IS NULL** ì¡°ê±´ì‹ì„ 사용하여 **LOB** 칼럼 ê°’(Locator)ì´ **NULL** ì¸ì§€ 비êµí• 수 있다. 즉, 칼럼 ê°’ì´ **NULL**\ ì´ë©´ **TRUE**\ 를 반환하는ë°, 칼럼 ê°’ì´ **NULL**\ ì¸ ê²½ìš°ëŠ” **LOB** ë°ì´í„°ë¥¼ ì €ìž¥í•˜ëŠ” 파ì¼ì´ 존재하지 않는다는 ì˜ë¯¸ì´ë‹¤. * **LOB** ì¹¼ëŸ¼ì„ ìƒì„±í•˜ê³ ë°ì´í„°ë¥¼ ìž…ë ¥í•œ ì´í›„ **LOB** ë°ì´í„° 파ì¼ì„ ì‚ì œí•˜ë©´, **LOB** 칼럼 ê°’(Locator)ì´ ìœ íš¨í•˜ì§€ ì•Šì€ íŒŒì¼ì„ 참조하는 ìƒíƒœê°€ ëœë‹¤. ì´ì²˜ëŸ¼ **LOB** locator와 **LOB** ë°ì´í„° 파ì¼ì´ 매ì¹ë˜ì§€ 않는 ì¹¼ëŸ¼ì— ëŒ€í•´ :func:`CLOB_TO_CHAR`, :func:`BLOB_TO_BIT`, :func:`CLOB_LENGTH`, :func:`BLOB_LENGTH` 함수를 사용하면 **NULL**\ ì„ ì¶œë ¥í•œë‹¤. .. code-block:: sql -- displaying locator value when selecting CLOB and BLOB column in CSQL interpreter SELECT doc_t.doc_id, content, image FROM doc_t, image_t WHERE doc_t.doc_id = image_t.doc_id; :: doc_id content image ================================================================== 'doc-1' file:/home1/data1/ces_658/doc_t.00001282208855807171_7329 file:/home1/data1/ces_318/image_t.00001282208855809474_7474 'doc-2' file:/home1/data1/ces_180/doc_t.00001282208854194135_5598 file:/home1/data1/ces_519/image_t.00001282208854205773_1215 2 rows selected. .. code-block:: sql -- using string functions after coercing its type by CLOB_TO_CHAR( ) SELECT CLOB_TO_CHAR(content), SUBSTRING(CLOB_TO_CHAR(content), 10) FROM doc_t; :: clob_to_char(content) substring( clob_to_char(content) from 10) ============================================ 'This is a Dog' ' Dog' 'This is a Cat' ' Cat' 2 rows selected. .. code-block:: sql SELECT CLOB_TO_CHAR(content) FROM doc_t WHERE CLOB_TO_CHAR(content) LIKE '%Dog%'; :: clob_to_char(content) ====================== 'This is a Dog' .. code-block:: sql SELECT CLOB_TO_CHAR(content) FROM doc_t ORDER BY CLOB_TO_CHAR(content); :: clob_to_char(content) ====================== 'This is a Cat' 'This is a Dog' .. code-block:: sql SELECT * FROM doc_t WHERE content LIKE 'This%'; :: doc_id content ============================================ 'doc-1' file:/home1/data1/ces_004/doc_t.00001366272829040346_0773 'doc-2' file:/home1/data1/ces_256/doc_t.00001366272815153996_1229 .. code-block:: sql -- an error occurs when LOB column specified in ORDER BY/GROUP BY clauses SELECT * FROM doc_t ORDER BY content; :: ERROR: doc_t.content can not be an ORDER BY column ì—°ì‚°ìžì™€ 함수 ------------- :func:`CAST` ì—°ì‚°ìžë¥¼ 사용하여 **BLOB** / **CLOB** 타입과 ë°”ì´ë„ˆë¦¬ 타입/문ìžì—´ 타입 ê°„ 명시ì 타입 ë³€í™˜ì„ ìˆ˜í–‰í• ìˆ˜ 있다. ìžì„¸í•œ ë‚´ìš©ì€ :func:`CAST` ì—°ì‚°ìžë¥¼ ì°¸ê³ í•œë‹¤. :: CAST (<bit_type_column_or_value> AS { BLOB | CLOB }) CAST (<char_type_column_or_value> AS { BLOB | CLOB }) 다ìŒì€ **BLOB** / **CLOB** 타입 처리 ë° ë³€í™˜ì„ ìœ„í•´ ì œê³µí•˜ëŠ” 함수ì´ë‹¤. ìžì„¸í•œ ì„¤ëª…ì€ :doc:`/sql/function/lob_fn` ì ˆì„ ì°¸ê³ í•œë‹¤. * :func:`CLOB_TO_CHAR` * :func:`BLOB_TO_BIT` * :func:`CHAR_TO_CLOB` * :func:`BIT_TO_BLOB` * :func:`CHAR_TO_BLOB` * :func:`CLOB_FROM_FILE` * :func:`BLOB_FROM_FILE` * :func:`CLOB_LENGTH` * :func:`BLOB_LENGTH` .. note:: " <*blob_or_clob_column*> **IS NULL** ": **IS NULL** ì¡°ê±´ì‹ì„ 사용하여 **LOB** 칼럼 ê°’(Locator)ì´ **NULL** ì¸ì§€ 비êµí•˜ê³ , **NULL** ì´ë©´ **TRUE** 를 반환한다. .. _lob-storage: ì €ìž¥ì†Œ ìƒì„± ë° ê´€ë¦¬ ------------------- **LOB** ë°ì´í„° 파ì¼ì€ 기본ì 으로 ë°ì´í„°ë² ì´ìФ ë³¼ë¥¨ì´ ìƒì„±ë˜ëŠ” <db-volume-path>/lob ë””ë ‰í„°ë¦¬ì— ì €ìž¥ëœë‹¤. ë°ì´í„°ë² ì´ìФ ìƒì„± 시 :option:`createdb -B` ì˜µì…˜ì„ í†µí•´ì„œ **LOB** ë°ì´í„° 파ì¼ì„ ì €ìž¥í• ë””ë ‰í„°ë¦¬ë¥¼ ì§€ì •í• ìˆ˜ 있다. ì§€ì •ëœ ë””ë ‰í„°ë¦¬ê°€ 존재하지 않으면 ë””ë ‰í„°ë¦¬ ìƒì„±ì„ 시ë„하며, ìƒì„± 실패 시ì—는 ì—러를 ì¶œë ¥í•œë‹¤. ìžì„¸í•œ ë‚´ìš©ì€ :option:`createdb -B` ì˜µì…˜ì„ ì°¸ê³ í•œë‹¤. :: # 현재 작업 ë””ë ‰í„°ë¦¬ì— image_db ë³¼ë¥¨ì´ ìƒì„±ë˜ê³ LOB ë°ì´í„° 파ì¼ì´ ì €ìž¥ëœë‹¤. % cubrid createdb image_db en_US # 로컬 íŒŒì¼ ì‹œìŠ¤í…œ ë‚´ "/home1/data1" ê²½ë¡œì— LOB ë°ì´í„° 파ì¼ì´ ì €ìž¥ëœë‹¤. % cubrid createdb --lob-base-path="file:/home1/data1" image_db en_US :program:`spacedb` ìœ í‹¸ë¦¬í‹°ë¥¼ 실행하여 LOB 파ì¼ì´ ì €ìž¥ë˜ëŠ” ë””ë ‰í„°ë¦¬ë¥¼ 확ì¸í• 수 있다. :: % cubrid spacedb image_db Space description for database 'image_db' with pagesize 16.0K. (log pagesize: 16.0K) Volid Purpose total_size free_size Vol Name 0 GENERIC 512.0M 510.1M /home1/data1/image_db Space description for temporary volumes for database 'image_db' with pagesize 16.0K. Volid Purpose total_size free_size Vol Name LOB space description file:/home1/data1 íŒŒì¼ ì €ìž¥ì†Œë¥¼ 추가로 ìƒì„±í•˜ë ¤ë©´ ë””ìŠ¤í¬ ê³µê°„ì„ í™•ë³´í•œ 후 **databases.txt** ì˜ **lob-base-path** 를 ì¦ì„¤í•œ ë””ìŠ¤í¬ ìœ„ì¹˜ë¡œ 변경한다. **databases.txt** ì˜ ë³€ê²½ ë‚´ìš©ì„ ë°˜ì˜í•˜ê¸° 위하여 DB 서버를 재구ë™í•œë‹¤. 단, **databases.txt** ì˜ **lob-base-path** 를 변경하ë”ë¼ë„ ì˜ˆì „ ì €ìž¥ì†Œì— ì €ìž¥ëœ **LOB** ë°ì´í„°ëŠ” ì ‘ê·¼ 가능하다. :: # You can change to a new directory from the lob-base-path of databases.txt file. % cat $CUBRID_DATABASES/databases.txt #db-name vol-path db-host log-path lob-base-path image_db /home1/data1 localhost /home1/data1 file:/home1/data2 **LOB** 타입 ì¹¼ëŸ¼ì˜ ë°ì´í„° 파ì¼ì— 대한 백업 ë° ë³µêµ¬ëŠ” ì§€ì›í•˜ì§€ 않으며, **LOB** 타입 ì¹¼ëŸ¼ì˜ ë©”íƒ€ ë°ì´í„° ê°’(Locator)ì— ëŒ€í•´ì„œë§Œ 백업 ë° ë³µêµ¬ë¥¼ ì§€ì›í•œë‹¤. :program:`copydb` ìœ í‹¸ë¦¬í‹°ë¥¼ 사용하여 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 복사하는 경우, ê´€ë ¨ ì˜µì…˜ì´ ì§€ì •ë˜ì§€ 않으면 **LOB** íŒŒì¼ ë””ë ‰í„°ë¦¬ 경로가 복사ë˜ì§€ 않으므로 추가로 **databases.txt** 파ì¼ì„ ì„¤ì •í•´ì•¼ 한다. ìžì„¸í•œ ë‚´ìš©ì€ :program:`copydb` ìœ í‹¸ë¦¬í‹°ì˜ :option:`copydb -B` ë° :option:`copydb --copy-lob-path` ì˜µì…˜ì„ ì°¸ê³ í•œë‹¤. 트랜ìžì…˜ ì§€ì› ë° ë³µêµ¬ --------------------- **LOB** ë°ì´í„° ë³€ê²½ì— ëŒ€í•œ 커밋/ë¡¤ë°±ì„ ì§€ì›í•œë‹¤. 즉, 트랜ìžì…˜ ë‚´ì—서 **LOB** Locator와 ì‹¤ì œ **LOB** ë°ì´í„°ì˜ 매핑(mapping)ì— ëŒ€í•œ ìœ íš¨ì„±ì„ ë³´ìž¥í•˜ê³ , ë°ì´í„°ë² ì´ìФ ìž¥ì• ì‹œ 회복(recovery)ì„ ì§€ì›í•œë‹¤. 트랜ìžì…˜ 수행 ë„중 ë°ì´í„°ë² ì´ìŠ¤ê°€ 종료ë˜ì–´ 해당 트랜ìžì…˜ì´ 롤백 처리ë¨ì— ë”°ë¼ **LOB** Locator와 **LOB** ë°ì´í„° ê°„ ë§¤í•‘ì´ ì¼ì¹˜í•˜ì§€ 않으면 ì—러를 ì¶œë ¥í•œë‹¤. ì•„ëž˜ì˜ ì˜ˆë¥¼ ì°¸ê³ í•œë‹¤. .. code-block:: sql -- csql> ;AUTOCOMMIT OFF CREATE TABLE doc_t (doc_id VARCHAR(64) PRIMARY KEY, content CLOB); INSERT INTO doc_t VALUES ('doc-10', CHAR_TO_CLOB('This is content')); COMMIT; UPDATE doc_t SET content = CHAR_TO_CLOB('This is content 2') WHERE doc_id = 'doc-10'; ROLLBACK; SELECT doc_id, CLOB_TO_CHAR(content) FROM doc_t WHERE doc_id = 'doc-10'; :: doc_id content ========================================================= 'doc-10' 'This is content' .. code-block:: sql -- csql> ;AUTOCOMMIT OFF INSERT INTO doc_t VALUES ('doc-11', CHAR_TO_CLOB ('This is content')); COMMIT; UPDATE doc_t SET content = CHAR_TO_CLOB('This is content 3') WHERE doc_id = 'doc-11'; -- system crash occurred and then restart server SELECT doc_id, CLOB_TO_CHAR(content) FROM doc_t WHERE doc_id = 'doc-11'; :: -- Error : LOB Locator references to the previous LOB data because only LOB Locator is rollbacked. .. note:: * JDBC와 ê°™ì€ ë“œë¼ì´ë²„를 통해 ì• í”Œë¦¬ì¼€ì´ì…˜ì—서 **LOB** ë°ì´í„°ë¥¼ 조회하는 경우, JDBC는 ë°ì´í„°ë² ì´ìФ 서버로부터 ResultSetì„ ê°€ì ¸ì˜¨ 후 Resultsetì— ëŒ€í•´ 커서(cursor) 위치를 변경하면서 ë ˆì½”ë“œë¥¼ ì¸ì¶œí• 수 있다. 즉, ResultSetì„ ê°€ì ¸ì˜¨ 시ì ì—는 **LOB** ì¹¼ëŸ¼ì˜ ë©”íƒ€ ë°ì´í„°ì¸ Locatorë§Œ ì €ìž¥ë˜ì–´ ìžˆê³ , ë ˆì½”ë“œë¥¼ ì¸ì¶œí•˜ëŠ” 시ì ì— Locatorê°€ 참조하는 파ì¼ë¡œë¶€í„° **LOB** ë°ì´í„°ê°€ ì‹¤ì œë¡œ ì¸ì¶œëœë‹¤. ë”°ë¼ì„œ, ë‘ ì‹œì 사ì´ì— **LOB** ë°ì´í„°ê°€ ì—…ë°ì´íЏë˜ëŠ” 경우, **LOB** Locator와 ì‹¤ì œ **LOB** ë°ì´í„°ì˜ 매핑(mapping)ì´ ìœ íš¨í•˜ì§€ 않아 ì—러가 ë°œìƒí• 수 있다. * **LOB** 타입 ì¹¼ëŸ¼ì˜ ë©”íƒ€ ë°ì´í„°(Locator)ì— ëŒ€í•´ì„œë§Œ 백업/복구를 ì§€ì›í•œë‹¤. ë”°ë¼ì„œ, ìž¥ì• ê°€ ë°œìƒí•´ì„œ íŠ¹ì • 시ì 으로 ë³µêµ¬í• ë•Œ **LOB** Locator와 **LOB** ë°ì´í„°ì˜ ë§¤í•‘ì´ ìœ íš¨í•˜ì§€ 않아 ì—러가 ë°œìƒí• 수 있다. * **LOB** ë°ì´í„°ë¥¼ 다른 ìž¥ë¹„ì— **INSERT** í•˜ë ¤ë©´ 반드시 **LOB** 칼럼 메타 ë°ì´í„°(Locator)ê°€ 참조하는 **LOB** ë°ì´í„°ë¥¼ ì½ì–´ì„œ **INSERT** 해야 한다. * CUBRID HAì—서 **LOB** 칼럼 메타 ë°ì´í„°(Locator)는 ë³µì œë˜ê³ , **LOB** ë°ì´í„°ëŠ” ë³µì œë˜ì§€ 않는다. ë”°ë¼ì„œ **LOB** 타입 ì €ìž¥ì†Œê°€ ë¡œì»¬ì— ìœ„ì¹˜í• ê²½ìš°, ìŠ¬ë ˆì´ë¸Œ 노드 ë˜ëŠ” failover ì´í›„ 마스터 노드ì—서 해당 ì¹¼ëŸ¼ì— ëŒ€í•œ ìž‘ì—…ì„ í—ˆìš©í•˜ì§€ 않는다. .. warning:: CUBRID 2008 R3.0 ì´í•˜ ë²„ì „ì—서는 **glo** (Generalized Large Object) í´ëž˜ìŠ¤ë¥¼ 사용하여 Large Object를 처리했으나, CUBRID 2008 R3.1 ë²„ì „ë¶€í„°ëŠ” **glo** í´ëž˜ìŠ¤ë¥¼ ì œê±°í•˜ê³ **BLOB** / **CLOB** ë°ì´í„° íƒ€ìž…ì„ ì§€ì›í•œë‹¤. ë”°ë¼ì„œ, 2008 R3.0 미만 ë²„ì „ì˜ **glo** í´ëž˜ìŠ¤ë¥¼ 사용하는 환경ì—서는 CUBRID ë²„ì „ ì—…ê·¸ë ˆì´ë“œë¥¼ ìˆ˜í–‰í• ë•Œ DB 스키마 ë° ì• í”Œë¦¬ì¼€ì´ì…˜ì„ ìˆ˜ì •í•´ì•¼ 한다. .. _collection-data-type: ì»¬ë ‰ì…˜ ë°ì´í„° 타입 ================== 여러 ê°œì˜ ë°ì´í„° ê°’ì„ í•˜ë‚˜ì˜ ì†ì„±ì— ì €ìž¥í• ìˆ˜ 있ë„ë¡ í•˜ëŠ” ì»¬ë ‰ì…˜ ë°ì´í„° íƒ€ìž…ì€ ê´€ê³„í˜• ë°ì´í„°ë² ì´ìŠ¤ì˜ í™•ìž¥ëœ ê¸°ëŠ¥ì´ë‹¤. ì»¬ë ‰ì…˜ì˜ ê° ì›ì†ŒëŠ” í•˜ë‚˜ì˜ ë°ì´í„° 타입ì´ì–´ì•¼ 하며, í…Œì´ë¸”(단, 뷰는 ì œì™¸) íƒ€ìž…ì´ ë ìˆ˜ë„ ìžˆë‹¤. BLOB, CLOB íƒ€ìž…ì„ ì œì™¸í•œ 나머지 íƒ€ìž…ë“¤ì€ ì»¬ë ‰ì…˜ íƒ€ìž…ì˜ ì›ì†Œê°€ ë 수 있다. +---------------+---------------------------------------+------------------------------------+----------------------------+----------------------------+ | 타입 | 설명 | 타입 ì •ì˜ | ìž…ë ¥ ë°ì´í„° | ì €ìž¥ ë°ì´í„° | +===============+=======================================+====================================+============================+============================+ | **SET** | ì¤‘ë³µì„ í—ˆìš©í•˜ì§€ 않는 í•©ì§‘í•© | col_name SET VARCHAR(20) ë˜ëŠ” | {'c','c','c','b','b','a'} | {'a','b','c'} | | | | col_name SET (VARCHAR(20)) | | | +---------------+---------------------------------------+------------------------------------+----------------------------+----------------------------+ | **MULTISET** | ì¤‘ë³µì„ í—ˆìš©í•˜ëŠ” í•©ì§‘í•© | col_name MULTISET VARCHAR(20) ë˜ëŠ” | {'c','c','c','b','b','a'} | {'a','b','b','c','c','c'} | | | | col_name MULTISET (VARCHAR(20)) | | | +---------------+---------------------------------------+------------------------------------+----------------------------+----------------------------+ | **LIST** ë˜ëŠ” | ì¤‘ë³µì„ í—ˆìš©í•˜ê³ , | col_name LIST VARCHAR(20) ë˜ëŠ” | {'c','c','c','b','b','a'} | {'c','c','c','b','b','a'} | | **SEQUENCE** | ë°ì´í„° ìž…ë ¥ 순서대로 ì €ìž¥í•˜ëŠ” í•©ì§‘í•© | col_name LIST (VARCHAR(20)) | | | +---------------+---------------------------------------+------------------------------------+----------------------------+----------------------------+ ìœ„ì˜ í‘œì™€ ê°™ì´, ì»¬ë ‰ì…˜ 타입으로 ì§€ì •ë˜ëŠ” ê°’ì€ ì¤‘ê´„í˜¸('{', '}') ì•ˆì— ê° ê°’ë“¤ì„ ì‰¼í‘œ(,)로 구분하여 ë‚˜ì—´í• ìˆ˜ 있다. ì»¬ë ‰ì…˜ íƒ€ìž…ì€ ì§€ì •ëœ íƒ€ìž…ì´ ê°™ë‹¤ë©´ **CAST** ì—°ì‚°ìžë¥¼ ì´ìš©í•˜ì—¬ 명시ì 으로 타입 ë³€í™˜ì´ ê°€ëŠ¥í•˜ë‹¤. 아래 표는 명시ì ë³€í™˜ì´ ê°€ëŠ¥í•œ ì»¬ë ‰ì…˜ íƒ€ìž…ì— ê´€í•œ 것ì´ë‹¤. +--------------+-----+----------+------+ | FROM \\ TO | SET | MULTISET | LIST | +==============+=====+==========+======+ | **SET** | \- | Yes | Yes | +--------------+-----+----------+------+ | **MULTISET** | Yes | \- | No | +--------------+-----+----------+------+ | **LIST** | Yes | Yes | \- | +--------------+-----+----------+------+ ì»¬ë ‰ì…˜ íƒ€ìž…ì€ ì½œë ˆì´ì…˜ì„ ì§€ì›í•˜ì§€ 않는다. ë”°ë¼ì„œ 다ìŒê³¼ ê°™ì€ ì§ˆì˜ëŠ” 오류를 반환한다. .. code-block:: sql CREATE TABLE tbl (str SET (string) COLLATE utf8_en_ci); :: Syntax error: unexpected 'COLLATE', expecting ',' or ')' SET --- **SET** 는 ê° ì›ì†Œê°€ 서로 다른 ê°’ì„ ê°–ëŠ” ì§‘í•©ì´ë‹¤. **SET** ì˜ ì›ì†ŒëŠ” í•˜ë‚˜ì˜ ë°ì´í„° íƒ€ìž…ì„ ê°€ì ¸ì•¼ í•˜ê³ , 다른 í…Œì´ë¸”ì˜ ë ˆì½”ë“œë¥¼ 가질 ìˆ˜ë„ ìžˆë‹¤. .. code-block:: sql CREATE TABLE set_tbl (col_1 SET (CHAR(1))); INSERT INTO set_tbl VALUES ({'c','c','c','b','b','a'}); INSERT INTO set_tbl VALUES ({NULL}); INSERT INTO set_tbl VALUES ({''}); SELECT * FROM set_tbl; :: col_1 ====================== {'a', 'b', 'c'} {NULL} {' '} .. code-block:: sql SELECT CAST (col_1 AS MULTISET), CAST (col_1 AS LIST) FROM set_tbl; :: cast(col_1 as multiset) cast(col_1 as sequence) ============================================ {'a', 'b', 'c'} {'a', 'b', 'c'} {NULL} {NULL} {' '} {' '} .. code-block:: sql INSERT INTO set_tbl VALUES (''); :: ERROR: Casting '' to type set is not supported. MULTISET -------- **MULTISET** 는 ì¤‘ë³µì´ í—ˆìš©ë˜ëŠ” ì§‘í•©ì´ë‹¤. **MULTISET** ì˜ ì›ì†ŒëŠ” í•˜ë‚˜ì˜ ë°ì´í„° íƒ€ìž…ì„ ê°€ì ¸ì•¼ í•˜ê³ , 다른 í…Œì´ë¸”ì˜ ë ˆì½”ë“œë¥¼ 가질 ìˆ˜ë„ ìžˆë‹¤. .. code-block:: sql CREATE TABLE multiset_tbl (col_1 MULTISET (CHAR(1))); INSERT INTO multiset_tbl VALUES ({'c','c','c','b','b', 'a'}); SELECT * FROM multiset_tbl; :: col_1 ====================== {'a', 'b', 'b', 'c', 'c', 'c'} .. code-block:: sql SELECT CAST(col_1 AS SET), CAST(col_1 AS LIST) FROM multiset_tbl; :: cast(col_1 as set) cast(col_1 as sequence) ============================================ {'a', 'b', 'c'} {'c', 'c', 'c', 'b', 'b', 'a'} LIST ë˜ëŠ” SEQUENCE ------------------ **LIST** (**SEQUENCE**) 는 ì›ì†Œê°€ ìž…ë ¥ëœ ìˆœì„œê°€ ìœ ì§€ë˜ë©°, ì¤‘ë³µì´ í—ˆìš©ë˜ëŠ” ì§‘í•©ì´ë‹¤. **LIST** ì˜ ì›ì†ŒëŠ” í•˜ë‚˜ì˜ ë°ì´í„° íƒ€ìž…ì„ ê°€ì ¸ì•¼ í•˜ê³ , 다른 í…Œì´ë¸”ì˜ ë ˆì½”ë“œë¥¼ 가질 ìˆ˜ë„ ìžˆë‹¤. .. code-block:: sql CREATE TABLE list_tbl (col_1 LIST (CHAR(1))); INSERT INTO list_tbl VALUES ({'c','c','c','b','b', 'a'}); SELECT * FROM list_tbl; :: col_1 ====================== {'c', 'c', 'c', 'b', 'b', 'a'} .. code-block:: sql SELECT CAST(col_1 AS SET), CAST(col_1 AS MULTISET) FROM list_tbl; :: cast(col_1 as set) cast(col_1 as multiset) ============================================ {'a', 'b', 'c'} {'a', 'b', 'b', 'c', 'c', 'c'} .. _json-data-type: JSON ë°ì´í„° 타입 ================ CUBRID 10.2는 `RFC 7159 <https://tools.ietf.org/html/rfc7159>`__ ì—서 ì •ì˜ëœ native **JSON** ë°ì´í„° íƒ€ìž…ì„ ì§€ì›í•œë‹¤. **JSON** ë°ì´í„° íƒ€ìž…ì€ JSON ë°ì´í„°ì— 대해 ìžë™ ê²€ì¦ì„ ì œê³µí•˜ë©°, ë¹ ë¥¸ 액세스와 ë™ìž‘ì´ ê°€ëŠ¥í•˜ë‹¤. .. note:: 10.2 ì„œë²„ì— ì—°ê²°í•˜ëŠ” ê·¸ ì´ì „ ë²„ì „ì˜ ë“œë¼ì´ë²„는 JSON 타입 ì»¬ëŸ¼ì„ Varchar 타입으로 ì¸ì‹í•œë‹¤. JSON ë°ì´í„° ìƒì„± ---------------- JSON í¬ë§·ì˜ 문ìžì—´ 형ì‹ì´ JSON ë°ì´í„° 타입 ì»¬ëŸ¼ì— ìž…ë ¥ë˜ë©´ JSON 값으로 ìžë™ìœ¼ë¡œ 변환ëœë‹¤. .. code-block:: sql -- 문ìžì—´ì„ JSON 타입 ì»¬ëŸ¼ì— ìž…ë ¥ CREATE TABLE t (id int, j JSON); INSERT INTO t VALUES (1, '{"a":1}'); SELECT j, TYPEOF(j) FROM t; :: j typeof(j) ============================================ {"a":1} 'json' :ref:`castfn` 를 사용하거나 문ìžì—´ ì•žì— json 키워드를 사용하여 ê°•ì œë¡œ JSON으로 변환 í• ìˆ˜ë„ ìžˆë‹¤. .. code-block:: sql -- 문ìžì—´ì„ json으로 cast SELECT CAST('{"a":1}' as JSON); :: cast('{"a":1}' as json) ====================== {"a":1} .. code-block:: sql -- json 키워드 사용 SELECT json'{"a":1}', TYPEOF (json'{"a":1}'); :: json '{"a":1}' typeof(json '{"a":1}') ============================================ {"a":1} 'json' JSON ë°ì´í„° íƒ€ìž…ì€ :ref:`fn-json-object` 나 :ref:`fn-json-array` 를 사용하여 ìƒì„±í• ìˆ˜ë„ ìžˆë‹¤. JSON ìœ íš¨ì„± 검사 ---------------- JSON ë°ì´í„°ë¡œì˜ ë³€í™˜ì€ ë‚´ìž¥ëœ ìœ íš¨ì„± 검사를 ìˆ˜í–‰í•˜ê³ ìœ íš¨í•œ JSON 문ìžì—´ì´ 아닌 경우 오류를 반환한다. .. code-block:: sql -- 따옴표가 없는 문ìžì—´ì€ ìœ íš¨í•œ jsonì´ ì•„ë‹ˆë‹¤ SELECT json'abc'; :: In line 1, column 8, ì—러: before ' ; ' ìœ íš¨í•˜ì§€ ì•Šì€ JSON: 'abc'. ë” ì—„ê²©í•œ ìœ íš¨ì„± 검사 ê·œì¹™ì„ ê°€ì§„ JSON 타입 ì»¬ëŸ¼ì€ `JSON 스키마 표준 초안 (draft JSON Schema standard) <https://json-schema.org/specification.html>`_ 를 사용하여 ì •ì˜í• 수 있다. 만약 JSON 스키마를 다루어본 ì ì´ ì—†ë‹¤ë©´ `JSON ìŠ¤í‚¤ë§ˆì˜ ì´í•´ (Understanding JSON Schema) <https://json-schema.org/understanding-json-schema>`_ 를 ì°¸ê³ í•˜ë©´ ëœë‹¤. 다ìŒì€ 스키마 사용 ë°©ë²•ì— ëŒ€í•œ 간단한 ì˜ˆì œì´ë‹¤.: .. code-block:: sql -- j ì»¬ëŸ¼ì´ JSONì˜ ë¬¸ìžì—´ íƒ€ìž…ë§Œì„ ìž…ë ¥í• ìˆ˜ 있ë„ë¡ ì„¤ì • CREATE TABLE t (id int, j JSON ('{"type": "string"}')); .. code-block:: sql -- JSON ìŠ¤í‚¤ë§ˆì— ìœ íš¨í•œ 문ìžì—´ 타입 JSON ìž…ë ¥ INSERT into t values (1, '"abc"'); :: 1 ê°œì˜ ëª…ë ¹ì–´ê°€ 실행ë˜ì—ˆìŠµë‹ˆë‹¤. .. code-block:: sql -- JSON ìŠ¤í‚¤ë§ˆì— ìœ íš¨í•˜ì§€ ì•Šì€ ë¬¸ìžì—´ 타입 JSON ìž…ë ¥ INSERT into t values (2, '{"a":1}'); :: ì—러: before ' ); ' 주어진 JSON ì€ JSON schemaì— ëŒ€í•´ ìœ íš¨í•˜ì§€ 않습니다. (스키마 경로: #, 키워드: type, JSON 경로: #) JSON ë°ì´í„°ì˜ 타입 -------------------- JSON ë°ì´í„°ì˜ ê°’ì€ `RFC 7159 <https://tools.ietf.org/html/rfc7159#section-3>` ì—서 ì •ì˜ëœ 것과 ê°™ì´ ê°ì²´ (Object), ë°°ì—´ (Array) ë˜ëŠ” ìŠ¤ì¹¼ë¼ (Scalar) 여야 한다. ìŠ¤ì¹¼ë¼ ê°’ì€ ë¬¸ìžì—´, 숫ìží˜•, 불리언 (boolean) ë˜ëŠ” ë„ (null) ì´ë‹¤. JSON ë°ì´í„° 타입 표: +----------------------------+---------------------+--------------------------------+ | 타입 | CUBRID JSON 타입 | 설명 | +============================+=====================+================================+ | Object | JSON_OBJECT | 키-ê°’ ìŒì˜ ì§‘í•© | +----------------------------+---------------------+--------------------------------+ | Array | JSON_ARRAY | JSON ë°ì´í„° ê°’ì˜ ë°°ì—´ | +-------------+--------------+---------------------+--------------------------------+ | Scalar | String | STRING | 따옴표로 ë¬¶ì¸ ë¬¸ìžì—´ | | +--------------+---------------------+--------------------------------+ | | Number | INTEGER | 32ë¹„íŠ¸ì˜ ë¶€í˜¸ 있는(signed) 숫ìž| | | +---------------------+--------------------------------+ | | | BIGINT | 64ë¹„íŠ¸ì˜ ë¶€í˜¸ 있는(signed) 숫ìž| | | +---------------------+--------------------------------+ | | | DOUBLE | ì •ìˆ˜ê°€ 아닌 ìˆ«ìž ë˜ëŠ” | | | | | 2\ :sup:`63`\ - 1 | | | | | 보다 í° ì •ìˆ˜ | | +--------------+---------------------+--------------------------------+ | | true | BOOLEAN | True 불리언 (boolean) ê°’ | | +--------------+---------------------+--------------------------------+ | | false | BOOLEAN | False 불리언 (boolean) ê°’ | | +--------------+---------------------+--------------------------------+ | | null | JSON_NULL | Null ê°’ | +-------------+--------------+---------------------+--------------------------------+ JSON ê°’ì˜ CUBRID JSON íƒ€ìž…ì€ :ref:`fn-json-type` 함수로 ê°€ì ¸ì˜¬ 수 있다. JSON ë°ì´í„° 변환 --------------------- JSON ë°ì´í„° íƒ€ìž…ì€ ëª…ì‹œì ë˜ëŠ” 암시ì 으로 다른 타입으로부터 변환하여 ì–»ì„ ìˆ˜ 있다. JSON ë°ì´í„°ê°’ì„ ë‹¤ë¥¸ JSON 타입으로 변환하는 ê²ƒì€ ë³€í™˜í•˜ë ¤ëŠ” íƒ€ìž…ì´ ìŠ¤í‚¤ë§ˆë¥¼ ê°€ì§€ê³ ìžˆê³ ë³€í™˜ëœ ê°’ì´ ìŠ¤í‚¤ë§ˆ ìœ íš¨ì„± 검사를 통과하지 못하는 경우 ì‹¤íŒ¨í• ìˆ˜ 있다. 다른 타입ì—서 JSONìœ¼ë¡œì˜ ë³€í™˜ì€ ë‹¤ìŒ í‘œì—서 설명한다: +----------------------------+----------------------------------------------------+ | 기존 타입 | CUBRID JSON 타입 | +============================+====================================================+ | Any string | 문ìžì—´ì€ ëª¨ë“ íƒ€ìž…ì˜ JSON ë°ì´í„°ë¡œ ë³€í™˜í• ìˆ˜ 있다. | | | | | | .. note:: | | | | | | 만약 문ìžì—´ì˜ 문ìžì…‹ì´ UTF8ì´ ì•„ë‹ˆë¼ë©´ | | | 문ìžì—´ì„ ë¨¼ì € UTF8로 변환한 후 | | | JSON ë°ì´í„°ë¡œ 변환한다. | +----------------------------+----------------------------------------------------+ | Short, Integer | INTEGER | +----------------------------+----------------------------------------------------+ | Bigint | BIGINT | +----------------------------+----------------------------------------------------+ | Float, Double | DOUBLE | +----------------------------+----------------------------------------------------+ | Numeric | DOUBLE | +----------------------------+----------------------------------------------------+ JSON ë°ì´í„° 타입ì—서 다른 íƒ€ìž…ìœ¼ë¡œì˜ ë³€í™˜ì€ ë‹¤ìŒ í‘œì—서 설명한다.: +----------------------------+-----------------------------------------------+ | CUBRID JSON 타입 | 허용ë˜ëŠ” 다른 타입 | +============================+===============================================+ | JSON_OBJECT | JSON ë°ì´í„° ê°’ì„ ì¶œë ¥í•œ 문ìžì—´ | +----------------------------+-----------------------------------------------+ | JSON_ARRAY | JSON ë°ì´í„° ê°’ì„ ì¶œë ¥í•œ 문ìžì—´ | +----------------------------+-----------------------------------------------+ | STRING | 문ìžì—´ë¡œë¶€í„° ë³€í™˜í• ìˆ˜ 있는 ëª¨ë“ íƒ€ìž… | +----------------------------+-----------------------------------------------+ | INTEGER | 숫ìžê°’으로부터 ë³€í™˜í• ìˆ˜ 있는 ëª¨ë“ íƒ€ìž… | +----------------------------+-----------------------------------------------+ | BIGINT | Bigint 값으로부터 ë³€í™˜í• ìˆ˜ 있는 ëª¨ë“ íƒ€ìž… | +----------------------------+-----------------------------------------------+ | DOUBLE | Double 값으로부터 ë³€í™˜í• ìˆ˜ 있는 ëª¨ë“ íƒ€ìž… | +----------------------------+-----------------------------------------------+ | BOOLEAN | 문ìžì—´ë¡œ 변환ëœë‹¤ë©´ "true" ë˜ëŠ” "false" | | +-----------------------------------------------+ | | 숫ìží˜•으로 변환ëœë‹¤ë©´ 0 ë˜ëŠ” 1 | +----------------------------+-----------------------------------------------+ | JSON_NULL | JSON 'null'ì„ ì¶œë ¥í•œ 문ìžì—´ | +----------------------------+-----------------------------------------------+ .. _json-path: JSON 경로 ----------- JSON 경로는 JSON ë‚´ì—서 json 요소를 ì°¸ì¡°í• ìˆ˜ 있는 방법ì´ë‹¤. ë§Žì€ JSON 함수는 JSON ë‚´ë¶€ì—서 ë™ìž‘ 위치를 ì •ì˜í•˜ê¸° 위해 JSON 경로 ë˜ëŠ” JSON í¬ì¸í„° ì¸ìˆ˜ë¥¼ 필요로 한다. JSON 경로는 í•ìƒ '$'로 시작하며 ë°°ì—´ ì¸ë±ìФ, ê°ì²´ 키 í† í° ë° ì™€ì¼ë“œì¹´ë“œê°€ 뒤따를 수 있다. 만약 '$' ë’¤ì— ë‹¤ë¥¸ í† í°ì´ 없으면 경로는 JSON ë°ì´í„° 루트를 가리킨다. :: <json_path>::= <start_token> [<path_token>] ... <start_token>::= $ <path_token>::= <array_access_token> | <object_key_access_token> | <wildcard_token> <array_access_token>::= [idx] <object_key_access_token>::= .[key_identifier | "key_str"] <wildcard_token>::= .*|[*]|**path_token 예를 들어, '{"a":[0,1,2,{"b":5}]}'ì— ëŒ€í•´ '$.a[3].b'ì˜ ì˜ë¯¸ëŠ” "ë£¨íŠ¸ì˜ 'a'를 가진 ë©¤ë²„ì˜ ì¸ë±ìФ 3ì— í•´ë‹¹í•˜ëŠ” ìš”ì†Œì˜ í‚¤ 'b'를 가진 멤버"ì´ë©° JSON ê°’ '5'를 가리킨다; object_key_access_tokens를 키 문ìžì—´ë¡œ 사용하여 ë™ì¼í•œ key_identifiers를 í‘œí˜„í• ìˆ˜ 있으며 ì´ìŠ¤ì¼€ì´í”„ 문ìžë¥¼ ì‚¬ìš©í• ìˆ˜ë„ ìžˆë‹¤. 예: '$"\"'ì€ í°ë”°ì˜´í‘œë¥¼ 가진 멤버를 키로 참조하는 ë° ì‚¬ìš©í• ìˆ˜ 있다. JSON 와ì¼ë“œì¹´ë“œëŠ” ë‹¤ìŒ ì„¸ 가지 ìœ í˜• 중 하나가 ë 수 있다. - .* , 와ì¼ë“œì¹´ë“œì™€ 매ì¹ë˜ëŠ” ê°ì²´ 멤버 - [*], 와ì¼ë“œì¹´ë“œì™€ 매ì¹ë˜ëŠ” ë°°ì—´ ì¸ë±ìФ - \**, ê°ì²´ í‚¤ì˜ ì‹œí€€ìŠ¤ ë°°ì—´ ì¸ë±ìŠ¤ë¥¼ 매ì¹. \** 와ì¼ë“œì¹´ë“œëŠ” í† í°(path_token)ì„ ë’¤ì— ë¶™ì—¬ì•¼ 한다. JSON í¬ì¸í„° ë° JSON í…스트와 ê°™ì€ ê²½ë¡œ ì‹ì€ ASCII ë˜ëŠ” UTF-8 문ìžì…‹ìœ¼ë¡œ ì¸ì½”딩 ë˜ì–´ì•¼ 한다. 만약 다른 문ìžì…‹ì´ 사용ëœë‹¤ë©´, UTF-8으로 변환(coercion)ë 것ì´ë‹¤. .. _json-pointer: JSON í¬ì¸í„° ------------- https://tools.ietf.org/html/rfc6901 ì—서 ì •ì˜í•œ JSON í¬ì¸í„°ëŠ” JSON 경로와 다른 ë°©ë²•ì„ ì œê³µí•œë‹¤. JSON í¬ì¸í„°ëŠ” JSON 경로 ë° JSON í…스트와 ë™ì¼í•˜ê²Œ ASCII ë˜ëŠ” UTF-8 문ìžì…‹ìœ¼ë¡œ ì¸ì½”딩 ë˜ì–´ì•¼ 한다. 만약 다른 문ìžì…‹ì´ 사용ëœë‹¤ë©´, UTF-8으로 변환(coercion)ë 것ì´ë‹¤. :: <json_pointer>::= [/path_token] ... [/-] :: '$.a[10].bb' 는 '/a/10/bb' 와 ë™ì¼í•˜ë‹¤ '$' 는 '' 와 ë™ì¼í•˜ë‹¤ 특수 ë¬¸ìž '-'는 마지막 path_token으로만 ì‚¬ìš©í• ìˆ˜ 있으며 json_arrayì˜ ëë¶€ë¶„ì„ ê°€ë¦¬í‚¤ëŠ” ë° ì‚¬ìš©í• ìˆ˜ 있다. JSON í¬ì¸í„°ëŠ” 비와ì¼ë“œì¹´ë“œ JSON 경로가 가리키는 것과 ë™ì¼í•œ 경로를 ê°€ë¦¬í‚¤ëŠ”ë° ì‚¬ìš©í• ìˆ˜ 있다. .. _implicit-type-conversion: 묵시ì 타입 변환 ================ í‘œí˜„ì‹ ë‚´ì—서 íƒ€ìž…ì„ ë³€í™˜í•´ì•¼ í• ë•Œ ìžë™ìœ¼ë¡œ 해당 타입으로 변환하는 ê²ƒì„ ë¬µì‹œì 타입 변환(implicit type conversion)ì´ë¼ê³ 한다. **SET**, **MULTISET**, **LIST**, **SEQUENCE** 는 명시ì 으로 변환ë˜ì–´ì•¼ 한다. **DATETIME** ë° **TIMESTAMP** 타입(íƒ€ìž„ì¡´ì´ ìžˆëŠ” 타입 í¬í•¨)ì„ **DATE** 타입 ë˜ëŠ” **TIME** 타입으로 변환하면 ë°ì´í„° ì†ì‹¤ì´ ë°œìƒí•œë‹¤. **DATE** íƒ€ìž…ì„ **DATETIME** 타입 ë˜ëŠ” **TIMESTAMP** 타입(íƒ€ìž„ì¡´ì´ ìžˆëŠ” 타입 í¬í•¨)으로 변환하면 ì‹œê°„ì´ '12:00:00 AM'으로 ì„¤ì •ëœë‹¤. 타임존 타입 ê°’ì—서 타임존 ë¶€ë¶„ì€ ì°¸ì¡°ìš©ì¼ ë¿ì´ë©°, ì •í™•í•œ ê°’ì€ UTC ì°¸ì¡°ì— ì €ìž¥ëœë‹¤. íƒ€ìž„ì¡´ì´ ìžˆëŠ” 타입ì—서 íƒ€ìž„ì¡´ì´ ì—†ëŠ” 타입으로 ê°’ì„ ë³€í™˜í•˜ë©´ 세션 íƒ€ìž„ì¡´ì„ ì‚¬ìš©í•œ 것처럼 변환ëœë‹¤. íƒ€ìž„ì¡´ì´ ì—†ëŠ” 타입ì—서 íƒ€ìž„ì¡´ì´ ìžˆëŠ” 타입으로 ê°’ì„ ë³€í™˜í•˜ë©´ 세션 íƒ€ìž„ì¡´ì„ ê³ ë ¤í•˜ì—¬ 변환한다. 타임존 타입과 ê´€ë ¨í•œ ê°’ ë³€í™˜ì— ëŒ€í•œ ìžì„¸í•œ ë‚´ìš©ì€ :ref:`date-time-type` ì„ ì°¸ê³ í•œë‹¤. 문ìžì—´ 타입ì´ë‚˜ ì •í™•í•œ 수치형 íƒ€ìž…ì„ ë¶€ë™ì†Œìˆ˜ì 수치형 타입으로 변환하면 ê°’ì´ ì •í™•í•˜ì§€ ì•Šì„ ìˆ˜ 있다. 문ìžì—´ 타입과 ì •í™•í•œ 수치형 íƒ€ìž…ì€ ê°’ì„ í‘œí˜„í•˜ê¸° 위해 ì‹ì§„ ì •ë°€ë„(decimal precision)를 사용하지만 ë¶€ë™ì†Œìˆ˜ì 수치형 íƒ€ìž…ì€ ì´ì§„ ì •ë°€ë„(binary precision)를 사용하기 때문ì´ë‹¤. CUBRIDê°€ 수행하는 묵시ì 타입 ë³€í™˜ì€ ë‹¤ìŒê³¼ 같다. **묵시ì 타입 변환 표 1** +------------------+--------------+--------------+--------------+----------+----------+---------------+---------------+---------------+ | From \\ To | DATETIME | DATETIMELTZ | DATETIMETZ | DATE | TIME | TIMESTAMP | TIMESTAMPLTZ | TIMESTAMPTZ | +==================+==============+==============+==============+==========+==========+===============+===============+===============+ | **DATETIME** | \- | O | O | O | O | O | O | O | +------------------+--------------+--------------+--------------+----------+----------+---------------+---------------+---------------+ | **DATETIMELTZ** | O | \- | O | O | O | O | O | O | +------------------+--------------+--------------+--------------+----------+----------+---------------+---------------+---------------+ | **DATETIMETZ** | O | O | \- | O | O | O | O | O | +------------------+--------------+--------------+--------------+----------+----------+---------------+---------------+---------------+ | **DATE** | O | O | O | \- | | O | O | O | +------------------+--------------+--------------+--------------+----------+----------+---------------+---------------+---------------+ | **TIME** | | | | | \- | | | | +------------------+--------------+--------------+--------------+----------+----------+---------------+---------------+---------------+ | **TIMESTAMP** | O | O | O | O | O | \- | O | O | +------------------+--------------+--------------+--------------+----------+----------+---------------+---------------+---------------+ | **TIMESTAMPLTZ** | O | O | O | O | O | O | \- | O | +------------------+--------------+--------------+--------------+----------+----------+---------------+---------------+---------------+ | **TIMESTAMPTZ** | O | O | O | O | O | O | O | \- | +------------------+--------------+--------------+--------------+----------+----------+---------------+---------------+---------------+ | **DOUBLE** | | | | | O | O | O | O | +------------------+--------------+--------------+--------------+----------+----------+---------------+---------------+---------------+ | **FLOAT** | | | | | O | O | O | O | +------------------+--------------+--------------+--------------+----------+----------+---------------+---------------+---------------+ | **NUMERIC** | | | | | | O | O | O | +------------------+--------------+--------------+--------------+----------+----------+---------------+---------------+---------------+ | **BIGINT** | | | | | O | O | O | O | +------------------+--------------+--------------+--------------+----------+----------+---------------+---------------+---------------+ | **INT** | | | | | O | O | O | O | +------------------+--------------+--------------+--------------+----------+----------+---------------+---------------+---------------+ | **SHORT** | | | | | O | O | O | O | +------------------+--------------+--------------+--------------+----------+----------+---------------+---------------+---------------+ | **BIT** | | | | | | | | | +------------------+--------------+--------------+--------------+----------+----------+---------------+---------------+---------------+ | **VARBIT** | | | | | | | | | +------------------+--------------+--------------+--------------+----------+----------+---------------+---------------+---------------+ | **CHAR** | O | O | O | O | O | O | O | O | +------------------+--------------+--------------+--------------+----------+----------+---------------+---------------+---------------+ | **VARCHAR** | O | O | O | O | O | O | O | O | +------------------+--------------+--------------+--------------+----------+----------+---------------+---------------+---------------+ .. _number-2-time: **ìˆ«ìž ê°’ì´ TIME ë˜ëŠ” TIMESTAMP(TIMESTAMPLTZ, TIMESTAMPTZ)로 변경ë ë•Œì˜ ì œì•½ 사í•** * **NUMERIC** íƒ€ìž…ì„ ì œì™¸í•œ ëª¨ë“ ìˆ«ìž íƒ€ìž…ì€ **TIME** 타입으로 변환ë 수 있으며, ì´ë•Œ TIMEì€ ìž…ë ¥ 숫ìžë¥¼ 86,400ì´ˆ(1ì¼)로 나눈 나머지 ê°’ì„ ì´ˆë¡œ 계산한 ê°’ì´ë‹¤. * **NUMERIC**\ì„ í¬í•¨í•œ ëª¨ë“ ìˆ«ìž íƒ€ìž…ì€ **TIMESTAMP**, **TIMESTAMPLTZ**, **TIMESTAMPTZ** 타입으로 변환ë 수 있으며, ì´ë•Œ ìž…ë ¥ 숫ìžëŠ” 최대 2,147,483,647ì„ ì´ˆê³¼í• ìˆ˜ 없다. **묵시ì 타입 변환 표 2** +------------------+---------+-----------+---------+------------+----------+-------------+------------+-----------+-------------+------------+ | From \\ To | INT | SHORT | BIT | VARBIT | CHAR | VARCHAR | DOUBLE | FLOAT | NUMERIC | BIGINT | +==================+=========+===========+=========+============+==========+=============+============+===========+=============+============+ | **DATETIME** | | | | | O | O | | | | | +------------------+---------+-----------+---------+------------+----------+-------------+------------+-----------+-------------+------------+ | **DATETIMELTZ** | | | | | O | O | | | | | +------------------+---------+-----------+---------+------------+----------+-------------+------------+-----------+-------------+------------+ | **DATETIMETZ** | | | | | O | O | | | | | +------------------+---------+-----------+---------+------------+----------+-------------+------------+-----------+-------------+------------+ | **DATE** | | | | | O | O | | | | | +------------------+---------+-----------+---------+------------+----------+-------------+------------+-----------+-------------+------------+ | **TIME** | | | | | O | O | | | | | +------------------+---------+-----------+---------+------------+----------+-------------+------------+-----------+-------------+------------+ | **TIMESTAMP** | | | | | O | O | | | | | +------------------+---------+-----------+---------+------------+----------+-------------+------------+-----------+-------------+------------+ | **TIMESTAMPLTZ** | | | | | O | O | | | | | +------------------+---------+-----------+---------+------------+----------+-------------+------------+-----------+-------------+------------+ | **TIMESTAMPTZ** | | | | | O | O | | | | | +------------------+---------+-----------+---------+------------+----------+-------------+------------+-----------+-------------+------------+ | **DOUBLE** | O | O | | | O | O | \- | O | O | O | +------------------+---------+-----------+---------+------------+----------+-------------+------------+-----------+-------------+------------+ | **FLOAT** | O | O | | | O | O | O | \- | O | O | +------------------+---------+-----------+---------+------------+----------+-------------+------------+-----------+-------------+------------+ | **NUMERIC** | O | O | | | O | O | O | O | \- | O | +------------------+---------+-----------+---------+------------+----------+-------------+------------+-----------+-------------+------------+ | **BIGINT** | O | O | | | O | O | O | O | O | \- | +------------------+---------+-----------+---------+------------+----------+-------------+------------+-----------+-------------+------------+ | **INT** | \- | O | | | O | O | O | O | O | O | +------------------+---------+-----------+---------+------------+----------+-------------+------------+-----------+-------------+------------+ | **SHORT** | O | \- | | | O | O | O | O | O | O | +------------------+---------+-----------+---------+------------+----------+-------------+------------+-----------+-------------+------------+ | **BIT** | | | \- | O | O | O | | | | | +------------------+---------+-----------+---------+------------+----------+-------------+------------+-----------+-------------+------------+ | **VARBIT** | | | O | \- | O | O | | | | | +------------------+---------+-----------+---------+------------+----------+-------------+------------+-----------+-------------+------------+ | **CHAR** | O | O | O | O | \- | O | O | O | O | O | +------------------+---------+-----------+---------+------------+----------+-------------+------------+-----------+-------------+------------+ | **VARCHAR** | O | O | O | O | O | \- | O | O | O | O | +------------------+---------+-----------+---------+------------+----------+-------------+------------+-----------+-------------+------------+ 변환 규칙 --------- INSERT와 UPDATE ^^^^^^^^^^^^^^^ ì˜í–¥ì„ 받는 ì¹¼ëŸ¼ì˜ íƒ€ìž…ìœ¼ë¡œ ê°’ì˜ íƒ€ìž…ì´ ë³€í™˜ëœë‹¤. .. code-block:: sql CREATE TABLE t(i INT); INSERT INTO t VALUES('123'); SELECT * FROM t; :: i ============= 123 함수 ^^^^ í•¨ìˆ˜ì— ìž…ë ¥í•œ ì¸ìž ê°’ì„ í•¨ìˆ˜ì—서 ì§€ì •í•œ 타입으로 ë³€í™˜í• ìˆ˜ 있으면 ì¸ìžì˜ íƒ€ìž…ì´ ë³€í™˜ëœë‹¤. 아래 함수ì—서 기대하는 ìž…ë ¥ ì¸ìžëŠ” 숫ìžì´ë¯€ë¡œ, 문ìžì—´ì„ 숫ìžë¡œ 변환한다. .. code-block:: sql SELECT MOD('123','2'); :: mod('123', '2') ========================== 1.000000000000000e+00 함수는 ì¸ìžë¡œ 여러 íƒ€ìž…ì˜ ê°’ì„ ìž…ë ¥ë°›ì„ ìˆ˜ 있는ë°, 함수ì—서 ì§€ì •í•˜ì§€ ì•Šì€ íƒ€ìž…ì˜ ê°’ì´ ì „ë‹¬ë˜ë©´ 다ìŒì˜ ìš°ì„ ìˆœìœ„ì— ë”°ë¼ íƒ€ìž…ì´ ë³€í™˜ëœë‹¤. * ë‚ ì§œ/시간 타입 ( **DATETIME** > **TIMESTAMP** > **DATE** > **TIME** ) * 근사치 수치형 타입 ( **DOUBLE** > **FLOAT** ) * ì •í™•í•œ 수치형 타입 ( **NUMERIC** > **BIGINT** > **INT** > **SHORT** ) * 문ìžì—´ 타입 ( **CHAR** > **VARCHAR** ) ë¹„êµ ì—°ì‚° ^^^^^^^^^ 다ìŒì€ ë¹„êµ ì—°ì‚°ìžì˜ í”¼ì—°ì‚°ìž íƒ€ìž…ì— ë”°ë¥¸ 변환 규칙ì´ë‹¤. +-----------------+-----------------+------------------------------------+----------------+ | 피연산ìž1 타입 | 피연산ìž2 타입 | 변환 | ë¹„êµ íƒ€ìž… | +=================+=================+====================================+================+ | 수치형 타입 | 수치형 타입 | ì—†ìŒ | NUMERIC | | +-----------------+------------------------------------+----------------+ | | 문ìžì—´ 타입 | 피연산ìž2를 **DOUBLE** 로 변환 | NUMERIC | | +-----------------+------------------------------------+----------------+ | | ë‚ ì§œ/시간 타입 | 피연산ìž1ì„ ë‚ ì§œ/시간으로 변환 | TIME/TIMESTAMP | +-----------------+-----------------+------------------------------------+----------------+ | 문ìžì—´ 타입 | 수치형 타입 | 피연산ìž1ì„ **DOUBLE** 로 변환 | NUMERIC | | +-----------------+------------------------------------+----------------+ | | 문ìžì—´ 타입 | ì—†ìŒ | 문ìžì—´ | | +-----------------+------------------------------------+----------------+ | | ë‚ ì§œ/시간 타입 | 피연산ìž1ì„ ë‚ ì§œ/시간 타입으로 변환| ë‚ ì§œ/시간 | +-----------------+-----------------+------------------------------------+----------------+ | ë‚ ì§œ/시간 타입 | 수치형 타입 | 피연산ìž2를 ë‚ ì§œ/시간으로 변환 | TIME/TIMESTAMP | | +-----------------+------------------------------------+----------------+ | | 문ìžì—´ 타입 | 피연산ìž2를 ë‚ ì§œ/시간 타입으로 변환| ë‚ ì§œ/시간 | | +-----------------+------------------------------------+----------------+ | | ë‚ ì§œ/시간 타입 | ìš°ì„ ìˆœìœ„ê°€ ë†’ì€ íƒ€ìž…ìœ¼ë¡œ 변환 | ë‚ ì§œ/시간 | +-----------------+-----------------+------------------------------------+----------------+ ë‚ ì§œ/시간 타입과 수치형 íƒ€ìž…ì´ ë¹„êµë˜ëŠ” 경우 위 í‘œì˜ :ref:`숫ìžê°€ TIME ë˜ëŠ” TIMESTAMP로 변환ë 때 ì œì•½ ì¡°ê±´ <number-2-time>`\ ì„ ì°¸ê³ í•œë‹¤. 피연산ìž1ì´ ë¬¸ìžì—´ íƒ€ìž…ì˜ ì¹¼ëŸ¼ì´ê³ 피연산ìž2ê°€ ê°’ì¸ ê²½ìš°, 다ìŒê³¼ ê°™ì€ ì˜ˆì™¸ê°€ 있다. +-----------------+-------------------+---------------------------------+----------+ | 피연산ìž1 타입 | 피연산ìž2 타입 | 변환 | ë¹„êµ | +=================+===================+=================================+==========+ | 문ìžì—´ íƒ€ìž…ì˜ | 수치형 타입 ê°’ | 피연산ìž2를 문ìžì—´ 타입으로 변환| 문ìžì—´ | | 칼럼 +-------------------+---------------------------------+----------+ | | ë‚ ì§œ/시간 타입 ê°’ | 피연산ìž2를 문ìžì—´ 타입으로 변환| 문ìžì—´ | +-----------------+-------------------+---------------------------------+----------+ 피연산ìž2ê°€ ì§‘í•©ì¸ ì—°ì‚°ìž( **IS IN**, **IS NOT IN**, **= ALL**, **= ANY**, **< ALL**, **< ANY**, **<= ALL**, **<= ANY**, **>= ALL**, **>= ANY** )ì— ëŒ€í•´ì„œëŠ” ìœ„ì˜ ì˜ˆì™¸ê°€ ì ìš©ë˜ì§€ 않는다. 다ìŒì€ ë¹„êµ ì—°ì‚°ì—서 묵시ì 타입 ë³€í™˜ì˜ ì˜ˆì´ë‹¤. * **수치형 타입과 문ìžì—´ 타입 피연산ìž** 문ìžì—´ 타입 피연산ìžê°€ **DOUBLE** 로 변환ëœë‹¤. .. code-block:: sql CREATE TABLE t1(i INT, s STRING); INSERT INTO t1 VALUES(1,'1'),(2,'2'),(3,'3'),(4,'4'), (12,'12'); SELECT i FROM t1 WHERE i < '11.3'; :: i ============= 1 2 3 4 .. code-block:: sql SELECT ('2' <= 11); :: ('2'<=11) ============= 1 * **문ìžì—´ 타입과 ë‚ ì§œ/시간 타입 피연산ìž** 문ìžì—´ 타입 피연산ìžê°€ ë‚ ì§œ/시간 타입으로 변환ëœë‹¤. .. code-block:: sql SELECT ('2010-01-01' < date'2010-02-02'); :: ('2010-01-01'<date '2010-02-02') ================================== 1 .. code-block:: sql SELECT (date'2010-02-02' >= '2010-01-01'); :: (date '2010-02-02'>='2010-01-01') =================================== 1 * **문ìžì—´ 타입과 수치형 타입 호스트 변수 피연산ìž** 수치형 타입 호스트 변수가 문ìžì—´ 타입으로 변환ëœë‹¤. .. code-block:: sql PREPARE s FROM 'SELECT s FROM t1 WHERE s < ?'; EXECUTE s USING 11; :: s =================== '1' * **문ìžì—´ 타입 칼럼과 수치형 타입 ê°’ 피연산ìž** 수치형 타입 ê°’ì´ ë¬¸ìžì—´ 타입으로 변환ëœë‹¤. .. code-block:: sql SELECT s FROM t1 WHERE s > 11; :: s ================== '2' '3' '4' '12' .. code-block:: sql SELECT s FROM t1 WHERE s BETWEEN 11 AND 33; :: s ====================== '2' '3' '12' * **문ìžì—´ 타입 칼럼과 ë‚ ì§œ/시간 타입 ê°’ 피연산ìž** ë‚ ì§œ/시간 타입 ê°’ì´ ë¬¸ìžì—´ 타입으로 변환ëœë‹¤. .. code-block:: sql CREATE TABLE t2 (s STRING); INSERT INTO t2 VALUES ('01/01/1998'), ('01/01/1999'), ('01/01/2000'); SELECT s FROM t2; :: s ====================== '01/01/1998' '01/01/1999' '01/01/2000' .. code-block:: sql SELECT s FROM t2 WHERE s <= date'02/02/1998'; ìœ„ì˜ ì§ˆì˜ì—서 date'02/02/1998'ì´ ë¬¸ìžì—´ '02/02/1998'으로 변환ë˜ì–´ 문ìžì—´ ê°„ì˜ ë¹„êµ ì—°ì‚°ì´ ìˆ˜í–‰ëœë‹¤. :: s ====================== '01/01/1998' '01/01/1999' '01/01/2000' 범위 ì—°ì‚° ^^^^^^^^^ * **수치형 타입과 문ìžì—´ 타입 피연산ìž** 문ìžì—´ 타입 피연산ìžê°€ **DOUBLE** 로 변환ëœë‹¤. .. code-block:: sql CREATE TABLE t3 (i INT); INSERT INTO t3 VALUES (1), (2), (3), (4); SELECT i FROM t3 WHERE i <= ALL {'11','12'}; :: i ============= 1 2 3 4 * **문ìžì—´ 타입과 ë‚ ì§œ/시간 타입 피연산ìž** 문ìžì—´ 타입 피연산ìžê°€ ë‚ ì§œ/시간 타입으로 변환ëœë‹¤. .. code-block:: sql SELECT s FROM t2; :: s ================= '01/01/1998' '01/01/1999' '01/01/2000' .. code-block:: sql SELECT s FROM t2 WHERE s <= ALL {date'02/02/1998',date'01/01/2000'}; :: s ================ '01/01/1998' 해당 타입으로 ë³€í™˜í• ìˆ˜ 없으면 오류를 반환한다. ì‚°ìˆ ì—°ì‚° ^^^^^^^^^ * **ë‚ ì§œ/시간 타입 피연산ìž** ë‚ ì§œ/시간 íƒ€ìž…ì˜ í”¼ì—°ì‚°ìžê°€ '-' ì—°ì‚°ìžì— ì£¼ì–´ì§€ê³ íƒ€ìž…ì´ ì„œë¡œ 다르면, ë‘ íƒ€ìž…ì„ ë¹„êµí•˜ì—¬ ìš°ì„ ìˆœìœ„ê°€ ë†’ì€ ìª½ì˜ íƒ€ìž…ìœ¼ë¡œ 변환ëœë‹¤. ë‹¤ìŒ ì˜ˆëŠ” 왼쪽 피연산ìžì˜ ë°ì´í„° íƒ€ìž…ì´ **DATE** ì—서 **DATETIME** 으로 바뀌어 결과는 **DATETIME** ì˜ '-' ì—°ì‚° ê²°ê³¼ì¸ ë°€ë¦¬ì´ˆë¥¼ ì¶œë ¥í•œë‹¤. .. code-block:: sql SELECT date'2002-01-01' - datetime'2001-02-02 12:00:00 am'; :: date '2002-01-01'- datetime '2001-02-02 12:00:00 am' ===================================================== 28771200000 * **수치형 타입 피연산ìž** 수치형 íƒ€ìž…ì˜ í”¼ì—°ì‚°ìžê°€ ì£¼ì–´ì§€ê³ íƒ€ìž…ì´ ì„œë¡œ 다르면, ë‘ íƒ€ìž…ì„ ë¹„êµí•˜ì—¬ ìš°ì„ ìˆœìœ„ê°€ ë†’ì€ ìª½ì˜ íƒ€ìž…ìœ¼ë¡œ 변환ëœë‹¤. * **ë‚ ì§œ/시간 타입과 수치형 타입 피연산ìž** ë‚ ì§œ/시간 타입과 수치형 íƒ€ìž…ì˜ í”¼ì—°ì‚°ìžê°€ '+' ë˜ëŠ” '-' ì—°ì‚°ìžì— 주어지면, 수치형 타입 피연산ìžëŠ” **BIGINT**, **INT**, **SHORT** 중 하나로 변환ëœë‹¤. * **ë‚ ì§œ/시간 타입과 문ìžì—´ 타입 피연산ìž** ë‚ ì§œ/시간 타입과 문ìžì—´ íƒ€ìž…ì´ í”¼ì—°ì‚°ìžì´ë©´, '+'와 '-' ì—°ì‚°ìžë§Œ 허용한다. '+' ì—°ì‚°ìžê°€ 사용ë˜ë©´ ë‹¤ìŒ ê·œì¹™ì´ ì ìš©ëœë‹¤. * 문ìžì—´ íƒ€ìž…ì€ ì¸í„°ë²Œ(interval) ê°’ì„ ì§€ë‹Œ **BIGINT** 로 변환ëœë‹¤. ì¸í„°ë²Œì€ ë‚ ì§œ/시간 타입 피연산ìžì˜ 가장 ìž‘ì€ ë‹¨ìœ„ë¥¼ ì˜ë¯¸í•˜ë©°, ê° íƒ€ìž…ì˜ ì¸í„°ë²Œ ê°’ì€ ë‹¤ìŒê³¼ 같다. * **DATE** : ì¼ìˆ˜(days) * **TIME**, **TIMESTAMP** : 초수(seconds) * **DATETIME** : 밀리초수(milliseconds) * ë¶€ë™ì†Œìˆ˜ì 수는 반올림ëœë‹¤. * ê²°ê³¼ íƒ€ìž…ì€ ë‚ ì§œ/시간 타입 피연산ìžì˜ 타입ì´ë‹¤. .. code-block:: sql SELECT date'2002-01-01' + '10'; :: date '2002-01-01'+'10' ====================== 01/11/2002 ë‚ ì§œ/시간 타입과 문ìžì—´ íƒ€ìž…ì´ í”¼ì—°ì‚°ìžì´ê³ , '-' ì—°ì‚°ìžê°€ 사용ë˜ë©´ ë‹¤ìŒ ê·œì¹™ì´ ì ìš©ëœë‹¤. * ë‚ ì§œ/시간 타입 피연산ìžê°€ **DATE**, **DATETIME**, **TIMESTAMP** ì´ë©´ 문ìžì—´ì€ **DATETIME** 으로 변환ë˜ê³ , ë‚ ì§œ/시간 타입 피연산ìžê°€ **TIME** ì´ë©´ 문ìžì—´ì€ **TIME** 으로 변환ëœë‹¤. * ê²°ê³¼ íƒ€ìž…ì€ í•ìƒ **BIGINT** ì´ë‹¤. .. code-block:: sql SELECT date'2002-01-01'-'2001-01-01'; :: date '2002-01-01'-'2001-01-01' ================================ 31536000000 -- this causes an error .. code-block:: sql SELECT date'2002-01-01'-'10'; :: ERROR: Cannot coerce '10' to type datetime. * **수치형 타입과 문ìžì—´ 타입 피연산ìž** 수치형 타입과 문ìžì—´ íƒ€ìž…ì´ í”¼ì—°ì‚°ìžì´ë©´ ë‹¤ìŒ ê·œì¹™ì´ ì ìš©ëœë‹¤. * 문ìžì—´ì€ 가능하면 **DOUBLE**\ 로 변환ëœë‹¤. * ê²°ê³¼ íƒ€ìž…ì€ **DOUBLE**\ ì´ë‹¤. .. code-block:: sql SELECT 4 + '5.2'; :: 4+'5.2' ========================== 9.199999999999999e+00 CUBRID 2008 R3.1 ì´í•˜ ë²„ì „ê³¼ 달리, ë‚ ì§œ/시간 í˜•íƒœì˜ ë¬¸ìžì—´, 즉 '2010-09-15'와 ê°™ì€ ë¬¸ìžì—´ì€ ë‚ ì§œ/시간 타입으로 변환ë˜ì§€ 않는다. ë‚ ì§œ/시간 íƒ€ìž…ì„ ê°–ëŠ” 리터럴 DATE'2010-09-15' ì€ ë§ì…ˆ, 뺄셈 ì—°ì‚°ì— ì‚¬ìš©í• ìˆ˜ 있다. .. code-block:: sql SELECT '2002-01-01'+1; :: ERROR: Cannot coerce '2002-01-01' to type double. .. code-block:: sql SELECT date'2002-01-01'+1; :: date '2002-01-01'+1 ===================== 01/02/2002 * **문ìžì—´ 타입 피연산ìž** ë‘ ë¬¸ìžì—´ì„ 곱하거나 나누거나 빼면 숫ìžë¡œ 변환ë˜ë©°, 결과로 **DOUBLE** íƒ€ìž…ì˜ ê°’ì„ ë°˜í™˜í•œë‹¤. .. code-block:: sql SELECT '3'*'2'; :: '3'*'2' ============================ 6.000000000000000e+00 '+' ì—°ì‚°ìžì˜ ë™ìž‘ì€ **cubrid.conf** ì˜ ì‹œìŠ¤í…œ 파ë¼ë¯¸í„°ì¸ **plus_as_concat**\ ì„ ì–´ë–»ê²Œ ì„¤ì •í•˜ëŠëƒì— ë”°ë¼ ê²°ì •ëœë‹¤. ìžì„¸í•œ ë‚´ìš©ì€ :ref:`stmt-type-parameters`\ 를 ì°¸ê³ í•œë‹¤. * **plus_as_concat** ê°’ì´ yes(기본값)ì´ë©´ ë‘ ê°œì˜ ë¬¸ìžì—´ì„ 연결한 ê°’ì„ ë°˜í™˜í•œë‹¤. .. code-block:: sql SELECT '1'+'1'; :: '1'+'1' ====================== '11' * **plus_as_concat** ê°’ì´ noì´ê³ ë‘ ê°œì˜ ë¬¸ìžì—´ì´ 숫ìžë¡œ 변환 가능하면, ë‘ ìˆ«ìžë¥¼ ë”하여 **DOUBLE** íƒ€ìž…ì˜ ê°’ì„ ë°˜í™˜í•œë‹¤. .. code-block:: sql SELECT '1'+'1'; :: '1'+'1' ========================== 2.000000000000000e+00 해당 타입으로 ë³€í™˜í• ìˆ˜ 없으면 오류를 반환한다.