inblog logo
|
LifeLog, DevLog
    SQL

    오라클 쿼리와 MySQL 쿼리 차이점 정리

    KYJTHEYJ's avatar
    KYJTHEYJ
    Nov 07, 2025
    오라클 쿼리와 MySQL 쿼리 차이점 정리

    오라클 쿼리와 MySQL의 쿼리의 차이를 정리해보았다
    다는 아니지만, 비교적 이 정도만 알아도 큰 혼선은 없어보인다

    • 오라클이랑 다른 것 정리

      • 데이터 타입

      구분

      Oracle

      MySQL

      비고

      문자열

      VARCHAR2, CHAR, CLOB

      VARCHAR, CHAR, TEXT

      VARCHAR2 = VARCHAR

      숫자

      NUMBER(p,s)

      DECIMAL(p,s), INT, BIGINT

      NUMBER는 범용적이지만 MySQL은 타입 구분 명확

      날짜

      DATE, TIMESTAMP

      DATE, DATETIME, TIMESTAMP

      MySQL DATE는 시간 미포함

      Boolean

      없음(CHAR(1) 등으로 처리)

      BOOLEAN(실제는 TINYINT(1))

      Oracle에선 조건문으로 대체

      • 상세 정리

        • 문자형

        구분

        Oracle

        MySQL

        주요 차이 및 주의점

        가변 문자

        VARCHAR2(n)

        VARCHAR(n)

        거의 동일. 단, MySQL은 문자셋에 따라 실제 byte 크기 달라짐 (예: UTF8MB4는 한 글자당 최대 4바이트).

        고정 문자

        CHAR(n)

        CHAR(n)

        동일. Oracle은 공백 패딩 포함 비교, MySQL도 기본적으로 같으나 PAD_CHAR_TO_FULL_LENGTH 설정에 따라 다름.

        긴 문자열

        CLOB

        TEXT / MEDIUMTEXT / LONGTEXT

        TEXT 계열은 인덱싱 제한이 있음 (TEXT(255) 형태로 prefix index 필요).

        바이트 기준

        VARCHAR2(20 BYTE)

        VARCHAR(20)

        MySQL은 문자 기준이며 byte 지정 불가. (문자셋 따라 달라짐).

        멀티바이트

        NVARCHAR2

        VARCHAR (UTF8MB4 설정)

        MySQL은 별도 NVARCHAR 없음. UTF8MB4로 통일하는 것이 일반적.

        • 숫자형

        구분

        Oracle

        MySQL

        주요 차이

        일반 숫자

        NUMBER(p,s)

        DECIMAL(p,s)

        기능 동일. 정밀도 유지 필요 시 DECIMAL 사용.

        정수

        NUMBER(10,0)

        INT, BIGINT

        MySQL은 정수형 크기가 고정되어 있음.

        소수

        NUMBER(10,2)

        DECIMAL(10,2)

        동일하게 매핑.

        부호 없는 정수

        없음

        UNSIGNED 옵션

        오라클엔 없음. 예: INT UNSIGNED → 0~42억

        부동소수

        BINARY_FLOAT, BINARY_DOUBLE

        FLOAT, DOUBLE

        단, MySQL FLOAT은 4바이트, DOUBLE은 8바이트로 고정.

        시퀀스용 ID

        NUMBER + SEQUENCE

        INT AUTO_INCREMENT

        MySQL은 자동 증가 옵션으로 대체.

        • 날짜형

        구분

        Oracle

        MySQL

        주요 차이

        날짜

        DATE

        DATE

        Oracle DATE는 시분초 포함, MySQL DATE는 YYYY-MM-DD만 포함.

        날짜시간

        TIMESTAMP

        DATETIME / TIMESTAMP

        MySQL TIMESTAMP는 timezone UTC 기준 저장.

        현재일시

        SYSDATE

        NOW()

        유사하나 타임존 설정 따라 다를 수 있음.

        날짜차이

        date1 - date2 (일수)

        DATEDIFF(date1, date2)

        MySQL은 일 단위만 반환.

        시간차

        (date1 - date2)*24*60*60

        TIMEDIFF(t1, t2)

        MySQL은 시/분/초 단위 반환.

        문자열→날짜

        TO_DATE('2025-11-06','YYYY-MM-DD')

        STR_TO_DATE('2025-11-06','%Y-%m-%d')

        변환 포맷 다름.

      • 함수

      기능

      Oracle

      MySQL

      비고

      현재일시

      SYSDATE, SYSTIMESTAMP

      NOW(), CURRENT_TIMESTAMP()

      NVL

      NVL(a,b)

      IFNULL(a,b)

      COALESCE(a,b,...

      DECODE

      DECODE(a,b,c,d)

      CASE WHEN a=b THEN c ELSE d END

      SUBSTR

      SUBSTR()

      SUBSTRING()

      ROWNUM

      ROWNUM

      LIMIT

      TRUNC 날짜

      TRUNC(date)

      DATE_FORMAT() or CAST()

      • 시퀀스

      항목

      Oracle

      MySQL

      자동 증가

      CREATE SEQUENCE seq_x + seq_x.NEXTVAL

      AUTO_INCREMENT

      NEXTVAL 사용

      SELECT로 직접 호출 가능

      불가 (AUTO_INCREMENT는 insert시 자동 증가)

      • 페이징

      항목

      Oracle

      MySQL

      자동 증가

      CREATE SEQUENCE seq_x + seq_x.NEXTVAL

      AUTO_INCREMENT

      NEXTVAL 사용

      SELECT로 직접 호출 가능

      불가 (AUTO_INCREMENT는 insert시 자동 증가)

      • 트랜잭션과 DML 차이

        • MySQL은 엔진에 따라 트랜잭션 관리가 다름

          • set autocommit = 0 으로 오토커밋 관리 필요

        • MERGE가 없으므로 INSERT … ON DUPLICATE KEY UPDATE 구문 활용

        -- Oracle
        MERGE INTO target t USING src s ON (t.id=s.id)
        WHEN MATCHED THEN UPDATE SET ...
        WHEN NOT MATCHED THEN INSERT (...);
        
        -- MySQL
        INSERT INTO target (...) VALUES (...)
        ON DUPLICATE KEY UPDATE ...;
        
      • 서브쿼리, DUAL, FROM

        항목

        Oracle

        MySQL

        DUAL

        필수

        생략 가능 (SELECT 1;)

        Alias

        AS 생략 가능

        AS 권장 (함수명과 충돌 가능)

        서브쿼리

        거의 동일

        일부 DML 서브쿼리 제한 있음 (버전별 차이)

      • ALTER TABLE의 단일 문장 제한

      • PL/SQL

        • BEGIN…END 프로시저로 간단화 해야함

        • 예외처리가 제한적

          • %TYPE, %ROWTYPE, CURSOR LOOP, EXCEPTION 이 없음

    Share article

    LifeLog, DevLog - https://github.com/KYJTHEYJ

    RSS·Powered by Inblog