2016-06-14 13 views
2

Ich versuche, eine MySQL-Spalte von Varchar (9000) NULL in den neuen JSON-Datentyp in MySQL 5.7 zu ändern. Die Spalte enthält gültige JSON-Zeichenfolgen, einige Werte sind jedoch null. Wenn ich versuche, die folgenden:Eine vorhandene MySQL-Spalte zu einem JSON-Datentyp ändern

alter table log modify request json 

es mit dem folgenden Fehler fehl:

Invalid JSON text: "The document is empty." at position 0 in value for column '#sql-2f36_168a6.request' 

Allerdings, wenn ich erstellen Sie eine neue Spalte:

alter table log add request_json json 

und dann die gleichen Daten ein:

update log set request_json=json where request != '' 

der neue request_json Spalte wird aktualisiert. Wie ändere ich die vorhandene Spalte in den JSON-Datentyp und behalte die JSON-Daten bei, ohne eine neue Spalte zu erstellen?

+1

Sie Unterschied in Ihrer Spalte zwischen 'NULL' und' '' '?. Führen Sie 'SELECT \' log \ 'FROM \' request \ 'WHERE JSON_VALID (\' log \ ') = 0 \ G aus, um diejenigen Zeilen zu erkennen, die Probleme verursachen können. – wchiquito

+0

Ich habe Ihre Abfrage ausgeführt und ein paar hundert mit null oder leere Werte gefunden. ist NULL für json Datentypen ungültig? –

+0

Also nach dem Spielen mit etwas mehr scheint es, dass NULL gültig ist, aber ein leerer Wert ist ungültig. Klingt das wahr? –

Antwort

5

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: 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'. 

Versuchen:

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)