일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 식단
- 식단일기
- 플레이팅
- 자바 암호화 알고리즘
- 신입 개발자 자바 면접 질문
- 신입 개발자 자바 면접
- docker
- 자바 stream
- 개발자 면접 질문
- 직장인점심구독
- 프로그래머스 코딩테스트
- 신입 개발자 면접 질문
- 개발자 면접
- 코딩테스트 연습
- 자바 암호화
- 신입 개발자 면접
- 개발자 정규직
- 개발자 인턴
- 샐러드
- 개발자 코딩테스트
- 신입 개발자 필수 면접 질문
- Linux
- docker image
- 개발자 채용연계형인턴
- 프로그래머스
- Plating
- 도커
- 자바 암호화 복호화
- .dockerignore
- 셰프의찾아가는구내식당
- Today
- Total
달리는 두딘
[DB] Oracle - MariaDB 차이 본문
팀장님이 Oracle과 MariaDB 차이점에 대해 분석해오라는 업무를 주셨다!
열심히 정리했는데 아까워서 블로그에도 올려봄 후훗
Oracle - MariaDB 차이
1. 데이터 타입
Oracle | MySQL | |||
1 | BFILE | 이진자료(BINARY DATA)를 저장, ⇐ 4G |
VARCHAR(255) | |
2 | BINARY_FLOAT | 32비트 고정 숫자 | FLOAT | |
3 | BINARY_DOUBLE | 64비트 고정 숫자 | DOUBLE | |
4 | BLOB | 이진 자료 처리, ⇐ 4G | LONGBLOB | |
5 | CHAR(n), CHARACTER(n) | 고정 문자열, 1 ⇐ n ⇐ 255 |
CHAR(n), CHARACTER(n) | |
6 | CHAR(n), CHARACTER(n) | 고정 문자열, 256 ⇐ n ⇐ 2000 |
VARCHAR(n) | |
7 | CLOB | 대용량 데이터를 저장, ⇐ 4G |
LONGTEXT | |
8 | DATE | 날짜 및 시간 | DATETIME | |
9 | DECIMAL(p,s), DEC(p,s) | 고정 소수점 숫자 | DECIMAL(p,s), DEC(p,s) | |
10 | DOUBLE PRECISION | 부동 소수점 숫자 | DOUBLE PRECISION | |
11 | FLOAT(p) | 부동 소수점 숫자 | DOUBLE | |
12 | INTEGER, INT | 38자리 정수 | INT | DECIMAL(38) |
13 | INTERVAL YEAR(p) TO MONTH | 시간 간격(연, 월) | VARCHAR(30) | |
14 | INTERVAL DAY(p) TO SECOND(s) | 시간 간격(일, 시간, 분, 초) | VARCHAR(30) | |
15 | LONG | 문자 데이터, ⇐ 2G | LONGTEXT | |
16 | LONG RAW | 바이너리 데이터, ⇐ 2G | LONGBLOB | |
17 | NCHAR(n) | 고정 길이 UTF-8 문자, 1 ⇐ n ⇐ 255 |
NCHAR(n) | |
18 | NCHAR(n) | 고정 길이 UTF-8 문자, 256 ⇐ n ⇐ 2000 |
NVARCHAR(n) | |
19 | NCHAR VARYING(n) | 고정 길이 UTF-8 문자, 1 ⇐ n ⇐ 4000 |
NCHAR VARYING(n) | |
20 | NCLOB | 가변 길이 유니코드 문자, ⇐ 4G |
NVARCHAR(max) | |
21 | NUMBER(p,0), NUMBER(p) | 8비트 정수, 1 <= p < 3 | TINYINT | (0 to 255) |
16비트 정수, 3 <= p < 5 | SMALLINT | |||
32비트 정수, 5 <= p < 9 | INT | |||
64비트 정수, 9 <= p < 19 | BIGINT | |||
고정 소수점 숫자, 19 <= p <= 38 | DECIMAL(p) | |||
22 | NUMBER(p,s) | 고정 소수점 숫자, s > 0 | DECIMAL(p,s) | |
23 | NUMBER, NUMBER(*) | 부동 소수점 숫자 | DOUBLE | |
24 | NUMERIC(p,s) | 고정 소수점 숫자 | NUMERIC(p,s) | |
25 | NVARCHAR2(n) | 고정 길이 UTF-8 문자, 1 ⇐ n ⇐ 4000 |
NVARCHAR(n) | |
26 | RAW(n) | 가변 길이 이진 문자열, 1 ⇐ n ⇐ 255 |
BINARY(n) | |
27 | RAW(n) | 가변 길이 이진 문자열, 256 ⇐ n ⇐ 2000 |
VARBINARY(n) | |
28 | REAL | 부동 소수점 숫자 | DOUBLE | |
29 | ROWID | 물리적 행 주소 | ROW | |
30 | SMALLINT | 38자리 정수 | DECIMAL(38) | |
31 | TIMESTAMP(p) | 날짜와 시간값 | DATETIME(p) | |
32 | TIMESTAMP(p) WITH TIME ZONE | 날짜와 시간값(타임존 포함) | DATETIME(p) | |
33 | UROWID(n) | 논리적 행 주소, 1 ⇐ n ⇐ 4000 |
VARCHAR(n) | |
34 | VARCHAR(n) | 가변 길이 문자열, 1 ⇐ n ⇐ 4000 |
VARCHAR(n) | |
35 | VARCHAR2(n) | 가변 길이 문자열, 1 ⇐ n ⇐ 4000 |
VARCHAR(n) | |
36 | XMLTYPE | XML 데이터 | LONGTEXT |
2. DUAL 테이블
DESC DUAL 구문은 MariaDB에서 작동하지 않으며,
MySQL의 CURRENT_TIMESTAMP가 시간대를 포함하지 않기 때문에 결과도 다름
Oracle (DUAL)
SQL>
DESC DUAL;
Name Null? Type
---------------------------------------- --------- ------------
DUMMY VARCHAR2(1)
SQL>
SELECT CURRENT_TIMESTAMP FROM DUAL;
CURRENT_TIMESTAMP
---------------------------------------------------------------
16-FEB-19 04.16.18.910331 AM +08:00
MariaDB (DUAL)
MariaDB [test]>
DESC DUAL;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DUAL' at line 1
MariaDB [test]>
SELECT CURRENT_TIMESTAMP FROM DUAL;
+---------------------+
| CURRENT_TIMESTAMP |
+---------------------+
| 2019-02-27 04:11:01 |
+---------------------+
1 row in set (0.000 sec)
3. SYSDATE
사용 함수 | 반환 타입 | ||
Oracle | SYSDATE | 시간 없이 날짜만 반환 | |
MariaDB | SYSDATE() | 시간, 날짜 둘 다 반환 |
Oracle (SYSDATE)
SQL>
SELECT TO_CHAR (SYSDATE, 'MM-DD-YYYY HH24:MI:SS') "NOW" FROM DUAL;
NOW
-------------------
02-16-2019 04:39:00
SQL>
SELECT SYSDATE FROM DUAL;
SYSDATE
---------
16-FEB-19
MariaDB (SYSDATE())
MariaDB [test]>
SELECT SYSDATE() FROM DUAL;
+---------------------+
| SYSDATE() |
+---------------------+
| 2019-02-27 04:11:57 |
+---------------------+
1 row in set (0.000 sec)
4. TO_DATE
사용 함수 | 반환 타입 | ||
Oracle | TO_DATE() | DATE 데이터 유형을 반환 | |
MariaDB | STR_TO_DATE() | DATETIME 데이터 유형을 반환 |
Oracle (TO_DATE)
SQL>
SELECT TO_DATE ('20190218121212','yyyymmddhh24miss') as "NOW" FROM DUAL;
NOW
-------------------------
18-FEB-19
MariaDB (STR_TO_DATE())
MariaDB [test]>
SELECT STR_TO_DATE('2019-02-18 12:12:12','%Y-%m-%d %H:%i:%s') as "NOW" FROM DUAL;
+---------------------+
| NOW |
+---------------------+
| 2019-02-18 12:12:12 |
+---------------------+
1 row in set (0.000 sec)
5. NULL 및 빈 문자열
사용 함수 | |
Oracle | NVL, NVL2 |
MariaDB | IFNULL |
Oracle (NULL)
SQL>
SELECT
NVL(COMPANY_NO,'')
FROM COMPANY_TABLE
WHERE NATION= 'KR';
SELECT
NVL2(COMPANY_NO,'계열사','비계열사')
FROM COMPANY_TABLE
WHERE NATION= 'KR';
MariaDB (NULL)
MariaDB [test]>
SELECT IFNULL(NULL, “TEST”);
---
TEST
빈 문자열의 경우 | |
Oracle | NULL로 취급 |
MariaDB | NULL로 취급하지 않음 |
Oracle (빈 문자열)
SQL>
SELECT CASE WHEN '' IS NULL THEN 'Yes' ELSE 'No' END AS "Null Eval" FROM dual;
Nul
---
Yes
MariaDB (빈 문자열)
MariaDB [test]>
SELECT CASE WHEN '' IS NULL THEN 'Yes' ELSE 'No' END AS "Null Eval" FROM dual;
+-----------+
| Null Eval |
+-----------+
| No |
+-----------+
1 row in set (0.001 sec)
6. 시퀀스
MariaDB 10.3부터 Oracle 호환 시퀀스 및 Oracle PL/SQL과 호환되는 저장 프로시저 언어가 도입됨
MariaDB에서 시퀀스 생성은 Oracle의 SEQUENCE와 매우 유사함
Oracle (SEQUENCE)
CREATE SEQUENCE s START WITH 100 INCREMENT BY 10;
CREATE SEQUENCE s2 START WITH -100 INCREMENT BY -10;
MariaDB (SEQUENCE)
CREATE SEQUENCE s3 START WITH -100 INCREMENT BY 10 MINVALUE=-100 MAXVALUE=1000;
7. DML
Oracle의 INSERT/UPDATE/DELETE 문은 MariaDB에서 일치함
Oracle의 INSERT ALL/INSERT FIRST 는 MariaDB에서 지원되지 않음
Oracle (DML)
SQL>
INSERT ALL
INTO CUSTOMERS (customer_id, customer_name, city) VALUES (1000, 'Jase Alagaban', 'Davao City')
INTO CUSTOMERS (customer_id, customer_name, city) VALUES (2000, 'Maximus Aleksandre Namuag', 'Davao City')
SELECT * FROM dual;
2 rows created.
MariaDB에서는 삽입을 한 번에 하나씩 실행해야 함
MariaDB (DML)
MariaDB [test]>
INSERT INTO CUSTOMERS (customer_id, customer_name, city) VALUES (1000, 'Jase Alagaban', 'Davao City');
Query OK, 1 row affected (0.02 sec)
MariaDB [test]>
INSERT INTO CUSTOMERS (customer_id, customer_name, city) VALUES (2000, 'Maximus Aleksandre Namuag', 'Davao City');
Query OK, 1 row affected (0.00 sec)
8. 계층형 쿼리
Oracle | MariaDB |
START WITH..CONNECT BY | CTE(Common Table Expression) |
Oracle (START WITH..CONNECT BY)
WITH sales_product_year AS (
SELECT
product,
YEAR(ship_date) AS YEAR,
SUM(price) AS total_amt
FROM
item_sales
GROUP BY
product,
YEAR
)
SELECT
*
FROM
sales_product_year S1
WHERE
total_amt >
(
SELECT
0.1 * SUM(total_amt)
FROM
sales_product_year S2
WHERE
S2.year = S1.year)
MariaDB (CTE)
WITH RECURSIVE bus_dst AS (
SELECT
origin AS dst
FROM
bus_routes
WHERE
origin = 'New York'
UNION
SELECT
bus_routes.dst
FROM
bus_routes,
bus_dst
WHERE
bus_dst.dst = bus_routes.origin
)
SELECT
*
FROM
bus_dst;
9. MariaDB의 PL/SQL?
MariaDB에서 PL/SQL 호환성을 사용할 때마다 다음과 같이 SQL_MODE = 'Oracle'로 설정
SET SQL_MODE=‘ORACLE’;
해당 호환성 사용 시 다음 항목들 사용 가능
- 루프 구문
- 변수 선언
- Non-ANSI 저장 프로시저 구성
- 커서 구문
- 저장 프로시저 매개변수
- 데이터 유형 상속(%TYPE, %ROWTYPE)
- PL/SQL 스타일 예외
- 기본 SQL 유형의 동의어(VARCHAR2, NUMBER, …)
MariaDB (PL/SQL)
MariaDB [test]>
CREATE OR REPLACE PACKAGE BODY hello AS
->
-> vString VARCHAR2(255) := NULL;
->
-> -- was declared public in PACKAGE
-> PROCEDURE helloFromS9s(pString VARCHAR2) AS
-> BEGIN
-> SELECT 'Severalnines showing MariaDB Package Procedure in ' || pString || '!' INTO vString FROM dual;
-> SELECT vString;
-> END;
->
-> BEGIN
-> SELECT 'called only once per connection!';
-> END hello;
-> /
Query OK, 0 rows affected (0.021 sec)
MariaDB [test]>
DECLARE
-> vString VARCHAR2(255) := NULL;
-> -- CONSTANT seems to be not supported yet by MariaDB
-> -- cString CONSTANT VARCHAR2(255) := 'anonymous block';
-> cString VARCHAR2(255) := 'anonymous block';
-> BEGIN
-> CALL hello.helloFromS9s(cString);
-> END;
+----------------------------------+
| called only once per connection! |
+----------------------------------+
| called only once per connection! |
+----------------------------------+
1 row in set (0.000 sec)
+--------------------------------------------------------------------+
| vString |
+--------------------------------------------------------------------+
| Severalnines showing MariaDB Package Procedure in anonymous block! |
+--------------------------------------------------------------------+
1 row in set (0.000 sec)
Query OK, 1 row affected (0.000 sec)
MariaDB [test]> DELIMITER ;
출처
https://severalnines.com/blog/migration-oracle-database-mariadb-deep-dive/
https://solbel.tistory.com/433
'지식노트' 카테고리의 다른 글
그림과 작동 원리로 쉽게 이해하는 서버의 기초 - 2. 네트워크 기초 지식 (2) | 2023.06.06 |
---|---|
그림과 작동 원리로 쉽게 이해하는 서버의 기초 - 1. 서버란 (4) | 2023.06.06 |
[JPA] JPQL 사용 방법(@Query & nativeQuery & DTO Mapping & function) (4) | 2023.04.14 |
[JAVA] HTTP 다양한 통신 방법 (URLConnection / RestTemplate / HttpClient / WebClient) (17) | 2023.03.13 |
[Linux] haproxy 설명 및 haproxy.cfg 설정 (0) | 2023.03.09 |