es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cambiar el tipo de columna de MEDIUMTEXT a JSON causa un error de “No se puede convertir el valor a JSON” al insertar y actualizar.

Estoy usando AWS Aurora MySQL 5.7. Tengo una columna de tipo MEDIUMTEXT que me gustaría convertir a JSON. Después de usar ALTER para lograr esto, no puedo actualizar el campo recién tipificado JSON de un registro existente ni insertar nuevos registros. En ambos casos, se produce un error “Cannot CAST value to JSON”. El conjunto de caracteres predeterminado para esta base de datos es latin1, pero el conjunto de caracteres en esta tabla es utf8.

La tabla está definida de la siguiente manera:

CREATE TABLE table_sample (
id int(11) NOT NULL AUTO_INCREMENT,
config mediumtext NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT

He intentado cambiar el tipo de columna a través de:

ALTER TABLE table_sample
    ADD COLUMN config2 JSON DEFAULT NULL;

UPDATE table_sample
SET config2 = IF(JSON_VALID(config), config, NULL);

ALTER TABLE table_sample
    DROP COLUMN config;

ALTER TABLE table_sample
    CHANGE config2 config JSON;

Intentar duplicar un registro de esta manera, después de la conversión a JSON, es una forma de provocar el error de CAST mencionado anteriormente:

INSERT INTO table_sample (config)
SELECT config FROM table_sample WHERE id = 1;

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema se debe principalmente a la diferencia en el conjunto de caracteres entre el conjunto de caracteres predeterminado para la base de datos (latin1) y el conjunto de caracteres para la tabla (utf8). Al convertir la columna MEDIUMTEXT a JSON, los datos originales pueden contener caracteres no admitidos por el conjunto de caracteres latin1. Esto podría causar un error de CAST al intentar actualizar o insertar registros.

    Para solucionar este problema, puede intentar convertir el conjunto de caracteres de la tabla para que coincida con el conjunto de caracteres predeterminado de la base de datos. Puede utilizar el siguiente comando para modificar la tabla y establecer el conjunto de caracteres en latin1:

    ALTER TABLE table_sample CONVERT TO CHARACTER SET latin1;
    

    Después de convertir el conjunto de caracteres, puede volver a ejecutar el comando ALTER para convertir la columna MEDIUMTEXT a JSON:

    ALTER TABLE table_sample
        ADD COLUMN config2 JSON DEFAULT NULL;
    
    UPDATE table_sample
    SET config2 = IF(JSON_VALID(config), config, NULL);
    
    ALTER TABLE table_sample
        DROP COLUMN config;
    
    ALTER TABLE table_sample
        CHANGE config2 config JSON;
    

    Esto debería permitir actualizar e insertar registros sin encontrar el error de CAST.

Comments are closed.