
{"id":1557,"date":"2015-11-30T10:01:39","date_gmt":"2015-11-30T09:01:39","guid":{"rendered":"http:\/\/dasini.net\/blog\/?p=1557"},"modified":"2024-12-10T15:47:04","modified_gmt":"2024-12-10T14:47:04","slug":"json-et-colonnes-generees-avec-mysql","status":"publish","type":"post","link":"https:\/\/dasini.net\/blog\/2015\/11\/30\/json-et-colonnes-generees-avec-mysql\/","title":{"rendered":"JSON et colonnes g\u00e9n\u00e9r\u00e9es avec MySQL"},"content":{"rendered":"<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignleft\" title=\"JSON\" src=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/json_icon.png?resize=200%2C106\" alt=\"JSON\" width=\"200\" height=\"106\" \/><\/p>\n<p>Le 24 novembre dernier, lors du <a href=\"http:\/\/event.afup.org\/forum-php-2015\/programme\/\" target=\"_blank\" rel=\"noopener\">Forum PHP<\/a>, <a href=\"http:\/\/insidemysql.com\/author\/tomas\/\" target=\"_blank\" rel=\"noopener\">Tomas Ulin<\/a> (Oracle&rsquo;s MySQL VP of Engineering) a parl\u00e9 de l&rsquo;utilisation de JSON dans MySQL \u00ab\u00a0<a href=\"http:\/\/www.slideshare.net\/BertrandMatthelie\/php-forum2015-tomasfinal\" target=\"_blank\" rel=\"noopener\">MySQL 5.7 &amp; JSON: New opportunities for developers<\/a>\u00ab\u00a0.<\/p>\n<p>Voici les r\u00e9ponses \u00e0 quelques questions qui m&rsquo;ont \u00e9t\u00e9 pos\u00e9es:<\/p>\n<ul>\n<li>Comment se comporte mysqldump avec les colonnes g\u00e9n\u00e9r\u00e9es ?<\/li>\n<li>Comment utiliser la commande LOAD DATA INFILE avec des colonnes g\u00e9n\u00e9r\u00e9es ?<\/li>\n<li>JSON est il sensible \u00e0 la casse dans MySQL ?<\/li>\n<\/ul>\n<p>Le contexte, une table InnoDB <em>catalog<\/em> qui contient un champs <em>doc<\/em> de type <strong>JSON<\/strong> ainsi que des colonnes g\u00e9n\u00e9r\u00e9es virtuelles <em>isbn<\/em> &amp; <em>publisher<\/em>:<\/p>\n<pre class=\"lang:mysql decode:true\">CREATE TABLE `catalog` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `doc` json DEFAULT NULL,\n  `isbn` varchar(1000) GENERATED ALWAYS AS (doc-&gt;\"$.isbn\") VIRTUAL,\n  `publisher` varchar(1000) GENERATED ALWAYS AS (doc-&gt;\"$.publisher\") VIRTUAL,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `isbn` (`isbn`)\n) ENGINE=InnoDB;<\/pre>\n<p>Quelques documents JSON :<\/p>\n<pre class=\"lang:js decode:true\">{\n    \"isbn\": \"978-2-7460-7864-2\",\n    \"title\": \"MySQL 5.6 Administration et optimisation\",\n    \"publisher\": \"ENI\",\n    \"language\": \"FR\"\n}, {\n    \"isbn\": \"978-2212126341\",\n    \"title\": \"Audit et optimisation de MySQL 5\",\n    \"publisher\": \"Eyrolles\",\n    \"language\": \"FR\"\n}, {\n    \"isbn\": \"978-2-7460-5516-2\",\n    \"title\": \"MySQL 5 Administration et optimisation\",\n    \"publisher\": \"ENI\",\n    \"language\": \"FR\"\n}<\/pre>\n<p>\u00e0 ins\u00e9rer dans la table <em>catalog<\/em>:<\/p>\n<pre class=\"lang:mysql decode:true \">mysql&gt; INSERT  catalog (doc) VALUES \n('{\"isbn\": \"978-2-7460-7864-2\", \"title\": \"MySQL 5.6 Administration et optimisation\", \"publisher\": \"ENI\", \"language\": \"FR\"}'), \n('{\"isbn\": \"978-2212126341\", \"title\": \"Audit et optimisation de MySQL 5\", \"publisher\": \"Eyrolles\", \"language\": \"FR\"}'), \n('{\"isbn\": \"978-2-7460-5516-2\", \"title\": \"MySQL 5 Administration et optimisation\", \"publisher\": \"ENI\", \"language\": \"FR\"}');\nQuery OK, 3 rows affected (0.06 sec)\nRecords: 3  Duplicates: 0  Warnings: 0<\/pre>\n<p>La table <em>catalog<\/em> contient donc 3 enregistrements:<\/p>\n<pre class=\"lang:mysql decode:true\">mysql&gt; SELECT * FROM catalog;\n+----+--------------------------------------------------------------------------------------------------------------------------+---------------------+------------+\n| id | doc                                                                                                                      | isbn                | publisher  |\n+----+--------------------------------------------------------------------------------------------------------------------------+---------------------+------------+\n|  1 | {\"isbn\": \"978-2-7460-7864-2\", \"title\": \"MySQL 5.6 Administration et optimisation\", \"language\": \"FR\", \"publisher\": \"ENI\"} | \"978-2-7460-7864-2\" | \"ENI\"      |\n|  2 | {\"isbn\": \"978-2212126341\", \"title\": \"Audit et optimisation de MySQL 5\", \"language\": \"FR\", \"publisher\": \"Eyrolles\"}       | \"978-2212126341\"    | \"Eyrolles\" |\n|  3 | {\"isbn\": \"978-2-7460-5516-2\", \"title\": \"MySQL 5 Administration et optimisation\", \"language\": \"FR\", \"publisher\": \"ENI\"}   | \"978-2-7460-5516-2\" | \"ENI\"      |\n+----+--------------------------------------------------------------------------------------------------------------------------+---------------------+------------+\n3 rows in set (0.00 sec)<\/pre>\n<h2>Sauvegarder et restaurer une table contenant\u00a0 des colonnes g\u00e9n\u00e9r\u00e9es<\/h2>\n<p><strong>Q: Comment se comporte mysqldump avec les colonnes g\u00e9n\u00e9r\u00e9es ?<\/strong><\/p>\n<p>Faire une sauvegardes des donn\u00e9es avec <a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/mysqldump.html\" target=\"_blank\" rel=\"noopener\">mysqldump<\/a>, le r\u00e9sultat \u00e9tant redirig\u00e9 vers le fichier <em>test.catalog.sql<\/em> :<\/p>\n<pre class=\"lang:sh decode:true\">$ mysqldump test catalog &gt; test.catalog.sql<\/pre>\n<p>En visualisant le dump on s&rsquo;appercoit que:<\/p>\n<ul>\n<li>Les colonnes g\u00e9n\u00e9r\u00e9es sont bien pr\u00e9sentent dans la structure de la table.<\/li>\n<li>La commande <em>INSERT<\/em> ne renseigne que les colonnes \u00ab\u00a0classiques\u00a0\u00bb <strong>id<\/strong> et <strong>doc<\/strong><\/li>\n<\/ul>\n<pre class=\"lang:sh decode:true\">$ cat test.catalog.sql\n-- MySQL dump 10.13  Distrib 5.7.9, for linux-glibc2.5 (x86_64)\n-- Server version    5.7.9\n...\n-- Table structure for table `catalog`\n--\n\nCREATE TABLE `catalog` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `doc` json DEFAULT NULL,\n  `isbn` varchar(20) GENERATED ALWAYS AS (doc-&gt;\"$.isbn\") VIRTUAL,\n  `publisher` varchar(20) GENERATED ALWAYS AS (doc-&gt;\"$.publisher\") VIRTUAL,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `isbn` (`isbn`)\n) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;\n\n--\n-- Dumping data for table `catalog`\n--\n\nINSERT INTO `catalog` (`id`, `doc`) VALUES (1,'{\\\"isbn\\\": \\\"978-2-7460-7864-2\\\", \\\"title\\\": \\\"MySQL 5.6 Administration et optimisation\\\", \\\"language\\\": \\\"FR\\\", \\\"publisher\\\": \\\"ENI\\\"}'),(2,'{\\\"isbn\\\": \\\"978-2212126341\\\", \\\"title\\\": \\\"Audit et optimisation de MySQL 5\\\", \\\"language\\\": \\\"FR\\\", \\\"publisher\\\": \\\"Eyrolles\\\"}'),(3,'{\\\"isbn\\\": \\\"978-2-7460-5516-2\\\", \\\"title\\\": \\\"MySQL 5 Administration et optimisation\\\", \\\"language\\\": \\\"FR\\\", \\\"publisher\\\": \\\"ENI\\\"}');\n...<\/pre>\n<p>Avant de restaurer le dump dans la table, je vais la vider:<\/p>\n<pre class=\"lang:mysql decode:true\">mysql&gt; TRUNCATE TABLE catalog;\nQuery OK, 0 rows affected (0.25 sec)<\/pre>\n<p>La table ne contient plus de donn\u00e9e:<\/p>\n<pre class=\"lang:mysql decode:true\">mysql&gt; SELECT * FROM catalog;\nEmpty set (0.00 sec)<\/pre>\n<p>Chargement des donn\u00e9es dans la table:<\/p>\n<pre class=\"lang:mysql decode:true\">mysql&gt; source test.catalog.sql\nQuery OK, 0 rows affected (0.00 sec)\n...<\/pre>\n<pre class=\"lang:mysql decode:true\">mysql&gt; SELECT * FROM catalog;\n+----+--------------------------------------------------------------------------------------------------------------------------+---------------------+------------+\n| id | doc                                                                                                                      | isbn                | publisher  |\n+----+--------------------------------------------------------------------------------------------------------------------------+---------------------+------------+\n|  1 | {\"isbn\": \"978-2-7460-7864-2\", \"title\": \"MySQL 5.6 Administration et optimisation\", \"language\": \"FR\", \"publisher\": \"ENI\"} | \"978-2-7460-7864-2\" | \"ENI\"      |\n|  2 | {\"isbn\": \"978-2212126341\", \"title\": \"Audit et optimisation de MySQL 5\", \"language\": \"FR\", \"publisher\": \"Eyrolles\"}       | \"978-2212126341\"    | \"Eyrolles\" |\n|  3 | {\"isbn\": \"978-2-7460-5516-2\", \"title\": \"MySQL 5 Administration et optimisation\", \"language\": \"FR\", \"publisher\": \"ENI\"}   | \"978-2-7460-5516-2\" | \"ENI\"      |\n+----+--------------------------------------------------------------------------------------------------------------------------+---------------------+------------+<\/pre>\n<p>Ta damm!!!<br \/>\nLa table a bien \u00e9t\u00e9 restaur\u00e9e, les colonnes g\u00e9n\u00e9r\u00e9es virtuelles sont, comme convenu, recalcul\u00e9es \u00e0 la vol\u00e9e.<\/p>\n<h1>Importer un fichier texte dans une table avec des colonnes g\u00e9n\u00e9r\u00e9es<\/h1>\n<p><strong>Q: Comment utiliser la commande LOAD DATA INFILE avec des colonnes g\u00e9n\u00e9r\u00e9es ?<\/strong><\/p>\n<p>L&rsquo;export des donn\u00e9es se fait avec SELECT &#8230; INTO OUTFILE:<\/p>\n<pre class=\"lang:mysql decode:true\">mysql&gt; SELECT * FROM catalog INTO OUTFILE '\/tmp\/test.catalog.tsv';\nQuery OK, 3 rows affected (0.01 sec)<\/pre>\n<pre class=\"lang:sh decode:true \">$ cat \/tmp\/test.catalog.tsv\n1    {\"isbn\": \"978-2-7460-7864-2\", \"title\": \"MySQL 5.6 Administration et optimisation\", \"language\": \"FR\", \"publisher\": \"ENI\"}    \"978-2-7460-7864-2\"    \"ENI\"\n2    {\"isbn\": \"978-2212126341\", \"title\": \"Audit et optimisation de MySQL 5\", \"language\": \"FR\", \"publisher\": \"Eyrolles\"}    \"978-2212126341\"    \"Eyrolles\"\n3    {\"isbn\": \"978-2-7460-5516-2\", \"title\": \"MySQL 5 Administration et optimisation\", \"language\": \"FR\", \"publisher\": \"ENI\"}    \"978-2-7460-5516-2\"    \"ENI\"<\/pre>\n<p>Avant d&rsquo;importer le fichier texte dans la table, je vais la vider:<\/p>\n<pre class=\"lang:mysql decode:true \">mysql&gt; TRUNCATE TABLE catalog;\nQuery OK, 0 rows affected (0.34 sec)\n\nmysql&gt; SELECT * FROM catalog;\nEmpty set (0.00 sec)<\/pre>\n<p>Import des donn\u00e9es dans la table:<\/p>\n<pre class=\"lang:mysql decode:true \">mysql&gt;  LOAD DATA INFILE '\/tmp\/test.catalog.tsv' INTO TABLE test.catalog;\nQuery OK, 3 rows affected (0.05 sec)\nRecords: 3  Deleted: 0  Skipped: 0  Warnings: 0\n\nmysql&gt; select * from catalog;\n+----+--------------------------------------------------------------------------------------------------------------------------+---------------------+------------+\n| id | doc                                                                                                                      | isbn                | publisher  |\n+----+--------------------------------------------------------------------------------------------------------------------------+---------------------+------------+\n|  1 | {\"isbn\": \"978-2-7460-7864-2\", \"title\": \"MySQL 5.6 Administration et optimisation\", \"language\": \"FR\", \"publisher\": \"ENI\"} | \"978-2-7460-7864-2\" | \"ENI\"      |\n|  2 | {\"isbn\": \"978-2212126341\", \"title\": \"Audit et optimisation de MySQL 5\", \"language\": \"FR\", \"publisher\": \"Eyrolles\"}       | \"978-2212126341\"    | \"Eyrolles\" |\n|  3 | {\"isbn\": \"978-2-7460-5516-2\", \"title\": \"MySQL 5 Administration et optimisation\", \"language\": \"FR\", \"publisher\": \"ENI\"}   | \"978-2-7460-5516-2\" | \"ENI\"      |\n+----+--------------------------------------------------------------------------------------------------------------------------+---------------------+------------+\n3 rows in set (0.01 sec)<\/pre>\n<p>L&rsquo;import de fichiers, avec la commande LOAD DATA INFILE, dans une table qui contient des colonnes g\u00e9n\u00e9r\u00e9es ne diff\u00e8re en rien de l&rsquo;import dans une table sans colonne g\u00e9n\u00e9r\u00e9e.<\/p>\n<h1>Sensibilit\u00e9 \u00e0 la casse du contenu JSON<\/h1>\n<p><strong>Q: JSON est il sensible \u00e0 la casse dans MySQL ?<\/strong><\/p>\n<p>Rechercher tous les documents o\u00f9 l&rsquo;\u00e9diteur est ENI (en majuscule):<\/p>\n<pre class=\"lang:mysql decode:true\">mysql&gt; SELECT doc FROM catalog WHERE doc-&gt;\"$.publisher\"='ENI';\n+--------------------------------------------------------------------------------------------------------------------------+\n| doc                                                                                                                      |\n+--------------------------------------------------------------------------------------------------------------------------+\n| {\"isbn\": \"978-2-7460-7864-2\", \"title\": \"MySQL 5.6 Administration et optimisation\", \"language\": \"FR\", \"publisher\": \"ENI\"} |\n| {\"isbn\": \"978-2-7460-5516-2\", \"title\": \"MySQL 5 Administration et optimisation\", \"language\": \"FR\", \"publisher\": \"ENI\"}   |\n+--------------------------------------------------------------------------------------------------------------------------+\n2 rows in set (0.01 sec)<\/pre>\n<p>Rechercher tous les documents o\u00f9 l&rsquo;\u00e9diteur est eni (en minuscule):<\/p>\n<pre class=\"lang:mysql decode:true\">mysql&gt; SELECT doc FROM catalog WHERE doc-&gt;\"$.publisher\"='eni';\nEmpty set (0.00 sec)<\/pre>\n<p>Les documents JSON sont donc sensible \u00e0 la casse.<\/p>\n<p>Il est \u00e9videmment possible d&rsquo;utiliser une fonction pour modifier la casse:<\/p>\n<pre class=\"lang:mysql decode:true\">mysql&gt; SELECT doc FROM catalog WHERE doc-&gt;\"$.publisher\"=UPPER('eni');\n+--------------------------------------------------------------------------------------------------------------------------+\n| doc                                                                                                                      |\n+--------------------------------------------------------------------------------------------------------------------------+\n| {\"isbn\": \"978-2-7460-7864-2\", \"title\": \"MySQL 5.6 Administration et optimisation\", \"language\": \"FR\", \"publisher\": \"ENI\"} |\n| {\"isbn\": \"978-2-7460-5516-2\", \"title\": \"MySQL 5 Administration et optimisation\", \"language\": \"FR\", \"publisher\": \"ENI\"}   |\n+--------------------------------------------------------------------------------------------------------------------------+\n2 rows in set (0.01 sec)<\/pre>\n<p>Cependant 2 contraintes:<br \/>\n&#8211; Si la colonne est index\u00e9e ce dernier ne pourra pas \u00eatre utilis\u00e9.<br \/>\n&#8211; \u00c7a fonctionne si et seulement si le mot est \u00e9crit dans la base enti\u00e8rement en majuscule.<\/p>\n<p>Une meilleure solution consiste \u00e0 cr\u00e9er et a indexer une colonne g\u00e9n\u00e9r\u00e9e qui contient les donn\u00e9es en minuscule.<\/p>\n<pre class=\"lang:mysql decode:true\">mysql&gt; ALTER TABLE catalog ADD COLUMN publisher_lower varchar(20) GENERATED ALWAYS AS (LOWER(JSON_UNQUOTE(doc-&gt;\"$.publisher\"))) VIRTUAL;<\/pre>\n<p>La colonne g\u00e9n\u00e9r\u00e9e contient les directives suivantes:<\/p>\n<ul>\n<li><a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/string-functions.html#function_lower\" target=\"_blank\" rel=\"noopener\">LOWER<\/a> : transformer en minuscules les chaines de caract\u00e8res<\/li>\n<li><a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/json-modification-functions.html#function_json-unquote\" target=\"_blank\" rel=\"noopener\">JSON_UNQUOTE<\/a> : supprimer les guillemets<\/li>\n<li><a href=\"https:\/\/dev.mysql.com\/worklog\/task\/?id=411\" target=\"_blank\" rel=\"noopener\">VIRTUAL<\/a> : la colonne g\u00e9n\u00e9r\u00e9e est virtuelle. Les donn\u00e9es ne sont pas stock\u00e9es mais calcul\u00e9es \u00e0 la vol\u00e9e.<\/li>\n<\/ul>\n<p>La structure de la tables est maintenant:<\/p>\n<pre class=\"lang:mysql decode:true\">mysql&gt; SHOW CREATE TABLE catalog;\nCREATE TABLE `catalog` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `doc` json DEFAULT NULL,\n  `isbn` varchar(20) GENERATED ALWAYS AS (doc-&gt;\"$.isbn\") VIRTUAL,\n  `publisher` varchar(20) GENERATED ALWAYS AS (doc-&gt;\"$.publisher\") VIRTUAL,\n  `publisher_lower` varchar(20) GENERATED ALWAYS AS (LOWER(doc-&gt;\"$.publisher\")) VIRTUAL,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `isbn` (`isbn`)\n) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8<\/pre>\n<p>La colonne<em> publisher_lower<\/em> contient la version tout en minuscule des donn\u00e9es de la colonne <em>publisher<\/em>.<\/p>\n<pre class=\"lang:mysql decode:true\">mysql&gt; SELECT publisher, publisher_lower FROM catalog;\n+------------+-----------------+\n| publisher  | publisher_lower |\n+------------+-----------------+\n| \"ENI\"      | \"eni\"           |\n| \"Eyrolles\" | \"eyrolles\"      |\n| \"ENI\"      | \"eni\"           |\n+------------+-----------------+\n3 rows in set (0.00 sec)<\/pre>\n<p>Ajout de l&rsquo;index:<\/p>\n<pre class=\"lang:mysql decode:true\">mysql&gt; ALTER TABLE catalog ADD KEY idx_publisher_lower(publisher_lower);\nQuery OK, 0 rows affected (0.37 sec)\nRecords: 0  Duplicates: 0  Warnings: 0<\/pre>\n<p>Nouvelle structure de table:<\/p>\n<pre class=\"lang:mysql decode:true\">mysql&gt; SHOW CREATE TABLE catalog;\nCREATE TABLE `catalog` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `doc` json DEFAULT NULL,\n  `isbn` varchar(20) GENERATED ALWAYS AS (doc-&gt;\"$.isbn\") VIRTUAL,\n  `publisher` varchar(20) GENERATED ALWAYS AS (doc-&gt;\"$.publisher\") VIRTUAL,\n  `publisher_lower` varchar(20) GENERATED ALWAYS AS (LOWER(doc-&gt;\"$.publisher\")) VIRTUAL,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `isbn` (`isbn`),\n  KEY `idx_publisher_lower` (`publisher_lower`)\n) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8<\/pre>\n<p>Maintenant les donn\u00e9es \u00e9tant stock\u00e9es dans une collation non sensible \u00e0 la casse (utf8_general_ci) la requ\u00eate n&rsquo;est plus sensible \u00e0 la casse:<\/p>\n<pre class=\"lang:mysql decode:true \">mysql&gt; SELECT doc FROM catalog WHERE publisher_lower = 'ENI' AND publisher_lower = 'eni' AND publisher_lower = 'eNi';\n+--------------------------------------------------------------------------------------------------------------------------+\n| doc                                                                                                                      |\n+--------------------------------------------------------------------------------------------------------------------------+\n| {\"isbn\": \"978-2-7460-7864-2\", \"title\": \"MySQL 5.6 Administration et optimisation\", \"language\": \"FR\", \"publisher\": \"ENI\"} |\n| {\"isbn\": \"978-2-7460-5516-2\", \"title\": \"MySQL 5 Administration et optimisation\", \"language\": \"FR\", \"publisher\": \"ENI\"}   |\n+--------------------------------------------------------------------------------------------------------------------------+<\/pre>\n<p>La commande EXPLAIN confirme que l&rsquo;index est vu et utilis\u00e9:<\/p>\n<pre class=\"lang:mysql decode:true\">mysql&gt; EXPLAIN SELECT doc FROM catalog WHERE publisher_lower = 'eNi'\\G\n*************************** 1. row ***************************\n           id: 1\n  select_type: SIMPLE\n        table: catalog\n   partitions: NULL\n         type: ref\npossible_keys: idx_publisher_lower\n          key: idx_publisher_lower\n      key_len: 63\n          ref: const\n         rows: 2\n     filtered: 100.00\n        Extra: NULL<\/pre>\n<p>En fait on vient d&rsquo;impl\u00e9menter un index sur une fonction (functional index).<\/p>\n<p>Vous voulez en savoir plus sur MySQL 5.7 ?<br \/>\nRejoignez nous sur l&rsquo;<strong><a href=\"https:\/\/eventreg.oracle.com\/profile\/web\/index.cfm?PKWebID=0x2899224070&amp;source=EMEAFM15048281MPP052\" target=\"_blank\" rel=\"noopener\">Oracle MySQL Tech Tour Paris<\/a><\/strong> le 8 d\u00e9cember 2015.<\/p>\n<p><a href=\"https:\/\/eventreg.oracle.com\/profile\/web\/index.cfm?PKWebID=0x2899224070\" target=\"_blank\" rel=\"noopener\">Infos &amp; inscriptions<\/a><\/p>\n<p>Note: cet article vient en compl\u00e9ment de l&rsquo;article <a href=\"http:\/\/dasini.net\/blog\/2015\/11\/17\/30-mins-avec-json-en-mysql\/\">30 mins avec JSON en MySQL<\/a><\/p>\n<p>Je vous invite \u00e9galement \u00e0 consulter:<\/p>\n<ul>\n<li><a href=\"http:\/\/dasini.net\/blog\/2018\/07\/23\/30-mins-avec-les-fonctions-json-de-mysql\/\" target=\"_blank\" rel=\"noopener\">30 mins avec les fonctions JSON de MySQL<\/a><\/li>\n<li><strong><a href=\"http:\/\/mablomy.blogspot.fr\/2015\/11\/document-validation-of-json-columns-in.html\" target=\"_blank\" rel=\"noopener\">Document validation of JSON columns in MySQL<\/a><\/strong> de <a href=\"http:\/\/mablomy.blogspot.fr\/\" target=\"_blank\" rel=\"noopener\">Mario Beck<\/a><\/li>\n<li><a href=\"https:\/\/mysqlserverteam.com\/new-json-functions-in-mysql-5-7-22\/\" target=\"_blank\" rel=\"noopener\">New JSON functions in MySQL 5.7.22<\/a><\/li>\n<li><a href=\"http:\/\/www.slideshare.net\/gkodinov\/bgoug15-json-support-in-mysql-57\" target=\"_blank\" rel=\"noopener\"><strong>JSON support in MySQL 5.7<\/strong><\/a> de <a href=\"http:\/\/mysqlserverteam.com\/author\/joro\/\" target=\"_blank\" rel=\"noopener\">Georgi Kodinov<\/a><\/li>\n<\/ul>\n<p>http:\/\/www.slideshare.net\/gkodinov\/bgoug15-json-support-in-mysql-57<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le 24 novembre dernier, lors du Forum PHP, Tomas Ulin (Oracle&rsquo;s MySQL VP of Engineering) a parl\u00e9 de l&rsquo;utilisation de JSON dans MySQL \u00ab\u00a0MySQL 5.7 &#038; JSON: New opportunities for developers\u00a0\u00bb.<\/p>\n<p>Voici les r\u00e9ponses \u00e0 quelques questions qui m&rsquo;ont \u00e9t\u00e9 pos\u00e9es:<\/p>\n<p>Comment se comporte mysqldump avec les colonnes g\u00e9n\u00e9r\u00e9es ?<br \/>\nComment utiliser la commande LOAD DATA INFILE avec des colonnes g\u00e9n\u00e9r\u00e9es ?<br \/>\nJSON est il sensible \u00e0 la casse dans MySQL ?<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"footnotes":""},"categories":[260,8],"tags":[262,278,276],"class_list":["post-1557","post","type-post","status-publish","format-standard","hentry","category-json-fr","category-mysql","tag-generated-column","tag-json","tag-nosql"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9LfWW-p7","jetpack-related-posts":[{"id":1533,"url":"https:\/\/dasini.net\/blog\/2015\/11\/17\/30-mins-avec-json-en-mysql\/","url_meta":{"origin":1557,"position":0},"title":"30 mins avec JSON en MySQL","author":"Olivier DASINI","date":"17 novembre 2015","format":false,"excerpt":"Comme vous le savez MySQL 5.7 est GA. Cette nouvelle mouture de la base de donn\u00e9es open source la plus populaire au monde a plus de 150 nouvelles fonctionnalit\u00e9s. L'une d'entre elle est un type de donn\u00e9es JSON natif ainsi que les fonctions JSON associ\u00e9es. Prenons 30 minutes pour voir\u2026","rel":"","context":"Dans &quot;json&quot;","block_context":{"text":"json","link":"https:\/\/dasini.net\/blog\/category\/json-fr\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2959,"url":"https:\/\/dasini.net\/blog\/2019\/04\/08\/200\/","url_meta":{"origin":1557,"position":1},"title":"200 !!","author":"Olivier DASINI","date":"8 avril 2019","format":false,"excerpt":"Cet article est en fait mon 200 \u00e8me \\o\/ Pour marquer le coup, j'ai d\u00e9cid\u00e9 de faire une petite pause et de regarder dans le r\u00e9troviseur...","rel":"","context":"Dans &quot;Divers&quot;","block_context":{"text":"Divers","link":"https:\/\/dasini.net\/blog\/category\/divers\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2492,"url":"https:\/\/dasini.net\/blog\/2018\/07\/23\/30-mins-avec-les-fonctions-json-de-mysql\/","url_meta":{"origin":1557,"position":2},"title":"30 mins avec les fonctions JSON de MySQL","author":"Olivier DASINI","date":"23 juillet 2018","format":false,"excerpt":"Comme tu le sais,\u00a0JSON (JavaScript Object Notation) est un populaire format d'\u00e9change de donn\u00e9es. Depuis la version 5.7, MySQL supporte un type de donn\u00e9es JSON\u00a0natif (au format interne binaire pour des raisons d'efficacit\u00e9s), ainsi qu'un riche ensemble de fonctions qui te permettront de manipuler dans tout les sens tes documents\u2026","rel":"","context":"Dans &quot;json&quot;","block_context":{"text":"json","link":"https:\/\/dasini.net\/blog\/category\/json-fr\/"},"img":{"alt_text":"MySQL native JSON data type","src":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/json_icon.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":2700,"url":"https:\/\/dasini.net\/blog\/2018\/10\/29\/presentation-mysql-8-0-quoi-de-neuf-au-forum-php-2018\/","url_meta":{"origin":1557,"position":3},"title":"Pr\u00e9sentation  MySQL 8.0 : Quoi de neuf ? au Forum PHP 2018","author":"Olivier DASINI","date":"29 octobre 2018","format":false,"excerpt":"Ce vendredi 26 octobre, j'ai eu le plaisir de pr\u00e9senter devant une salle comble, malgr\u00e9 l'horaire matinal (preuve s'il en faut que les bases de donn\u00e9es sont un sujet qui int\u00e9resse les d\u00e9veloppeurs), les nouveaut\u00e9s de MySQL 8.0. Au programme, NoSQL + SQL = MySQL o\u00f9 MySQL peut aussi \u00eatre\u2026","rel":"","context":"Dans &quot;Conf\u00e9rence&quot;","block_context":{"text":"Conf\u00e9rence","link":"https:\/\/dasini.net\/blog\/category\/conference\/"},"img":{"alt_text":"AFUP Forum PHP 2018 - MySQL 8.0","src":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/olivier_dasini_mysql_speaker_2.jpg?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/olivier_dasini_mysql_speaker_2.jpg?resize=350%2C200 1x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/olivier_dasini_mysql_speaker_2.jpg?resize=525%2C300 1.5x"},"classes":[]},{"id":1634,"url":"https:\/\/dasini.net\/blog\/2016\/08\/29\/meetup-mysql-group-replication-mysql-as-a-document-store\/","url_meta":{"origin":1557,"position":4},"title":"Meetup &#8211; MySQL Group Replication &#038; MySQL as a Document Store","author":"Olivier DASINI","date":"29 ao\u00fbt 2016","format":false,"excerpt":"Oracle MySQL, Openska et Executive MBA Epitech ont le plaisir de vous inviter le mardi 6 septembre pour le premier meetup MySQL de la rentr\u00e9e. Au programme: MySQL Group Replication & MySQL as a Document Store","rel":"","context":"Dans &quot;Conf\u00e9rence&quot;","block_context":{"text":"Conf\u00e9rence","link":"https:\/\/dasini.net\/blog\/category\/conference\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/mysqlhighavailability.com\/wp-content\/uploads\/2014\/09\/1.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":2731,"url":"https:\/\/dasini.net\/blog\/2018\/11\/23\/slides-du-mysql-day-paris-2018-nosql-sql-mysql\/","url_meta":{"origin":1557,"position":5},"title":"Slides du MySQL Day Paris 2018 \u2013 NoSQL + SQL = MySQL","author":"Olivier DASINI","date":"23 novembre 2018","format":false,"excerpt":"Au nom de toute l'\u00e9quipe MySQL, je souhaite vous remercier pour votre pr\u00e9sence ! On a certes d\u00fb un peu pousser les murs (sorry for that), mais finalement cela n'a fait que contribuer \u00e0 rendre l'\u00e9v\u00e9nement encore plus convivial :) Et voici les slides:","rel":"","context":"Dans &quot;audit&quot;","block_context":{"text":"audit","link":"https:\/\/dasini.net\/blog\/category\/audit\/"},"img":{"alt_text":"MySQL 8 is Great","src":"https:\/\/i0.wp.com\/pbs.twimg.com\/media\/DsmMn7HXcAApacW.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/pbs.twimg.com\/media\/DsmMn7HXcAApacW.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/pbs.twimg.com\/media\/DsmMn7HXcAApacW.jpg?resize=525%2C300&ssl=1 1.5x"},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/1557","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/comments?post=1557"}],"version-history":[{"count":12,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/1557\/revisions"}],"predecessor-version":[{"id":7240,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/1557\/revisions\/7240"}],"wp:attachment":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/media?parent=1557"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/categories?post=1557"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/tags?post=1557"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}