it-swarm.com.de

Falscher String-Wert: '\ xF0 \ x9F \ x8E \ xB6 \ xF0 \ x9F ...' MySQL

Ich versuche, einen Tweet in meiner MYSQL-Tabelle zu speichern. Das Tweet ist:

quiero que me escuches, no te burles no te rias, anoche tuve un sueño que fuiste de mi vida ????????

Die letzten beiden Zeichen sind beide 'MULTIPLE MUSICAL NOTES' (U + 1F3B6) , für die die UTF-8-Codierung 0xf09f8eb6.

Das Tweet_text Feld in meiner Tabelle ist verschlüsselt in utf8mb4. Aber wenn ich versuche, den Tweet in dieser Spalte zu speichern, erhalte ich die folgende Fehlermeldung:

Falscher Zeichenfolgenwert: '\ xF0\x9F\x8E\xB6\xF0\x9F ...' für Spalte 'Tweet_text' in Zeile 1.

Was läuft falsch? Wie kann ich das beheben? Ich muss auch mehrere Sprachen speichern und dieser Zeichensatz funktioniert für alle Sprachen, aber nicht für Sonderzeichen wie Emoticons und Emojis.

Dies ist meine Anweisung zum Erstellen einer Tabelle:

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;
46
db1

Ich konnte das Problem endlich herausfinden. Ich musste einige Einstellungen in der mysql-Konfiguration ändern. My.ini Dieser Artikel hat mir sehr geholfen http://mathiasbynens.be/notes/mysql-utf8mb4#character-sets

Zuerst habe ich den Zeichensatz in my.ini in utf8mb4 geändert. Als nächstes habe ich die folgenden Befehle im MySQL-Client ausgeführt

SET NAMES utf8mb4; 
ALTER DATABASE dreams_Twitter CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

Verwenden Sie den folgenden Befehl, um zu überprüfen, ob die Änderungen vorgenommen wurden

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
87
db1

Ich hatte dasselbe Problem und lernte Folgendes:

Obwohl die Datenbank einen Standardzeichensatz von utf-8 hat, ist es möglich, dass Datenbankspalten in MySQL einen anderen Zeichensatz haben. Modifiziertes dB und die problematische Spalte zu 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;

Erstellen Sie nun neue Tabellen mit:

> 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;
12
Vishal

Es mag offensichtlich sein, aber es war trotzdem überraschend für mich, dass SET NAMES utf8 ist nicht kompatibel mit utf8mb4 Kodierung. Daher reichte es für einige Apps nicht aus, die Tabellen-/Spaltencodierung zu ändern. Ich musste die Codierung in der App-Konfiguration ändern.

Redmine (Ruby, ROR)

Im config/database.yml:

production:
  adapter: mysql2
  database: redmine
  Host: localhost
  username: redmine
  password: passowrd
  encoding: utf8mb4

Custom Yii application (PHP)

Im config/db.php:

return [
    'class' => yii\db\Connection::class,
    'dsn' => 'mysql:Host=localhost;dbname=yii',
    'username' => 'yii',
    'password' => 'password',
    'charset' => 'utf8mb4',
],

Wenn Sie haben utf8mb4 Stellen Sie als Spalten-/Tabellencodierung sicher, dass Sie in Ihrer Anwendung den korrekten Zeichensatz für die DB-Verbindung konfiguriert haben, und erhalten weiterhin solche Fehler.

5
rob006

Laut der Anweisung create table lautet der Standardzeichensatz der Tabelle bereits utf8mb4. Es scheint, dass Sie einen falschen Verbindungszeichensatz haben.

Legen Sie in Java die Datenquellen-URL wie folgt fest: jdbc: mysql: //127.0.0.1: 3306/testdb? UseUnicode = true & characterEncoding = utf-8.

"? useUnicode = true & characterEncoding = utf-8" ist für die Verwendung von utf8mb4 erforderlich.

Es funktioniert für meine Anwendung.

3
Shine Huang

FÜR SQLALCHEMIE UND PYTHON

Die für Unicode verwendete Codierung war traditionell "utf8". Ab MySQL-Version 5.5.3 wurde jedoch eine neue MySQL-spezifische Codierung "utf8mb4" eingeführt. Ab MySQL 8.0 wird vom Server eine Warnung ausgegeben, wenn in serverseitigen Anweisungen "plain utf8" angegeben und durch "ersetzt" wird utf8mb3. Der Grund für diese neue Codierung liegt in der Tatsache, dass MySQLs Legacy-Utf-8-Codierung nur Codepunkte mit bis zu drei Bytes anstelle von vier unterstützt. Wenn Sie mit einer MySQL-Datenbank kommunizieren, die Codepunkte mit einer Größe von mehr als drei Bytes enthält, wird dieser neue Zeichensatz daher bevorzugt, wenn er sowohl von der Datenbank als auch vom Client-DBAPI unterstützt wird.

e = create_engine(
    "mysql+pymysql://scott:[email protected]/test?charset=utf8mb4")
All modern DBAPIs should support the utf8mb4 charset.

Linkbeschreibung hier eingeben

0
Nick Po