laravelsp - mysql 5.7: introdução ao json data type

38
MySQL 5.7: introdução ao JSON Data Type Gabriela D’Avila @gabidavila Fev/2017

Upload: gabriela-davila

Post on 12-Apr-2017

179 views

Category:

Internet


2 download

TRANSCRIPT

Page 1: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

MySQL 5.7: introdução ao JSON Data Type

Gabriela D’Avila @gabidavila

Fev/2017

Page 2: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

Pesquisa sem validade científica*

2

Page 3: LaravelSP - MySQL 5.7: introdução ao JSON Data Type
Page 4: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

oi!• Data Engineer

• tipo DBA…

• … mas diferente

• @gabidavila

• http://gabriela.io

4

Page 5: LaravelSP - MySQL 5.7: introdução ao JSON Data Type
Page 6: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

O que é JSON?

• JavaScript Object Notation (desde 1999)

• Formato mais compacto que XML

• É language-independent

• Atributo-valor

6

Page 8: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

Tipos de dados aceitos• Strings

• Números

• Booleanos

• Arrays

• Objetos

8

Page 9: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

Use UTF8

9

Page 10: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

MySQL + JSON

Leitura Recomendada

Page 11: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

• JSON_ARRAY() • JSON_ARRAY_APPEND() • JSON_ARRAY_INSERT() • JSON_ARRAY_APPEND() • JSON_ARRAY_INSERT() • JSON_CONTAINS() • JSON_CONTAINS_PATH() • JSON_DEPTH() • JSON_EXTRACT() • JSON_INSERT() • JSON_KEYS()

• JSON_LENGTH() • JSON_MERGE() • JSON_OBJECT() • JSON_QUOTE() • JSON_REMOVE() • JSON_REPLACE() • JSON_SEARCH() • JSON_SET() • JSON_TYPE() • JSON_UNQUOTE() • JSON_VALID()

Funções JSON

Page 12: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

JSON Data Type• Validação automática, documentos inválidos causam

erro

• Case sensitive (utf8mb4_bin)

• null, true, false ✅

• Null, NULL, TRUE, False 🚫

• 'a' != 'A'

• Colunas do tipo JSON não podem ter um valor DEFAULT

12

Page 13: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

JSON Data Type• Armazenado em formato binário

• Chaves repetidas são substituídas pela última ocorrência

• É possível converter campos TEXT se JSON_VALID() retorna TRUE para toda a tabela

• Conversão de TEXT para JSON é uma operação COPY*

• Índices são possíveis devido à GENERATED COLUMNS

13

Page 14: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

JSON Data Type• 4 tipos de funções

• Criar JSON

• Buscar/extrair JSON

• Modificar JSON

• Retornar atributos JSON

Mais informações14

Page 15: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

PHP + MySQL

Page 16: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

PHP + MySQL: encode

<?php

json_encode(object $obj); json_encode(string $str); json_encode('[]');

16

Page 17: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

PHP + MySQL: decode<?php

json_decode('[]'); /* -> array(0) { } */

json_decode(''); /* -> NULL */

json_decode('{"id": 5}'); /* -> object(stdClass)#1 (1) { ["id"]=> int(5) } */

17

Page 18: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

Criar JSON

Page 19: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

Para criar array• JSON_ARRAY(val1[, val2, …])

SELECT JSON_ARRAY('laravel', 5.4, "2017-02-14");

+------------------------------------------+ | JSON_ARRAY('laravel', 5.4, "2017-02-14") | +------------------------------------------+ | ["laravel", 5.4, "2017-02-14"] | +------------------------------------------+ 1 row in set (0.00 sec)

19

Page 20: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

Para criar objeto• JSON_OBJECT([key, val[, key, val] ...])

SELECT JSON_OBJECT('framework', 'laravel', 'versao', 5.4);

+----------------------------------------------------+ | JSON_OBJECT('framework', 'laravel', 'versao', 5.4) | +----------------------------------------------------+ | {"versao": 5.4, "framework": "laravel"} | +----------------------------------------------------+ 1 row in set (0.00 sec)

