Django + mysql - Cambio de COLLATION y CHARSET



En un proyecto django en el que vengo trabajando estaba teniendo problemas con el tipo de caracter usado en la base de datos MySql. Los datos se obtienen a través de una api (cuyo encoding es UTF-8) y al guardar los datos recibidos solía obtener un:

_mysql_exceptions.Warning: Incorrect string value: 'xECx9AxB4 xECx9D...' for column 'name' at row 1

Esto sucedia aleatoreamente en distintas tablas y campos, por lo que decidí modificar todas las tablas de la aplicación django en cuestión.

El problema es que eran muuuchas tablas y se debe establecer el charset y collation individualmente (por tabla).

Usando esta respuesta como base hice lo siguiente:

  1. Ejecuté este script para obtener el script (valga la redundancia) que me convertiría cada tabla (app_django en el nombre de la aplicación django cuya base de datos quiero actualizar):
SELECT CONCAT('ALTER TABLE `', t.`TABLE_SCHEMA`, '`.`', t.`TABLE_NAME`,
    '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') as spt
FROM `information_schema`.`TABLES` t
WHERE 1 AND t.`TABLE_SCHEMA` = 'app_django' and t.`table_name` like "app_django_%"
ORDER BY 1

Esto genera una salida por tabla a actualizar:

ALTER TABLE `app_db`.`app_django_country` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `app_db`.`app_django_customeraddress` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `app_db`.`app_django_customer` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
  1. Ejecutamos la salida anterior para modificar todas las tablas de la app django.

Anduvo de maravillas.

Saludos

Comments


Comments powered by Disqus