emojis - mysql store emoji
Valor de cadena incorrecto: ''/ xF0 / x9F / x8E / xB6 / xF0 / x9F...'' MySQL (3)
Finalmente pude descifrar el problema. Tuve que cambiar algunas configuraciones en la configuración mysql my.ini Este artículo me ayudó mucho http://mathiasbynens.be/notes/mysql-utf8mb4#character-sets
Primero cambié el conjunto de caracteres en my.ini a utf8mb4. Luego ejecuté los siguientes comandos en el cliente de MySQL.
SET NAMES utf8mb4;
ALTER DATABASE dreams_twitter CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
Use el siguiente comando para verificar que los cambios estén hechos
SHOW VARIABLES WHERE Variable_name LIKE ''character/_set/_%'' OR Variable_name LIKE ''collation%'';
Intento almacenar un tweet en mi tabla MYSQL. El tweet es:
quiero que escuches, no te burles no te rias, anoche tuve un sueño que te fuiste de mi vida 🎶🎶
Los dos caracteres finales son "NOTAS MÚSPLES MUSICALES" (U + 1F3B6) , para las cuales la codificación UTF-8 es 0xf09f8eb6
.
El campo tweet_text
en mi tabla está codificado en utf8mb4
. Pero cuando intento almacenar el tweet en esa columna, aparece el siguiente mensaje de error:
Valor de cadena incorrecto: ''/ xF0 / x9F / x8E / xB6 / xF0 / x9F ...'' para la columna ''tweet_text'' en la fila 1.
¿Qué está pasando mal? ¿Cómo puedo arreglar esto? Necesito almacenar varios idiomas también y este conjunto de caracteres funciona para todos los idiomas pero no para los caracteres especiales como emoticones y emojis.
Esta es mi declaración de crear tabla:
CREATE TABLE `twitter_status_data` (
`unique_status_id` bigint(20) NOT NULL AUTO_INCREMENT,
`metadata_result_type` text CHARACTER SET utf8,
`created_at` text CHARACTER SET utf8 NOT NULL COMMENT ''UTC time when this Tweet was created.'',
`id` bigint(20) unsigned NOT NULL COMMENT ''Unique tweet identifier'',
`id_str` text CHARACTER SET utf8 NOT NULL,
`tweet_text` text COMMENT ''Actual UTF-8 text'',
`user_id_str` text CHARACTER SET utf8,
`user_name` text COMMENT ''User''''s name'',
`user_screen_name` text COMMENT ''Twitter handle'',
`coordinates` text CHARACTER SET utf8,
PRIMARY KEY (`unique_status_id`),
KEY `user_id_index` (`user_id`),
FULLTEXT KEY `tweet_text_index` (`tweet_text`)
) ENGINE=InnoDB AUTO_INCREMENT=82451 DEFAULT CHARSET=utf8mb4;
Me había topado con el mismo problema y aprendí lo siguiente-
Aunque la base de datos tiene un conjunto de caracteres predeterminado de utf-8, es posible que las columnas de la base de datos tengan un juego de caracteres diferente en MySQL. DB modificado y la columna problemática para UTF-8:
mysql> ALTER DATABASE MyDB CHARACTER SET ''utf8'' COLLATE ''utf8_unicode_ci''
mysql> ALTER TABLE database.table MODIFY COLUMN column_name VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
Ahora creando nuevas tablas con:
> CREATE TABLE My_Table_Name (
twitter_id_str VARCHAR(255) NOT NULL UNIQUE,
twitter_screen_name VARCHAR(512) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
.....
) CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Puede ser obvio, pero aún me sorprendió que SET NAMES utf8
no sea compatible con la codificación utf8mb4
. Entonces, para algunas aplicaciones, cambiar la codificación de tabla / columna no fue suficiente. Tuve que cambiar la codificación en la configuración de la aplicación.
Redmine (ruby, ROR)
En config/database.yml
:
production:
adapter: mysql2
database: redmine
host: localhost
username: redmine
password: passowrd
encoding: utf8mb4
Aplicación personalizada de Yii (PHP)
En config/db.php
:
return [
''class'' => yii/db/Connection::class,
''dsn'' => ''mysql:host=localhost;dbname=yii'',
''username'' => ''yii'',
''password'' => ''password'',
''charset'' => ''utf8mb4'',
],
Si tiene utf8mb4
como codificación de columna / tabla y sigue obteniendo errores como este, asegúrese de haber configurado el juego de caracteres correcto para la conexión de base de datos en su aplicación.