Cómo arreglar y evitar el error 1366 con mariadb y go

Cómo solucionar el error de Mariadb y Golang 1366: Incorrect string value

Golang se ha convertido en uno de los lenguajes de programación más interesantes en los últimos tiempos. Esto por supuesto no significa ni que sea fácil de usar, ni que esté exento de posibles problemas. Algunas cosas como solucionar el error en Golang 1366 incorrect string value, es provocado por un error humano.

Cómo arreglar el error 1366 en Golang y Mariadb

Este fallo viene dado principalmente por el uso que hacemos de la base de datos, y como la hemos creado.

Este es el error de exactamente:

Mysql err (message_repository.go): Error 1366: Incorrect string value: ‘\xC5\x99\xC3\xADpa…’ for column `tabla`.`mensaje`.`content` at row 1

En concreto, aparece debido a la codificación de la tabla/columna en la que estás intentando insertar los datos, y a que lo estás haciendo de una forma incorrecta.

En este caso estás intentando insertar carácteres de 4 bytes en una tabla configurada para carácteres de 3 bytes. Esto significa que tu tabla o columna seguramente sea utf8 u otra similar y le estés intentando meter carácteres en utf8mb4.

Para evitar el problema en el futuro tienes dos opciones. O bien indicar en la configuración de la base de datos, que todo lo que crees se haga de forma predeterminada en cotejamiento utf8mb4 y utf8mb4_general_ci, o hacerlo tú en cada creación.

Todas las siguientes secciones requiren que te conectes a la terminal de mysql o mariadb, o bien ejecutes los comandos con phpmyadmin:

mysql -uroot -p

Como configurar utf8mb4 de forma predeterminada en MariaDB

Este es el más interesante para mantener la coherencia entre entornos de desarrollo y producción, además de si estás en un estado temprano del proyecto. Yo te lo recomiendo sí o sí, aunque uses alguno de los siguientes para arreglar la base de datos ahora.

Léete también  Cómo deshabilitar las revisiones de Wordpress o limitar la cantidad a guardar

Si usas la terminal ejecuta

use mysql;

Si estás en phpmyadmin como root simplemente abre la tabla mysql.

Ejecuta este par de comandos con el cotejamiento que mejor te venga:

SET character_set_server = utf8mb4;
SET collation_server = 'utf8mb4_general_ci';

A partir de aquí tanto tablas como columnas usarán las que acabas de poner.

Cómo añadir cotejamiento al crear tablas en MariaDB

Para simplemente añadir el cotejamiento a la hora de crear las tablas, bastará con utilizar la coletilla charset y collate al final de create table.

CREATE TABLE IF NOT EXISTS mitabla (
[...]
) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;`

La última línea es la que te interesa y que puedes añadir a cualquier consulta de creación.

Cómo cambiar una tabla a utf8mb4_general_ci en MariaDB

Para actualizar la tabla que sea a utf8mb4_general_ci, basta con ejecutar este comando en la base de datos que quieras modificar.

En terminal

use mibasededatos;

Y luego ejecutas en terminal o en sql de phpmyadmin lo siguiente:

ALTER TABLE
    mitabla
    CONVERT TO CHARACTER SET utf8mb4
    COLLATE utf8mb4_general_ci;

Cómo cambiar una columna a utf8mb4_general_ci en MariaDB

Una vez en terminal o phpmyadmin como en el ejemplo anterior, bastará con que ejecutes el siguiente comando para tu tabla y columna.

ALTER TABLE
    mitabla
    CHANGE micolumna
    VARCHAR(191)
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_general_ci;

Esto cambiará cualquier cotejamiento para una columna específica y no la tabla entera si no lo necesitas.

En todos los métodos se cambia solo el cotejamiento, aunque ten en cuenta que hacer eso cuando tienes datos dentro de las tablas podría llevar a cambios en los mismos. En esos casos lo mejor es hacer un volcado, y cambiar los cotejamientos en las instrucciones para volver a importar la base de datos y que se inserte todo correctamente.

Léete también  Error Unknown: failed to open stream: Permission denied in... [SOLUCIONADO]

Si tienes algún problema accediendo por terminal o phpmyadmin dímelo en los comentarios y te echo un cable.

¿Usas MariaDB y Go? ¿Qué proyecto tienes entre manos? Comenta y comparte


AYUDANOS a poder seguir dando respuestas. Te podemos echar una mano y tú también a nosotros, símplemente dale a me gusta.