J'essaie de stocker un Tweet dans ma table MYSQL. Le Tweet est:
que je sois écoutes, rien ne se passe, tu me fais une idée de ce qui se passe
Les deux derniers caractères sont tous les deux '' MULTIPLE NOTES MUSICALES '(U + 1F3B6) =, pour lequel le codage UTF-8 est 0xf09f8eb6
.
Le champ Tweet_text
De ma table est codé dans utf8mb4
. Mais lorsque j'essaie de stocker le Tweet dans cette colonne, le message d'erreur suivant s'affiche:
Valeur de chaîne incorrecte: '\ xF0\x9F\x8E\xB6\xF0\x9F ...' pour la colonne 'Tweet_text' à la ligne 1.
Qu'est-ce qui ne va pas? Comment puis-je réparer cela? Je dois également stocker plusieurs langues et ce jeu de caractères fonctionne pour toutes les langues, mais pas pour les caractères spéciaux tels que les émoticônes et les émojis.
Voici ma déclaration de création de table:
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;
J'ai finalement pu comprendre le problème. J'ai dû changer certains paramètres dans la configuration de mysql. My.ini Cet article a beaucoup aidé http://mathiasbynens.be/notes/mysql-utf8mb4#character-sets
D'abord j'ai changé le jeu de caractères dans my.ini en utf8mb4 Ensuite, j'ai exécuté les commandes suivantes dans le client mysql
SET NAMES utf8mb4;
ALTER DATABASE dreams_Twitter CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
Utilisez la commande suivante pour vérifier que les modifications sont apportées
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
J'avais rencontré le même problème et appris la suite-
Même si la base de données a un jeu de caractères par défaut, utf-8, il est possible que les colonnes de la base de données aient un jeu de caractères différent dans MySQL. DB modifié et colonne problématique en 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;
Maintenant, créez de nouvelles tables avec:
> 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;
C’est peut-être évident, mais c’est quand même surprenant pour moi que SET NAMES utf8
n'est pas compatible avec utf8mb4
encodage. Donc, pour certaines applications, changer l'encodage table/colonne n'était pas suffisant. J'ai dû changer le codage dans la configuration de l'application.
Redmine (Ruby, ROR)
Dans config/database.yml
:
production:
adapter: mysql2
database: redmine
Host: localhost
username: redmine
password: passowrd
encoding: utf8mb4
Personnalisé Yii application (PHP)
Dans config/db.php
:
return [
'class' => yii\db\Connection::class,
'dsn' => 'mysql:Host=localhost;dbname=yii',
'username' => 'yii',
'password' => 'password',
'charset' => 'utf8mb4',
],
Si tu as utf8mb4
comme codage de colonne/table et que vous rencontrez toujours des erreurs de ce type, assurez-vous que vous avez configuré le jeu de caractères correct pour la connexion à la base de données dans votre application.
Selon l'instruction create table, le jeu de caractères par défaut de la table est déjà utf8mb4. Il semble que vous ayez un mauvais jeu de caractères de connexion.
En Java, définissez l'URL de la source de données comme suit: jdbc: mysql: //127.0.0.1: 3306/testdb? UseUnicode = true & characterEncoding = utf-8.
"? useUnicode = true & characterEncoding = utf-8" est nécessaire pour utiliser utf8mb4.
Cela fonctionne pour mon application.
POUR SQLALCHIMIE ET PYTHON
Le codage utilisé pour Unicode était traditionnellement "utf8". Cependant, pour les versions 5.5.3 à venir de MySQL, un nouveau codage spécifique "utf8mb4" a été introduit. À partir de MySQL 8.0, le serveur émettra un avertissement si plain utf8 est spécifié dans les directives côté serveur, remplacé par utf8mb3. La raison de ce nouveau codage est due au fait que le codage hérité utf-8 de MySQL ne prend en charge que les points de code jusqu’à trois octets au lieu de quatre. Par conséquent, lors de la communication avec une base de données MySQL comprenant des points de code d'une taille supérieure à trois octets, ce nouveau jeu de caractères est préférable, s'il est pris en charge à la fois par la base de données et par le client DBAPI, comme dans:
e = create_engine(
"mysql+pymysql://scott:tiger@localhost/test?charset=utf8mb4")
All modern DBAPIs should support the utf8mb4 charset.