Wie kann ich Smileys in MySQL einfügen? (😊)

17

Ich bin auf MySQL 5.5.21 und versuche, das Smiley-Zeichen '\ xF0 \ x9F \ x98 \ x8A' einzufügen. Aber für das Leben von mir kann ich nicht herausfinden, wie es geht.

Nach verschiedenen Foren, die ich gelesen habe, ist es möglich. Aber wenn ich es versuche, werden die Daten einfach abgeschnitten.

mysql> INSERT INTO hour  (  `title`,   `content`,   `guid` ,  `published` , `lang` ,  `type` ,  
       `indegree` ,  `lon` ,  `lat` ,  `state` ,  `country` , `hour`  )   
       VALUES ( "title" ,  "content 😊  content" ,  "guid" ,  1,  1,   
                     "WEBLOG",  1,  1,  1,  "state" ,  "country" ,  1 );
Query OK, 1 row affected, 2 warnings (0.00 sec)

mysql> show warnings;
+---------+------+-------------------------------------------------------------------------------+
| Level   | Code | Message                                                                       |
+---------+------+-------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9F\x98\x8A  ...' for column 'content' at row 1 |
| Warning | 1265 | Data truncated for column 'published' at row 1                                |
+---------+------+-------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> select LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|           687302 |
+------------------+
1 row in set (0.00 sec)

mysql> select * from hour where id = 687302;
+--------+-------+----------+------+---------------------+
| id     | title | content  | guid | published           |
+--------+-------+----------+------+---------------------+
| 687302 | title | content  | guid | 0000-00-00 00:00:00 |
+--------+-------+----------+------+---------------------+
1 row in set (0.00 sec)

Aber meine Tabellendefinition ist wie folgt.

CREATE TABLE `hour` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) CHARACTER SET utf8 NOT NULL,
  `content` text CHARACTER SET utf8 NOT NULL,
  `guid` varchar(255) CHARACTER SET utf8 NOT NULL,
  `published` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `lang` tinyint(3) unsigned NOT NULL,
  `type` enum('WEBLOG','MICROBLOG') CHARACTER SET utf8 DEFAULT NULL,
  `indegree` int(4) unsigned NOT NULL,
  `lon` float DEFAULT NULL,
  `lat` float DEFAULT NULL,
  `state` varchar(50) CHARACTER SET utf8 DEFAULT '',
  `country` varchar(50) CHARACTER SET utf8 DEFAULT '',
  `hour` int(2) DEFAULT NULL,
  `gender` enum('MALE','FEMALE') CHARACTER SET utf8 DEFAULT NULL,
  `time_zone` varchar(45) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MEMORY AUTO_INCREMENT=687560 DEFAULT CHARSET=utf8mb4 KEY_BLOCK_SIZE=288 

Man kann sehen, dass ich CHARSET = utf8mb4 benutze. Behebt dies sicherlich Probleme bei der Verwendung von Mehrbyte-Zeichen?

Ok, also habe ich nicht bemerkt:

  `content` text CHARACTER SET utf8 NOT NULL,

Ich habe das jetzt korrigiert, bekomme aber immer noch irre Ergebnisse.

