Tengo una tabla con la siguiente estructura:
CREATE TABLE `Event` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `created` datetime(6) NOT NULL, `last_updated` datetime(6) NOT NULL, `info` longtext NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=720 DEFAULT CHARSET=latin1 Necesito consultarlo usando la columna de info (que contiene una cadena JSON).
Si lo consulto haciendo:
SELECT e.id, e.created, JSON_TYPE(e.info) AS info FROM Event eDevuelve OBJECT en la columna INFO, pero si trato de tomar una columna específica del JSON, recibo:
Error de SQL [3144] [22001]: Truncamiento de datos: no se puede crear un valor JSON a partir de una cadena con CHARACTER SET 'binary'.
El SQL que estoy ejecutando:
SELECT INFO - > '$User' FROM (SELECT e.id, e.created, JSON_TYPE(e.info) AS info FROM Event e) as XNo es una opción cambiar el tipo de columna a json.
Puedes intentar CAST a JSON entonces
SELECT info -> '$.User', info_type FROM (SELECT e.id, e.created, JSON_TYPE( CAST( info AS JSON ) ) AS info_type, CAST( info AS JSON ) AS info FROM Event e) as X ya que un valor de cadena dentro de una función de aceptación de valor JSON ( JSON_TYPE() ) no funcionaría.
Por cierto, no necesita traer el tipo JSON, sino solo el JSON, para su caso.
Actualización : alternativamente, puede usar sin subconsulta usando JSON_EXTRACT() como
SELECT JSON_EXTRACT( CAST( info AS JSON ) , '$.A' ) AS info, JSON_TYPE( CAST( info AS JSON ) ) AS info_type FROM Event