---
description: DBMS 업그레이드 후 더 이상 사용되지 않으며 향후 시리즈에서 제거될 수 있는 기능
---

# 더 이상 사용되지 않는 기능

### 1. <mark style="background-color:orange;">utf8mb3 문자 집합</mark>은 더 이상 사용되지 않으며, <mark style="background-color:green;">대신 utf8mb4를 사용</mark>

### 2. 다음 문자 집합은 더 이상 사용되지 않음 <a href="#eb-8b-a4-ec-9d-8c-eb-ac-b8-ec-9e-90-ec-a7-91-ed-95-a9-ec-9d-80-eb-8d-94-ec-9d-b4-ec-83-81-ec-82-ac-e" id="eb-8b-a4-ec-9d-8c-eb-ac-b8-ec-9e-90-ec-a7-91-ed-95-a9-ec-9d-80-eb-8d-94-ec-9d-b4-ec-83-81-ec-82-ac-e"></a>

* ucs2
* macroman and macce
* dec
* hp8

### &#x20;3. SQL 모드의 <mark style="background-color:orange;">PAD\_CHAR\_TO\_FULL\_LENGTH</mark> 는 더 이상 사용되지 않음 <a href="#sql-eb-aa-a8-eb-93-9c-ec-9d-98" id="sql-eb-aa-a8-eb-93-9c-ec-9d-98"></a>

<details>

<summary>세부 정보</summary>

```
CREATE TABLE t1 (c1 CHAR(10));
INSERT INTO t1 (c1) VALUES('xy');

SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';

SELECT c1, CHAR_LENGTH(c1) FROM t1;
/* CHAR 값이 전체 길이로 채워짐
+------------+-----------------+
| c1         | CHAR_LENGTH(c1) |
+------------+-----------------+
| xy         |              10 |
+------------+-----------------+
*/

SET sql_mode = '';

SELECT c1, CHAR_LENGTH(c1) FROM t1;
/* 후행 공백 제거
+------+-----------------+
| c1   | CHAR_LENGTH(c1) |
+------+-----------------+
| xy   |               2 |
+------+-----------------+
*/
```

</details>

### 4. FLOAT, DOUBLE(및 모든 동의어) 타입의 컬럼에 대해 <mark style="background-color:orange;">AUTO\_INCREMENT</mark>는 더 이상 사용되지 않음

### 5. FLOAT, DOUBLE, DECIMAL(및 모든 동의어) 타입의 컬럼에 대해 <mark style="background-color:orange;">UNSIGNED 속성</mark>은 더 이상 사용되지 않음

* CHECK 제약 조건 사용 고려

### 6. FLOAT, DOUBLE(및 모든 동의어) 타입의 컬럼에 대한 <mark style="background-color:orange;">자릿수를 지정하는 FLOAT(M,D), DOUBLE(M,D) 구문</mark>은 더 이상 사용되지 않음

### 7. 숫자 데이터 타입에서 <mark style="background-color:orange;">ZEROFILL 속성</mark>은 더 이상 사용되지 않음

<details>

<summary>세부 정보</summary>

```
CREATE TABLE t1 (col1 int(10) ZEROFILL);
INSERT INTO t1 VALUES (123), (12345), (1234567), (1234567890);

SELECT * FROM t1;
/*
+------------+
| col1       |
+------------+
| 0000000123 |
| 0000012345 |
| 0001234567 |
| 1234567890 |
+------------+
*/

# LPAD() 함수 사용
CREATE TABLE t2 (col1 int);
INSERT INTO t2 VALUES (123), (12345), (1234567), (1234567890);

SELECT LPAD(col1, 10, '0') as col1 FROM t2;
/*
+------------+
| col1       |
+------------+
| 0000000123 |
| 0000012345 |
| 0001234567 |
| 1234567890 |
+------------+
*/
```

</details>

### 8. utf8mb4 문자 집합에 여러 \_bin collation이 있으므로 <mark style="background-color:orange;">문자열 데이터 유형의 BINARY 속성</mark>은 더 이상 사용되지 않음

