MySQL 5.7 의 JSON 기본 동작 안내

머리말
프로젝트 가 필요 하기 때문에 저장 필드 는 JSON 형식 으로 저장 되 었 고 프로젝트 에서 조회 한 값 을 잭 슨 을 통 해 해당 하 는 bean 으로 전환 하여 처리 하 는 것 이 간단 하고 편리 하지 않다 고 생각 합 니 다.
MySQL 은 5.7 버 전부터 JSON 형식의 데 이 터 를 지원 해 조작 이 편리 하 다.
건축 표
새 테이블 을 만 들 때 필드 형식 은 json 형식 으로 직접 설정 할 수 있 습 니 다.예 를 들 어 우리 가 테이블 을 만 들 때:

mysql> CREATE TABLE `test_user`(`id` INT PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(50) NOT NULL, `info` JSON);
json 형식 필드 는 NULL 일 수 있 습 니 다.
데이터 삽입:

mysql> INSERT INTO test_user(`name`, `info`) VALUES('xiaoming','{"sex": 1, "age": 18, "nick_name": "  "}');
json 형식의 필드 는 유효한 json 문자열 이 필요 합 니 다.
사용 가능JSON_OBJECT()함수 구조 json 대상:

mysql> INSERT INTO test_user(`name`, `info`) VALUES('xiaohua', JSON_OBJECT("sex", 0, "age", 17));
사용JSON_ARRAY()함수 구조 json 배열:

mysql> INSERT INTO test_user(`name`, `info`) VALUES('xiaozhang', JSON_OBJECT("sex", 1, "age", 19, "tag", JSON_ARRAY(3,5,90)));
지금 test 보기user 표 의 데이터:

mysql> select * from test_user; 
+----+-----------+--------------------------------------------+ 
| id | name | info     |
+----+-----------+--------------------------------------------+ 
| 1 | xiaoming | {"age": 18, "sex": 1, "nick_name": "  "} | 
| 2 | xiaohua | {"age": 17, "sex": 0}   |
| 3 | xiaozhang | {"age": 19, "sex": 1, "tag": [3, 5, 90]} | 
+----+-----------+--------------------------------------------+
3 rows in set (0.04 sec)
조회 하 다.
표현 식:대상 은 json 열->'$.키',배열 은 json 열->'$.키[index]'

mysql> select name, info->'$.nick_name', info->'$.sex', info->'$.tag[0]' from test_user; 
+-----------+---------------------+---------------+------------------+ 
| name | info->'$.nick_name' | info->'$.sex' | info->'$.tag[0]' | 
+-----------+---------------------+---------------+------------------+ 
| xiaoming | "  "  | 1  | NULL  | 
| xiaohua | NULL  | 0  | NULL  | 
| xiaozhang | NULL  | 1  | 3  | 
+-----------+---------------------+---------------+------------------+ 
3 rows in set (0.04 sec)
등가:대상JSON_EXTRACT(json , '$. '),배열JSON_EXTRACT(json , '$. [index]')

mysql> select name, JSON_EXTRACT(info, '$.nick_name'), JSON_EXTRACT(info, '$.sex'), JSON_EXTRACT(info, '$.tag[0]') from test_user;
 +-----------+-----------------------------------+-----------------------------+--------------------------------+ 
| name | JSON_EXTRACT(info, '$.nick_name') | JSON_EXTRACT(info, '$.sex') | JSON_EXTRACT(info, '$.tag[0]') 
| +-----------+-----------------------------------+-----------------------------+--------------------------------+ 
| xiaoming | "  "    | 1    | NULL    |
| xiaohua | NULL    | 0    | NULL    | 
| xiaozhang | NULL    | 1    | 3    | 
+-----------+-----------------------------------+-----------------------------+--------------------------------+ 
3 rows in set (0.04 sec)
하지만 위 에 있 는'귀 요 미'가 더 블 따옴표 가 있 는 것 을 보 았 습 니 다.이것 은 우리 가 원 하 는 것 이 아니 라 JSON 을 사용 할 수 있 습 니 다.UNQUOTE 함 수 는 따옴표 를 제거 합 니 다.

