| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
- JavaScript
- 오류
- 노션
- 멀티캠퍼스it부트캠프
- jQuery
- DOM
- SQL
- strpos()
- DTO
- 함수
- OOP
- ES6
- dao
- php
- formula
- 객체지향
- 정규식
- 부트캠프후기
- 배열
- Excel
- 깃허브
- myshortcut
- error
- react
- 현대이지웰java풀스택개발자아카데미6월
- node.js
- MySQL
- Java
- JDBC
- explode()
- Today
- Total
코딩짜는 일상
[현대이지웰 Java 풀스택 개발자 아카데미 6월] TIL 17차 - 오라클과 MySQL의 차이 본문
📚 서론
이번 주는 제가 장기간 써오던 MySQL과
현재 참가중인 풀스택 개발자 과정에서 배운 오라클의 차이점을 알아보겠습니다.
사실 둘 다 SQL을 베이스로 하기 때문에 달라봐야 얼마나 다르겠냐 싶었는데
프로젝트를 시작하고 실제로 테이블을 만들어보니까 차이점이 확연히 와닿았습니다.
그리고... 오라클이 다소... 조금... 까다로운... 편인 것 같습니다...🥹

그래도 어렵고 까다로울수록 사람보단 기계(?) 친화적이라는 뜻이니까
잘만 쓸 수 있다면 사용자에게 더 좋은 서비스를 제공할 수 있을 겁니다!
실제로도 MySQL 보다는 오라클이 복잡한 계산이나 대량의 데이터 분석에 강하다고 합니다.
대량의 텍스트 정보에서 원하는 서치를 빠르게 해주는 CTXSYS.DRITHSX.SN 같은 기능도 제공하고 있습니다.
(비록 Error based Injection 공격에 주로 쓰이긴 하지만... 그래도 잘 쓰면 좋은 기능인데...🥹)
아무튼 엄청 디테일하게 많은 걸 다뤄볼 건 아니고
프로젝트를 하면서 알게 된 만큼만 간단하게 다뤄보겠습니다.

🎷 자료형
MySQL에선 그냥 편하게 썼던 자료형이
오라클에서 쓰려고 보면 없거나 많이 달랐던 경우가 종종 있었습니다.
덕분에 막 완성했던 ERD를 테이블 만드는 시점에 한 번 싹 갈아엎었습니다...

만약 이 포스팅을 보는 분이 계시다면 저와 같은 일은 겪지 않으셨으면 좋겠네요...🥹
1️⃣ 숫자 자료형
먼저... 오라클에는 INT가 없습니다.
오라클에서 쓸 수 있는 숫자 자료형에는 NUMBER, BINARY_FLOAT, BINARY_DOUBLE이 있고
그중에서 INT와 가장 비슷하게 쓸 수 있는 게 NUMBER 입니다.
NUMBER는 정수와 실수를 모두 저장할 수 있으며
그냥 NUMBER를 쓰면 최대 38자리까지 정수/실수를 모두 허용하는 형태로 쓸 수 있습니다.
NUMBER(a)를 쓰면 최대 a자리 정수만 허용하도록 쓸 수 있고
NUMBER(a, b)를 쓰면 전체 a자리 중 b자리는 소수점 이하로 쓰도록 허용할 수 있습니다.
ex) NUMBER(7, 3) → 총 7자리 중 4자리는 정수 3자리는 소수점 이하
2️⃣ 문자 자료형
오라클에도 VARCHAR2가 있습니다.
심지어 메모리에 효율적이라며 오라클에서 사용을 권장하는 자료형입니다.
하지만 VARCHAR2(a)를 사용해도 a자리 숫자만큼 문자를 입력할 순 없습니다.
오라클에서 VARCHAR2(a)는 a bytes만큼 문자를 입력할 수 있다는 뜻입니다.
문자 수가 아니라 bytes가 단위입니다.😱 (선생님.. 제가 bytes를 어떻게 계산해서 문자를 입력할 수 있겠습니까...!)
물론 문자 수 기준으로 입력도 가능합니다.
유니코드에 기반한 NVARCHAR2(a)를 쓰거나
숫자 옆에 CHAR를 붙여서 VARCHAR2(a CHAR)를 쓰면 문자 수 만큼 입력하도록 제한할 수 있습니다.
장문의 게시글을 저장할 때 오라클에는 TEXT가 없어서 사용할 수 없습니다.
대신 LONG과 CLOB를 제공하는데 LONG은 구형이라 오라클에선 CLOB를 권장합니다.
CLOB는 대용량의 문자 데이터를 저장할 수 있으며 최대 4GB까지 저장할 수 있습니다.
6만5천자 정도 저장할 수 있었던 MySQL의 TEXT보다 너무나 큰 용량이라서 좀 놀라웠습니다.
(물론 MySQL에도 LONGTEXT가 있긴 한데 한 번도 쓰는 걸 못 봤어요...)