* 명시적인 \_bin collation 필요

<details>

<summary>세부 정보</summary>

```
CREATE TABLE t1 (
  col1 varchar(10),
  col2 varchar(10) binary
);

INSERT INTO t1 VALUES ('aBc','aBc'), ('AbC', 'AbC'), ('abC', 'abC'), ('aBC', 'aBC');

SELECT * FROM t1;
/*
+------+------+
| col1 | col2 |
+------+------+
| aBc  | aBc  |
| AbC  | AbC  |
| abC  | abC  |
| aBC  | aBC  |
+------+------+
*/

# col1은 대소문자를 구분하지 않음
SELECT * FROM t1 ORDER BY col1;
/*
+------+------+
| col1 | col2 |
+------+------+
| aBc  | aBc  |
| AbC  | AbC  |
| abC  | abC  |
| aBC  | aBC  |
+------+------+
*/

SELECT * FROM t1 ORDER BY col1 DESC;
/*
+------+------+
| col1 | col2 |
+------+------+
| aBc  | aBc  |
| AbC  | AbC  |
| abC  | abC  |
| aBC  | aBC  |
+------+------+
*/

# binary collation인 col2는 대소문자를 구분
SELECT * FROM t1 ORDER BY col2;
/*
+------+------+
| col1 | col2 |
+------+------+
| AbC  | AbC  |
| aBC  | aBC  |
| aBc  | aBc  |
| abC  | abC  |
+------+------+
*/

SELECT * FROM t1 ORDER BY col2 DESC;
+------+------+
| col1 | col2 |
+------+------+
| abC  | abC  |
| aBc  | aBc  |
| aBC  | aBC  |
| AbC  | AbC  |
+------+------+
```

</details>

### 9. CHARACTER SET latin1, CHARACTER SET ucs2에 대한 각각 비표준 단축 표현 ASCII, UNICODE 는 더 이상 사용되지 않음

### 10. 비표준 C 스타일 연산자 <mark style="background-color:orange;">&&, ||, !</mark>는 더 이상 사용되지 않음

* **표준 SQL AND, OR, NOT 사용**

### 11. <mark style="background-color:orange;">JSON\_MERGE() 함수</mark>는 더 이상 사용되지 않으며, <mark style="background-color:green;">대신 JSON\_MERGE\_PRESERVE() 사용</mark>

<details>

<summary>세부 정보</summary>

```
SELECT JSON_MERGE('[1, 2]', '[true, false]') as col1;
/*
+---------------------+
| col1                |
+---------------------+
| [1, 2, true, false] |
+---------------------+
*/

SELECT JSON_MERGE_PRESERVE('[1, 2]', '[true, false]') as col1;
/*
+---------------------+
| col1                |
+---------------------+
| [1, 2, true, false] |
+---------------------+
*/
```

</details>

### 12. <mark style="background-color:orange;">SQL\_CALC\_FOUND\_ROWS 쿼리 힌트 , FOUND\_ROWS() 함수</mark>는 더 이상 사용되지 않음

### 13. <mark style="background-color:orange;">SELECT ... INTO 문에서 잠금 절 앞의 INTO</mark>는 더 이상 지원되지 않음

* UNION 문의 경우 INTO를 포함하는 다음의 경우 사용되지 않음
* 쿼리 식의 후행 쿼리 블록에서 FROM 앞에 INTO를 사용
* 쿼리 식의 괄호로 묶인 후행 블록에서 FROM에 대한 위치에 관계없이 INTO를 사용

<details>

<summary>세부 정보</summary>

```
SELECT * FROM t1 FOR UPDATE INTO @myvar;

# 경고 발생
SELECT * FROM t1 INTO @myvar FOR UPDATE;


# UNION
SELECT 1234 UNION SELECT * FROM t1 INTO @myvar;

# 경고 발생
SELECT 1234 UNION SELECT * INTO @myvar FROM t1;
(SELECT 1234) UNION (SELECT * INTO @myvar FROM t1);
```

</details>