mysql> select name, JSON_UNQUOTE(info->'$.nick_name') from test_user where name='xiaoming'; 
+----------+-----------------------------------+ 
| name | JSON_UNQUOTE(info->'$.nick_name') | 
+----------+-----------------------------------+ 
| xiaoming |       | 
+----------+-----------------------------------+ 
1 row in set (0.05 sec)
조작 자 를 직접 사용 할 수도 있 습 니 다.->>

mysql> select name, info->>'$.nick_name' from test_user where name='xiaoming';
+----------+----------------------+ 
| name | info->>'$.nick_name' | 
+----------+----------------------+ 
| xiaoming |      | 
+----------+----------------------+ 
1 row in set (0.06 sec)
물론 속성 도 조회 조건 으로 할 수 있다.

mysql> select name, info->>'$.nick_name' from test_user where info->'$.nick_name'='  '; 
+----------+----------------------+ 
| name | info->>'$.nick_name' | 
+----------+----------------------+ 
| xiaoming |      | 
+----------+----------------------+ 
1 row in set (0.05 sec)
특히 JSON 유형의 지정 속성 을 가상 열 을 통 해 빠르게 조회 할 수 있다.
가상 열 만 들 기:

mysql> ALTER TABLE `test_user` ADD `nick_name` VARCHAR(50) GENERATED ALWAYS AS (info->>'$.nick_name') VIRTUAL;
조작 부호 사용 주의->>
사용 시 일반 형식의 열 조회 와 같 습 니 다.

mysql> select name,nick_name from test_user where nick_name='  '; 
+----------+-----------+ 
| name  | nick_name | 
+----------+-----------+ 
| xiaoming |     | 
+----------+-----------+ 
1 row in set (0.05 sec)
업데이트JSON_INSERT()새 값 을 삽입 하지만 존재 하 는 값 을 덮어 쓰 지 않 습 니 다.

mysql> UPDATE test_user SET info = JSON_INSERT(info, '$.sex', 1, '$.nick_name', '  ') where id=2;
결 과 를 보다

mysql> select * from test_user where id=2; 
+----+---------+--------------------------------------------+-----------+ 
| id | name | info          | nick_name | 
+----+---------+--------------------------------------------+-----------+ 
| 2 | xiaohua | {"age": 17, "sex": 0, "nick_name": "  "} |     | 
+----+---------+--------------------------------------------+-----------+ 
1 row in set (0.06 sec)
JSON_SET()새 값 을 삽입 하고 존재 하 는 값 을 덮어 씁 니 다.

mysql> UPDATE test_user SET info = JSON_INSERT(info, '$.sex', 0, '$.nick_name', '  ') where id=3;
결 과 를 보다

mysql> select * from test_user where id=3; 
+----+-----------+---------------------------------------------------------------+-----------+ 
| id | name  | info               | nick_name | 
+----+-----------+---------------------------------------------------------------+-----------+ 
| 3 | xiaozhang | {"age": 19, "sex": 1, "tag": [3, 5, 90], "nick_name": "  "} |     | 
+----+-----------+---------------------------------------------------------------+-----------+ 
1 row in set (0.06 sec)
사용JSON_REPLACE()존재 하 는 값 만 바 꾸 기

mysql> UPDATE test_user SET info = JSON_REPLACE(info, '$.sex', 1, '$.tag', '[1,2,3]') where id=2;
결 과 를 보다

mysql> select * from test_user where id=2; 
+----+---------+--------------------------------------------+-----------+ 
| id | name | info          | nick_name | 
+----+---------+--------------------------------------------+-----------+ 
| 2 | xiaohua | {"age": 17, "sex": 1, "nick_name": "  "} |     | 
+----+---------+--------------------------------------------+-----------+ 
1 row in set (0.06 sec)
태그 가 업데이트 되 지 않 은 것 을 볼 수 있 습 니 다.
삭제
JSON 요 소 를 사용JSON_REMOVE()삭제

mysql> UPDATE test_user SET info = JSON_REMOVE(info, '$.sex', '$.tag') where id=1;
결 과 를 보다

mysql> select * from test_user where id=1; 
+----+----------+----------------------------------+-----------+ 
| id | name  | info        | nick_name | 
+----+----------+----------------------------------+-----------+ 
| 1 | xiaoming | {"age": 18, "nick_name": "  "} |     | 
+----+----------+----------------------------------+-----------+ 
1 row in set (0.05 sec)
총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기