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
728x90


없다.



결론부터 말하면 LEFT OUTER JOIN과 LEFT JOIN의 결과는 같다.


LEFT OUTER JOIN을 줄여쓰면 LEFT JOIN이 된다.



또,

INNER JOIN을 줄여쓰면 그냥 JOIN이 된다.



나는 헷갈려서 그냥 OUTER, INNER를 명시적으로 써주는 편인데

같이 개발하시는 다른분들이 다 줄여쓰셔서 다 바꿨다..



구글링 해보면 이것저것 많이들 나온다.


아래는 내가 구글링 했던 블로그이다.

참고하시길...

http://egloos.zum.com/sweeper/v/3002220 <- OUTER JOIN

http://egloos.zum.com/sweeper/v/3002133 <- INNER JOIN

728x90

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

MySQL에서 CUBRID로 바꿀때 변경했던 것들  (0) 2016.09.20

+ Recent posts