3️⃣ 날짜 자료형
ERD를 싹 갈아엎고도 한 번 더 갈아엎게 만든 대망의 날짜 자료형입니다...
오라클의 TIMESTAMP는 MySQL의 TIMESTAMP와 의미가 완전히 다릅니다.(두둥🫠)
MySQL에서 TIMESTAMP는 날짜와 시간만 포함하지만
오라클의 TIMESTAMP는 날짜 + 시간 + 최대 9자리의 소수초를 포함합니다.
그냥 그대로 두고 쓸 때 소수초만 날려서 쓸까도 생각했지만
이 경우 MyBatis를 쓰면 mapper에 sql.Timestamp를 임포트 한 다음 날짜 필드의 자료형을 Timestamp 로 설정해주는 resultMap을 만들어서 쿼리 태그에 결과값 형식으로 지정해주라는 말을 듣고 바로 포기했습니다.
(그냥 ERD를 한 번 더 갈아엎는 게 시간이 절약될 것 같았습니다...)
MySQL은 날짜만 저장할 때 DATE를 사용하지만 오라클은 날짜만 저장하는 형식이 없습니다.
오라클의 DATE 는 날짜 + 시간을 포함하며 형식은 YYYY-MM-DD HH24:MI:SS 입니다.
추가로 오라클에는 NOW() 함수는 없지만
서버 기준과 세션 기준을 구분해서 사용할 수 있는 다른 함수들이 있습니다.
- SYSDATE : 서버 시간 기준. 현재 날짜와 시간.
- CURRENT_DATE : 세션 시간 기준. 현재 날짜와 시간.
- SYSTIMESTAMP : 서버 시간 기준. 날짜 + 시간 + 소수초 + 타임존
- CURRENT_TIMESTAMP : 세션 시간 기준. 날짜 + 시간 + 소수초
🎺 쿼리 문법
이번에는 MySQL과 오라클의 쿼리 문법 차이를 정리해보겠습니다.
1️⃣ 대소문자 구분
오라클에서는 큰 따옴표( " )안에 필드명을 넣으면 대소문자를 구분합니다.


반대로 말하자면 큰 따옴표( " ) 안에 필드명을 넣지 않으면 대소문자를 구분하지 않는데
오라클에서는 필드명을 자동으로 대문자로 인식해 처리합니다.

쿼리를 작성할 때마다 큰 따옴표를 써주는 건 생각보다 번거롭습니다.
그래서 생각을 바꿔 테이블을 생성할 때 큰 따옴표를 제외하고 만들었습니다.


그러면 테이블 생성 쿼리에 필드명을 소문자로 써줬어도 자동으로 대문자 처리하기 때문에
조회 쿼리를 작성할 때 큰 따옴표 없이 자유롭게 조회할 수 있게 됩니다.

2️⃣ 문자열 인식
오라클은 문자열을 작성할 때 작은 따옴표( ' )에 감싸줘야만 인식합니다.


테이블에 DEFULT 값을 설정해줄 때도 문자를 설정할 땐 작은 따옴표에 감싸줘야 합니다.
ex) DEFULT '기본값'
3️⃣ DEFULT 공백 처리
이건 확실히 MySQL보다 오라클이 더 좋은점이라고 할 수 있을 것 같습니다.
MySQL은 공백 ( "" )과 NULL을 다르게 보기 때문에
보통 NOT NULL과 DEFULT "" 를 함께 설정해주어 검색할 때 편의성을 높입니다.
ex) 이름이 없는 레코드를 찾을 때 : select * from 테이블 where 이름=""
하지만 오라클은 공백과 NULL을 동일하게 취급하기 때문에
문자열 필드에 공백을 입력해도 자동으로 NULL로 처리됩니다.
다시 말해서 입력값에 오류가 있는 레코드를 찾을 때 NULL만 고려해서 조회하면 된다는 것입니다!

확실히 오류로 값이 누락된 채 저장되었다면 null이 더 직관적이니까
이건 오라클이 더 나은 부분이라 할 수 있겠습니다.😎✨
4️⃣ AS
오라클에선 AS를 사용하지 않습니다.
그냥 공백을 두고 약어로 쓸 단어를 입력하는 식으로 약어 기능을 사용합니다.


5️⃣ WHERE절 더미 조건
검색 기능을 구현하게 되면 검색 조건이 있을때만 where절에 동적으로 조건이 추가되기 때문에
쿼리 오류가 생기지 않도록 더미 조건을 쓰고 이후 추가되는 검색 조건을 AND를 사용해 붙입니다.
ex) select * from 테이블 where 더미조건 and 검색조건
그런데 MySQL에선 1만 입력해도 더미 조건으로 부합하는데
오라클에선 1=1까지 입력해야 더미 조건에 부합합니다...


사소하지만 이런것까지 다른점이 신기해서 작성해보았습니다.
🔥 결론
DUAL 테이블 이야기는 제외했는데도 막상 정리하고 보니 생각보다 차이점이 많은 것 같습니다.

좀 더 복잡한 쿼리를 작성하게 되면 또 새로운 차이점을 발견하겠죠...?
그럼 그때가서 업데이트 하는 것으로 하고 이번 글은 여기서 마무리 해보도록 하겠습니다.🫠
'TIL' 카테고리의 다른 글
| [현대이지웰 Java 풀스택 개발자 아카데미 6월] TIL 16차 - 깃허브 그룹 프로젝트(이슈 생성, 커밋, 풀 리퀘스트) (0) | 2025.11.05 |
|---|---|
| [현대이지웰 Java 풀스택 개발자 아카데미 6월] TIL 15차 - 스프링 부트 프로젝트에 React 뷰 적용 방법 (0) | 2025.10.29 |
| [현대이지웰 Java 풀스택 개발자 아카데미 6월] TIL 14차 - 비동기 통신 (0) | 2025.10.21 |
| [현대이지웰 Java 풀스택 개발자 아카데미 6월] TIL 13차 - 스프링 부트 (0) | 2025.10.15 |
| [현대이지웰 Java 풀스택 개발자 아카데미 6월] TIL 12차 - 스프링 (0) | 2025.10.01 |