CREATE TABLE `hourtmp` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) CHARACTER SET utf8 NOT NULL,
  `content` text NOT NULL,
  `guid` varchar(255) CHARACTER SET utf8 NOT NULL,
  `published` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `lang` tinyint(3) unsigned NOT NULL,
  `type` enum('WEBLOG','MICROBLOG') CHARACTER SET utf8 DEFAULT NULL,
  `indegree` int(4) unsigned NOT NULL,
  `lon` float DEFAULT NULL,
  `lat` float DEFAULT NULL,
  `state` varchar(50) CHARACTER SET utf8 DEFAULT '',
  `country` varchar(50) CHARACTER SET utf8 DEFAULT '',
  `hour` int(2) DEFAULT NULL,
  `gender` enum('MALE','FEMALE') CHARACTER SET utf8 DEFAULT NULL,
  `time_zone` varchar(45) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MEMORY AUTO_INCREMENT=687563 DEFAULT CHARSET=utf8mb4 KEY_BLOCK_SIZE=288 |

 mysql> INSERT INTO hourtmp  (  `title`,   `content`,   `guid` ,  `published` , `lang` ,  `type` ,  `indegree` ,  
 `lon` ,  `lat` ,  `state` ,  `country` , `hour`  )   VALUES ( "title" ,  "content 😊  content" ,  
 "guid" ,  1,  1,   "WEBLOG",  1,  1,  1,  "state" ,  "country" ,  1 );
 Query OK, 1 row affected, 2 warnings (0.00 sec)

 mysql> show warnings;

 | Level   | Code | Message                                                                       |

 | Warning | 1366 | Incorrect string value: '\xF0\x9F\x98\x8A  ...' for column 'content' at row 1 |
 | Warning | 1265 | Data truncated for column 'published' at row 1                                |

 2 rows in set (0.00 sec)

 mysql> select * from hourtmp;
 +--------+-------+-----------------------+
 | id     | title | content               |
 +--------+-------+-----------------------+
 | 687560 | title | content ????  content |
 | 687561 | title | content ????  content |
 +--------+-------+-----------------------+
Bryan Hunt
quelle
Ich lösche jetzt alle Sonderzeichen in der Anwendungsebene aus, daher ist dies für mich kein großes Problem. Aber ich würde gerne wissen, ob es irgendwie möglich ist, die Daten in MySQL und aus MySQL heraus zu bekommen.
Bryan Hunt
Kein MySQL-Typ, aber können Sie nicht auch uft8für das TEXTFeld angeben
JNK
Haben Sie Set-Namen utf8mb4 ausgeführt? von Ihrem Kunden vor der Ausstellung der Beilage?
atxdba
JNK, das Textfeld verwendet den Tabellenstandard, in diesem Fall utf8mb4.
Bryan Hunt
atxdba. Danke für den Vorschlag, kommt immer noch als? Raus, was vermutlich korrupt bedeutet. Verdammt diese Emoticons / Decepticons! ;)
Bryan Hunt

Antworten:

21

Ich habe kürzlich eine ausführliche Anleitung zum Umstieg von MySQL utf8auf geschriebenutf8mb4 . Wenn Sie die dortigen Schritte ausführen, sollte alles korrekt funktionieren. Hier sind direkte Links zu jedem einzelnen Schritt des Prozesses:

Ich vermute, dass Ihr Problem durch das Befolgen von Schritt 5 gelöst werden kann. Ich hoffe, dies hilft!

Mathias Bynens
quelle
1
Habe diesen Job so verlassen, dass ich ihn nicht testen / verifizieren kann. Ich vermute jedoch, dass die Einstellung collation-server = utf8mb4_unicode_ci fehlte. Gutes Tutorial!
Bryan Hunt
Sehr schöner Mathias. Eine Erinnerung an Menschen, Ihre Client-Verbindungsdetails sind wichtig. Ich verwende das NPM-Modul mysqlvon Node und muss es charset: 'utf8mb4'in meinem createConnection()Aufruf angeben . Andernfalls ist das Einfügen von echten UTF8-Zeichen mit dem Incorrect string valueFehler immer noch fehlgeschlagen , auch nachdem die Tabelle und die Spalte in utf8mb4Zeichensatz und Sortierung konvertiert wurden . Ich gehe davon aus, dass die Details der Client-Konfigurationsebene in Schritt 5 einen ähnlichen Effekt haben werden.
Neek
2

Mach die folgenden Dinge:

  1. Stellen Sie den Datenbank-Zeichensatz auf utf8mb4 ein

  2. Setzen Sie den Zeichensatz der Spalte auf utf8mb4

wie unten Abfrage:

ALTER TABLE `comments` CHANGE `text` `text` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
Poonam Gupta
quelle
Reichen diese Schritte wirklich aus? Die akzeptierte Antwort hat viel mehr.
Colin 't Hart
Hängt davon ab, wo das Problem lag. Wenn das Problem auf der Datenbankseite lag, ist dies ausreichend. Es kann aber auch ein Client-Verbindungsproblem sein.
Spydon