### 14. INSERT ... ON DUPLICATE KEY UPDATE 에서 <mark style="background-color:orange;">새로운 행 값에 액세스하기 위해 VALUES()를 사용하는 것</mark>은 DBMS 업그레이드 후부터 사용되지 않음

<details>

<summary>세부 정보</summary>

```
INSERT INTO t1 
SELECT c, c+d FROM t2 
ON DUPLICATE KEY UPDATE b = VALUES(b);


INSERT INTO t1
SELECT * FROM (SELECT c, c+d AS e FROM t2) AS dt
ON DUPLICATE KEY UPDATE b = e;
```

</details>

### 15. JSON\_TABLE()을 호출할 때 ON EMPTY 전에 ON ERROR를 지정하는 것은 SQL 표준에 위배되기 때문에 이 구문은 더 이상 사용되지 않으며, DBMS 업그레이드 후부터 경고 출력 <a href="#json_table-ec-9d-84-ed-98-b8-ec-b6-9c-ed-95-a0-eb-95-8c-on-empty-ec-a0-84-ec-97-90-on-error-eb-a5-bc" id="json_table-ec-9d-84-ed-98-b8-ec-b6-9c-ed-95-a0-eb-95-8c-on-empty-ec-a0-84-ec-97-90-on-error-eb-a5-bc"></a>

<details>

<summary>세부 정보</summary>

```
SELECT * FROM 
JSON_TABLE(
    '[{"a":"3"},{"a":2},{"b":1},{"a":0},{"a":[1,2]}]',"$[*]" 
    COLUMNS(
        rowid FOR ORDINALITY,
        ac VARCHAR(100) PATH "$.a" DEFAULT '999' ON ERROR DEFAULT '111' ON EMPTY,
        aj JSON PATH "$.a" DEFAULT '{"x": 333}' ON EMPTY,
        bx INT EXISTS PATH "$.b"
    )
) AS tt;

/*
+-------+------+------------+------+
| rowid | ac   | aj         | bx   |
+-------+------+------------+------+
|     1 | 3    | "3"        |    0 |
|     2 | 2    | 2          |    0 |
|     3 | 111  | {"x": 333} |    1 |
|     4 | 0    | 0          |    0 |
|     5 | 999  | [1, 2]     |    0 |
+-------+------+------------+------+
*/

SELECT * FROM 
JSON_TABLE(
    '[{"a":"3"},{"a":2},{"b":1},{"a":0},{"a":[1,2]}]',"$[*]" 
    COLUMNS(
        rowid FOR ORDINALITY,
        ac VARCHAR(100) PATH "$.a" DEFAULT '111' ON EMPTY DEFAULT '999' ON ERROR,
        aj JSON PATH "$.a" DEFAULT '{"x": 333}' ON EMPTY,
        bx INT EXISTS PATH "$.b"
    )
) AS tt;
```

</details>

### 16. Key 파티션에서 <mark style="background-color:orange;">인덱스의 접두사가 있는 컬럼이 테이블 파티션 키의 일부로 사용 시</mark> DBMS 업그레이드 후부터는 각 컬럼에 대해 경고 생성

<details>

<summary>세부 정보</summary>

```
CREATE TABLE t1 (
  a VARCHAR(10000),
  b VARCHAR(25),
  c VARCHAR(10),
  PRIMARY KEY (a(10), b, c(2))
) PARTITION BY KEY() PARTITIONS 2;

/* show warnings
Column 't1.a' having prefix key part 'a(10)' is ignored by the partitioning function. Use of prefixed columns in the PARTITION BY KEY() clause is deprecated and will be removed in a future release.

Column 't1.c' having prefix key part 'c(2)' is ignored by the partitioning function. Use of prefixed columns in the PARTITION BY KEY() clause is deprecated and will be removed in a future release.
*/

/* 실제 생성 테이블은 접두사가 없는 b 컬럼으로만 파티션키 생성
CREATE TABLE t1 (
  a VARCHAR(10000),
  b VARCHAR(25),
  c VARCHAR(10),
  PRIMARY KEY (a(10), b, c(2))
) PARTITION BY KEY(b) PARTITIONS 2;
*/
```

