updated_at invalid for error deleted_at mysql ruby-on-rails ruby encoding

invalid - Mysql2:: Error: valor de cadena incorrecto



mysql error invalid default value for (6)

Tengo una aplicación de rieles ejecutándose en modo de producción, pero de repente este error surgió hoy cuando un usuario intentó guardar un registro.

Mysql2::Error: Incorrect string value

Más detalles (del registro de producción):

Parameters: {"utf8"=>"â<9c><93>" ... Mysql2::Error: Incorrect string value: ''/xC5/x99/xC3/xA1k Mysql2::Error: Incorrect string value: ''/xC5/x99/xC3/xA1k

Ahora vi algunas soluciones que requerían abandonar las bases de datos y volver a crearlas, pero no puedo hacer eso.

Ahora mysql muestra esto:

mysql> show variables like ''char%''; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.04 sec)

¿Qué está mal y cómo puedo cambiarlo para que no tenga ningún problema con ningún personaje?

Además: ¿este problema se puede resolver con javascript? Convertirlo antes de enviarlo?

Gracias


Parece un problema de codificación al obtener datos de la base de datos. Intente agregar lo siguiente a su archivo database.yml

encoding: utf8

espero que esto resuelva tu problema


Puede usar una migración como esta para convertir sus tablas a utf8:

class ConvertTablesToUtf8 < ActiveRecord::Migration def change_encoding(encoding,collation) connection = ActiveRecord::Base.connection tables = connection.tables dbname =connection.current_database execute <<-SQL ALTER DATABASE #{dbname} CHARACTER SET #{encoding} COLLATE #{collation}; SQL tables.each do |tablename| execute <<-SQL ALTER TABLE #{dbname}.#{tablename} CONVERT TO CHARACTER SET #{encoding} COLLATE #{collation}; SQL end end def change reversible do |dir| dir.up do change_encoding(''utf8'',''utf8_general_ci'') end dir.down do change_encoding(''latin1'',''latin1_swedish_ci'') end end end end


Logré almacenar emojis (que ocupan 4 bytes) al seguir esta publicación en el blog :

Rails 4, MySQL y Emoji ( Mysql2::Error: Incorrect string value error. )

Puede pensar que está seguro insertando la mayoría de los datos utf8 en mysql cuando ha especificado que el juego de caracteres es utf-8 . Tristemente, sin embargo, estarías equivocado. El problema es que el conjunto de caracteres utf8 ocupa 3 bytes cuando se almacena en una columna VARCHAR. Los caracteres Emoji, por otro lado, ocupan 4 bytes .

La solución está en 2 partes:

Cambie la codificación de su tabla y campos:

ALTER TABLE `[table]` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, MODIFY [column] VARCHAR(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

Dile al adaptador mysql2 respecto:

development: adapter: mysql2 database: db username: password: encoding: utf8mb4 collation: utf8mb4_unicode_ci

¡Espero que esto ayude a alguien!

Luego tuve que reiniciar mi aplicación y funcionó. Tenga en cuenta que algunos emojis funcionarán sin esta corrección, mientras que otros no:

  • Did️ ¿Funcionó?
  • 🔵 No funcionó hasta que aplique la corrección descrita arriba.

Necesita cambiar CHARACTER SET y COLLATE para la base de datos ya creada:

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;

O era necesario crear una base de datos con parámetros preestablecidos:

CREATE DATABASE databasename CHARACTER SET utf8 COLLATE utf8_general_ci;


el problema es causado por juego de caracteres de su lado del servidor mysql. Puede configurar manualmente como:

ALTER TABLE your_database_name.your_table CONVERT TO CHARACTER SET utf8

o soltar la tabla y recrearla como:

rake db:drop rake db:create rake db:migrate

referencias:

https://.com/a/18498210/2034097

https://.com/a/16934647/2034097

ACTUALIZAR

el primer comando solo afecta la tabla especificada, si quiere cambiar todas las tablas en una base de datos, puede hacer

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_general_ci;

referencia:

https://.com/a/6115705/2034097


Además, si no desea hacer cambios en la estructura de su base de datos, puede optar por serializar el campo en cuestión.

class MyModel < ActiveRecord::Base serialize :content attr_accessible :content, :title end