728x90

MySQL과 큐브리드는 생각보다 많이 비슷하고도 많이 다르다.


이번에 MySQL로 쓰고있던 것을 큐브리드로 갈아타는 작업이 생겼는데,

작업을 하며 검색했던 차이점을 나중에 또 찾는 수고스러운 작업을 피하기 위해 여기에 메모해둔다.


아직은 찾은 종류가 많진 않은데 작업하면서 계속 추가할 예정이다.



1. MySQL에서 형변환 시 

CAST(TEMP_COL AS CHAR) 에서 CAST(TEMP_COL AS CHAR(2)) 으로 변경했다.

CHAR에 범위가 들어가 있지 않아서 에러가 난듯했다.

* 근데  SELECT CAST('F' AS CHAR) FROM DB_ROOT; 를 하면 에러는 안나는데... 

  여하튼 CHAR에서 CHAR(범위)로 바꾼뒤 쿼리는 정삭적으로 실행되었다.



2. 예약어 쓰기

MySQL에서는 YEAR, MONTH, DAY를 쌍따옴표를 쓰지 않고도 알리아스로 쓸 수 있다.

하지만 큐브리드에서는 예약어를 쓸때 꼭 쌍따옴표로 감싸줘야 한다.


MySQL : SELECT '2016' AS YEAR FROM DUAL;

cubrid : SELECT '2016' AS "YEAR" FROM DB_ROOT;

* 물론 예약어는 되도록 쓰지않는것이 좋을것 같다.



3. SYSDATE 사용

MySQL에서는 현재날짜를 사용할때 NOW() 또는 SYSDATE()를 이용한다.

큐브리드에서는 각각 NOW()와 SYSDATE로 써야한다.


MySQL : SELECT SYSDATE(), NOW() FROM DUAL;

cubrid : SELECT SYSDATE, NOW() FROM DB_ROOT;



4. REPLACE사용

MySQL에서는 REPLACE함수를 사용할때 인자를 홑따옴표로 감싸도 되고 쌍따옴표로 감싸도 된다.

SELECT REPLACE('2016-09-07','-','') FROM DUAL;     -- OK

SELECT REPLACE("2016-09-07","-","") FROM DUAL;  -- OK


하지만 큐브리드에서는 홑따옴표로 감싸야만 한다.

SELECT REPLACE('2016-09-07','-','') FROM DB_ROOT;        -- OK

SELECT REPLACE("2016-09-07","-","") FROM DB_ROOT;     -- ERROR



5. 날짜연산

잘못된 구문이긴 한데 기존에 Mysql에서

SELECT DATE('2016-09-07')-DATE('2016-09-01') FROM DUAL;

같은 구문을 쓰고 있는게 있었다.

(두 날짜의 차이를 구하는 올바른 함수는 DATEDIFF(날짜1, 날짜2)이다.)


위의 구문을 돌리면 결과값으로 6이 나온다.

왜냐, 20160907이라는 숫자값에서 20160901이라는 숫자값을 빼기 때문이다.

SELECT DATE('2016-09-07')-DATE('2015-09-01') FROM DUAL;

위의 쿼리를 돌리면?

결과값으로 10006이 나온다. 20160907 - 20150901 로 계산하기 때문이다.


암튼, MqSQL에서는 이런식으로도 쿼리 실행이 가능한데 큐브리드에서는 안된다.

큐브리드에서 두 날짜의 차이를 비교하려면 DATEDIFF함수를 써야한다.

SELECT DATEDIFF(DATE('2016-09-07'),DATE('2016-09-01')) FROM DB_ROOT;       -- OK


오늘 날짜랑 비교하려면 

SELECT DATEDIFF(DATE(SYSDATE),DATE('2016-09-01')) FROM DB_ROOT;           -- OK

이렇게 쓰면 된다.



6. MySQL의 varbinary에서 큐브리드의 BIT VARYING으로

간혹, MySQL에서 데이터 컬럼 중에 varbinary타입을 쓰는 경우가 있다.

이경우 큐브리드에서는 BIT VARYING타입을 써야하는데,

이때 where절에서 조회하는 방법이 바뀔 수 있다.


varbinary타입이 내가 많이 쓰는 쪽은 아니라서 맞는진 모르겠지만

기존에 구문이

SELECT COL1 FROM TEMP_TBL WHERE COL1 = '1';   -- (COL1이 varbinary타입일경우) ( 결과 : 31 )

위처럼 쓰여지고 있었다.

재미있는건 해당 컬럼에 insert를 할때 그 데이터가 hex(16진수)화 되어서 들어가는데 where절에서 조건을 1로 줘서 조회를 하면

결과는 1이 hex화된 31이 나온다.


이런 상황에서 큐브리드로 갈아타려면

insert할때는 들어가는 값을 hex함수로 감싸서 넣어주어야 하고

select할때는 where 절에서는 "CAST(OTHBC_YN AS VARCHAR) = hex('1')" 과 같이 varchar로 cast한 컬럼값과 hex화된 데이터 값을 비교하도록 변경하여야 한다. 

입력 : INSERT INTO TEMP_TBL ( COL1 ) VALUES ( HEX('1') );

조회 : SELECT COL1 FROM TEMP_TBL WHERE CAST(COL1 AS VARCHAR) = hex('1')



728x90

'개발 > DB' 카테고리의 다른 글

[오라클] LEFT OUTER JOIN과 LEFT JOIN의 차이점  (3) 2016.09.08

+ Recent posts