</details>

### 17. <mark style="background-color:orange;">BINARY 연산자</mark>는 DBMS 업그레이드 후부터 더 이상 사용되지 않으며, 대신 <mark style="background-color:green;">CAST(... AS BINARY) 사용</mark>

<details>

<summary>세부 정보</summary>

```
SELECT 'a' = 'A';
# 1

SELECT BINARY 'a' = 'A';
# 0

SELECT CAST('a' AS BINARY) = 'A';
# 0
```

</details>

### 18. 임의 개수의 및 구분 문자를 포함하는 <mark style="background-color:orange;">DATE, TIME, DATETIME 및 TIMESTAMP 리터럴 값에 다음 값 중 하나가 포함될 때</mark>마다 경고 발생

* 하나 이상의 비표준 구분 기호 문자
* 초과 구분 문자
* 공백 문자 이외의 공백(' ', 0x20)
* 초과 공백 문자

<details>

<summary>세부 정보</summary>

```
SELECT DATE'2022@12@31';
/* 'YYYY-MM-DD' 또는 'YY-MM-DD' 형식 인식
+------------------+
| DATE'2022@12@31' |
+------------------+
| 2022-12-31       |
+------------------+
*/

/* 대시(-) 이외의 문자 사용 시 경고 발생
Delimiter '@' in position 4 in datetime value '2022@12@31' at row 1 is deprecated. Prefer the standard '-'. 
*/

SELECT TIMESTAMP'2022^12^31 11*30*45';
/* 'YYYY-MM-DD hh:mm:ss' 또는 'YY-MM-DD hh:mm:ss' 형식 인식
+--------------------------------+
| TIMESTAMP'2022^12^31 11*30*45' |
+--------------------------------+
| 2022-12-31 11:30:45            |
+--------------------------------+
*/

/* 날짜 부분에 대시(-)와 시간 부분에 콜론(:) 이외의 구분 기호로 사용 시 경고 발생
Delimiter '^' in position 4 in datetime value '2022^12^31 11*30*45' at row 1 is deprecated. Prefer the standard '-'. 
*/

SELECT TIMESTAMP'2012-12-31   11-30-45';
/*
+----------------------------------+
| TIMESTAMP'2022-12-31   11-30-45' |
+----------------------------------+
| 2022-12-31   11:30:45            |
+----------------------------------+
*/

/* 과도한 공백 문자가 있으면 경고 발생
Delimiter ' ' in position 11 in datetime value '2022-12-31   11-30-45' at row 1 is superfluous and is deprecated. Please remove. 
*/

SELECT TIMESTAMP'2022-06-06 \
11:15:25';

/*
+--------------------------------+
| TIMESTAMP'2022-06-06
 11:15:25'                       |
+--------------------------------+
| 2022-06-06 11:15:25            |
+--------------------------------+
*/

/* 공백 문자 이외의 공백 문자가 사용될 때 경고
Delimiter '\n' in position 10 in datetime value '2022-06-06 11:15:25' at row 1 is deprecated. Prefer the standard ' '.
*/

SELECT TIMESTAMP'2022!-12-31  11:30:45';

/* 구분 기호, 공백 또는 둘 다에 여러 문제가 존재 시 하나의 경고만 발생
+----------------------------------+
| TIMESTAMP'2022!-12-31  11:30:45' |
+----------------------------------+
| 2022-12-31 11:30:45              |
+----------------------------------+
*/

/*
Delimiter '!' in position 4 in datetime value '2022!-12-31 11:30:45' at row 1 is deprecated. Prefer the standard '-'. 
*/
```

</details>

### 19. <mark style="background-color:green;">FULL</mark>은 예약어로 변경되어 <mark style="background-color:green;">백틱(\`)</mark>으로 묶어서 사용

### 20. 선행 문자로 <mark style="background-color:orange;">달러 기호($)</mark>를 사용하는 것은 더 이상 사용되지 않음

* 데이터베이스, 테이블, 뷰, 컬럼 또는 프로시저의 이름으로 사용되는 식별자와 별칭 포함
