12. 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
13. 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
14. JSON Data Type
• 4 tipos de funções
• Criar JSON
• Buscar/extrair JSON
• Modificar JSON
• Retornar atributos JSON
Mais informações
14
22. 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
23.
24. 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
25. 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
27. 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
28. 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
30. -> é 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