Alter an existing MySQL column to a JSON data type Alter an existing MySQL column to a JSON data type json json

Alter an existing MySQL column to a JSON data type


12.6 The JSON Data Type

...

  • Automatic validation of JSON documents stored in JSON columns. Invalid documents produce an error.

...

mysql> SHOW CREATE TABLE `log`\G*************************** 1. row ***************************       Table: logCreate Table: CREATE TABLE `log` (  `request` json DEFAULT NULL) ENGINE=InnoDB1 row in set (0,00 sec)mysql> SELECT `request`, JSON_VALID(`request`)    -> FROM `log`;+-----------------+-----------------------+| request         | JSON_VALID(`request`) |+-----------------+-----------------------+| {"type": "bug"} |                     1 || NULL            |                  NULL || NULL            |                  NULL |+-----------------+-----------------------+3 rows in set (0,00 sec)mysql> UPDATE `log`    -> SET `request` = ''    -> WHERE `request` IS NULL;ERROR 3140 (22032): Invalid JSON text: "The document is empty." at position 0 in value for column 'log.request'.

Try:

mysql> DROP TABLE IF EXISTS `log`;Query OK, 0 rows affected (0,00 sec)mysql> CREATE TABLE IF NOT EXISTS `log` (    ->   `request` VARCHAR(9000) NULL    -> );Query OK, 0 rows affected (0,01 sec)mysql> INSERT INTO `log`    ->   (`request`)    -> VALUES    ->   ('{"type": "bug"}'),    ->   (NULL),    ->   ('');Query OK, 3 rows affected (0,00 sec)Records: 3  Duplicates: 0  Warnings: 0mysql> SELECT `request`, JSON_VALID(`request`)    -> FROM `log`;+-----------------+-----------------------+| request         | JSON_VALID(`request`) |+-----------------+-----------------------+| {"type": "bug"} |                     1 || NULL            |                  NULL ||                 |                     0 |+-----------------+-----------------------+3 rows in set (0,00 sec)mysql> ALTER TABLE `log` MODIFY `request` JSON;ERROR 3140 (22032): Invalid JSON text: "The document is empty." at position 0 in value for column '#sql-1bab_4.request'.mysql> UPDATE `log`    -> SET `request` = NULL    -> WHERE `request` = '';Query OK, 1 row affected (0,00 sec)Rows matched: 1  Changed: 1  Warnings: 0mysql> ALTER TABLE `log` MODIFY `request` JSON;Query OK, 3 rows affected (0,00 sec)Records: 3  Duplicates: 0  Warnings: 0mysql> SELECT `request`, JSON_VALID(`request`)    -> FROM `log`;+-----------------+-----------------------+| request         | JSON_VALID(`request`) |+-----------------+-----------------------+| {"type": "bug"} |                     1 || NULL            |                  NULL || NULL            |                  NULL |+-----------------+-----------------------+3 rows in set (0,00 sec)mysql> SHOW CREATE TABLE `log`\G*************************** 1. row ***************************       Table: logCreate Table: CREATE TABLE `log` (  `request` json DEFAULT NULL) ENGINE=InnoDB1 row in set (0,00 sec)