20

Page 21: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

Buscar/extrair JSON

Page 22: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

Tabela `users`

Field Type Null Key Default Extra

id int(11) NO PRI auto_increment

id_str varchar(255) NO UNI

screen_name varchar(255) NO INDEX

response json NO

22

Page 23: LaravelSP - MySQL 5.7: introdução ao JSON Data Type
Page 24: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

Extrair name, status.source

SELECT JSON_EXTRACT(response, '$.name') AS name, JSON_EXTRACT(response, '$.status.source') AS source FROM users WHERE screen_name = 'laravelsp';

*************************** 1. row *************************** name: "Laravel SP Meetup" source: "<a href=\"http://twitter.com/download/android\">Twitter for Android</a>" 1 row in set (0.00 sec)

24

Page 25: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

JSON_EXTRACT() ou ->

SELECT response->'$.name' AS name, response->'$.status.source' AS source FROM users WHERE screen_name = 'laravelsp';

*************************** 1. row *************************** name: "Laravel SP Meetup" source: "<a href=\"http://twitter.com/download/android\">Twitter for Android</a>" 1 row in set (0.00 sec)

25

Page 26: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

Modificar JSON

Page 27: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

JSON_UNQUOTE() ≃ stripslashes()

SELECT JSON_UNQUOTE(JSON_EXTRACT(response, '$.name')) AS name, JSON_UNQUOTE(JSON_EXTRACT(response, '$.status.source')) AS source FROM users WHERE screen_name = 'laravelsp';

*************************** 1. row *************************** name: Laravel SP Meetup source: <a href="http://twitter.com/download/android">Twitter for Android</a> 1 row in set (0.00 sec)

27

Page 28: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

JSON_UNQUOTE() ou ->>

SELECT response->>'$.name' AS name, response->>'$.status.source' AS source FROM users WHERE screen_name = 'laravelsp';

*************************** 1. row *************************** name: Laravel SP Meetup source: <a href="http://twitter.com/download/android">Twitter for Android</a> 1 row in set (0.00 sec)

28

Page 29: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

Recapitulando

Page 30: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

-> é igual a ->> ?

• -> é apenas usado para extração, não modifica o valor (JSON_EXTRACT())

• ->> faz a modificação em runtime mas não altera o JSON por si só (JSON_UNQUOTE(JSON_EXTRACT()))

30

Page 31: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

Retornar Atributos JSON

Page 32: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

JSON_VALID()

SELECT JSON_VALID("NULL"), JSON_VALID("null"), JSON_VALID("[]"), JSON_VALID('{"screen_name":"laravelsp"}'), JSON_VALID("{\"screen_name\":\"laravelsp\" }");

*************************** 1. row *************************** JSON_VALID("NULL"): 0 JSON_VALID("null"): 1 JSON_VALID("[]"): 1 JSON_VALID('{"screen_name":"laravelsp"}'): 1 JSON_VALID("{\"screen_name\":\"laravelsp\" }"): 1 1 row in set (0.00 sec)

32

Page 33: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

JSON_TYPE()

SELECT JSON_TYPE(response->'$.id') AS id_type, JSON_TYPE(response->'$.name') AS name_type, JSON_TYPE(response->'$.status') AS status_type, JSON_TYPE(response->'$.verified') AS verified_type FROM users WHERE screen_name = 'laravelsp';

*************************** 1. row *************************** id_type: UNSIGNED INTEGER name_type: STRING status_type: OBJECT verified_type: BOOLEAN 1 row in set (0.00 sec)

33

Page 34: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

Índices

Page 35: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

Índices

• Possíveis por meio de VIRTUAL COLUMNS ou STORED COLUMNS

35

Page 36: LaravelSP - MySQL 5.7: introdução ao JSON Data Type
Page 37: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

Dúvidas?

37

Page 38: LaravelSP - MySQL 5.7: introdução ao JSON Data Type

Obrigada!

• Fonte: MySQL Docs

• Twitter: @gabidavila

• Blog: http://gabriela.io

• Freenode: gabidavila #phpwomen / #phpmentoring

38