더 이상 사용되지 않는 기능

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

1. utf8mb3 문자 집합은 더 이상 사용되지 않으며, 대신 utf8mb4를 사용

2. 다음 문자 집합은 더 이상 사용되지 않음

  • ucs2

  • macroman and macce

  • dec

  • hp8

3. SQL 모드의 PAD_CHAR_TO_FULL_LENGTH 는 더 이상 사용되지 않음

세부 정보
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 |
+------+-----------------+
*/

4. FLOAT, DOUBLE(및 모든 동의어) 타입의 컬럼에 대해 AUTO_INCREMENT는 더 이상 사용되지 않음

5. FLOAT, DOUBLE, DECIMAL(및 모든 동의어) 타입의 컬럼에 대해 UNSIGNED 속성은 더 이상 사용되지 않음

  • CHECK 제약 조건 사용 고려

6. FLOAT, DOUBLE(및 모든 동의어) 타입의 컬럼에 대한 자릿수를 지정하는 FLOAT(M,D), DOUBLE(M,D) 구문은 더 이상 사용되지 않음

7. 숫자 데이터 타입에서 ZEROFILL 속성은 더 이상 사용되지 않음

세부 정보
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 |
+------------+
*/

8. utf8mb4 문자 집합에 여러 _bin collation이 있으므로 문자열 데이터 유형의 BINARY 속성은 더 이상 사용되지 않음

  • 명시적인 _bin collation 필요

세부 정보
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  |
+------+------+

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

10. 비표준 C 스타일 연산자 &&, ||, !는 더 이상 사용되지 않음

  • 표준 SQL AND, OR, NOT 사용

11. JSON_MERGE() 함수는 더 이상 사용되지 않으며, 대신 JSON_MERGE_PRESERVE() 사용

세부 정보
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] |
+---------------------+
*/

12. SQL_CALC_FOUND_ROWS 쿼리 힌트 , FOUND_ROWS() 함수는 더 이상 사용되지 않음

13. SELECT ... INTO 문에서 잠금 절 앞의 INTO는 더 이상 지원되지 않음

  • UNION 문의 경우 INTO를 포함하는 다음의 경우 사용되지 않음

  • 쿼리 식의 후행 쿼리 블록에서 FROM 앞에 INTO를 사용

  • 쿼리 식의 괄호로 묶인 후행 블록에서 FROM에 대한 위치에 관계없이 INTO를 사용

세부 정보
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);

14. INSERT ... ON DUPLICATE KEY UPDATE 에서 새로운 행 값에 액세스하기 위해 VALUES()를 사용하는 것은 DBMS 업그레이드 후부터 사용되지 않음

세부 정보
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;

15. JSON_TABLE()을 호출할 때 ON EMPTY 전에 ON ERROR를 지정하는 것은 SQL 표준에 위배되기 때문에 이 구문은 더 이상 사용되지 않으며, DBMS 업그레이드 후부터 경고 출력

세부 정보
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;

16. Key 파티션에서 인덱스의 접두사가 있는 컬럼이 테이블 파티션 키의 일부로 사용 시 DBMS 업그레이드 후부터는 각 컬럼에 대해 경고 생성

세부 정보
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;
*/

17. BINARY 연산자는 DBMS 업그레이드 후부터 더 이상 사용되지 않으며, 대신 CAST(... AS BINARY) 사용

세부 정보
SELECT 'a' = 'A';
# 1

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

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

18. 임의 개수의 및 구분 문자를 포함하는 DATE, TIME, DATETIME 및 TIMESTAMP 리터럴 값에 다음 값 중 하나가 포함될 때마다 경고 발생

  • 하나 이상의 비표준 구분 기호 문자

  • 초과 구분 문자

  • 공백 문자 이외의 공백(' ', 0x20)

  • 초과 공백 문자

세부 정보
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 '-'. 
*/

19. FULL은 예약어로 변경되어 백틱(`)으로 묶어서 사용

20. 선행 문자로 달러 기호($)를 사용하는 것은 더 이상 사용되지 않음

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

Last updated