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