I am trying to change a MySQL column from varchar(9000) NULL to the new JSON data type in MySQL 5.7. The column holds valid JSON strings but some values are null. When I try the following:
我试图将MySQL列从varchar(9000)NULL更改为MySQL 5.7中的新JSON数据类型。该列包含有效的JSON字符串,但某些值为null。当我尝试以下内容时:
alter table log modify request json
it fails with the following error:
它失败并出现以下错误:
Invalid JSON text: "The document is empty." at position 0 in value for column '#sql-2f36_168a6.request'
However, when I create a new column:
但是,当我创建一个新列时:
alter table log add request_json json
and then insert the same data:
然后插入相同的数据:
update log set request_json=json where request != ''
the new request_json column is updated. How to I modify the existing column to JSON data type and preserve the JSON data without creating a new column?
新的request_json列已更新。如何将现有列修改为JSON数据类型并保留JSON数据而不创建新列?
1 个解决方案
#1
7
12.6 JSON数据类型
...
- Automatic validation of JSON documents stored in JSON columns. Invalid documents produce an error.
自动验证存储在JSON列中的JSON文档。无效的文档会产生错误。
...
mysql> SHOW CREATE TABLE `log`\G
*************************** 1. row ***************************
Table: log
Create Table: CREATE TABLE `log` (
`request` json DEFAULT NULL
) ENGINE=InnoDB
1 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: 0
mysql> 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: 0
mysql> ALTER TABLE `log` MODIFY `request` JSON;
Query OK, 3 rows affected (0,00 sec)
Records: 3 Duplicates: 0 Warnings: 0
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> SHOW CREATE TABLE `log`\G
*************************** 1. row ***************************
Table: log
Create Table: CREATE TABLE `log` (
`request` json DEFAULT NULL
) ENGINE=InnoDB
1 row in set (0,00 sec)
#1
7
12.6 JSON数据类型
...
- Automatic validation of JSON documents stored in JSON columns. Invalid documents produce an error.
自动验证存储在JSON列中的JSON文档。无效的文档会产生错误。
...
mysql> SHOW CREATE TABLE `log`\G
*************************** 1. row ***************************
Table: log
Create Table: CREATE TABLE `log` (
`request` json DEFAULT NULL
) ENGINE=InnoDB
1 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: 0
mysql> 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: 0
mysql> ALTER TABLE `log` MODIFY `request` JSON;
Query OK, 3 rows affected (0,00 sec)
Records: 3 Duplicates: 0 Warnings: 0
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> SHOW CREATE TABLE `log`\G
*************************** 1. row ***************************
Table: log
Create Table: CREATE TABLE `log` (
`request` json DEFAULT NULL
) ENGINE=InnoDB
1 row in set (0,00 sec)