Sonderzeichen die ich in die Datenbank eintrage werden zu Fragezeichen?
Hallo :),
Wenn ich z.B. diesen SQLBefehl in der Datenbank eingebe:
INSERT INTO nachrichten
(Text
) VALUES (' Willkommen 🙂 ');
steht nachher immer im Textfeld 'Text':
Willkommen ?
Woran liegt das? Das hatte in einer anderen Datenbank wunderbar funktioniert, aber jetzt nicht mehr... Im Internet habe ich gefunden das man alles auf UTF-8 stellen muss... habe ich gemacht, funktioniert trotzdem nicht. Nur Umlaute und "normale" Sonderzeichen funktionieren.
WIe kann ich das Problem beheben? Ich meine wenn es schonmal funktioniert hatte muss es doch irgendwie gehen?
PS: Die Datenbank und zugehörige Tabellen wurde importiert in MySQL
Danke im Voraus :)
5 Antworten
Welchen Zeichensatz nutzt du bei dieser Tabelle? Du musst einen Zeichensatz wählen, der solche Zeichen enthält.
Beispielsweise:
ALTER TABLE nachrichten CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
Encoding kommt von Character Encoding = Zeichenkodierung. Diese legt den Zeichensatz fest. Hat für mich in diesem Zusammenhang die gleiche Bedeutung.
Das setzt die Zeichenkodierung deiner Tabelle auf eine die auch Emojis abspeichern kann. (Oben ist nur ein Beispiel für den Table 'nachrichten')
Du musst also die richtige Kodierung und Kollation setzen.
Ja aber es bringt nichts das sind immer noch Fragezeichen :/ Was habe ich falsch gemacht?
Zeichensätze können an verschiedenen stellen konvertiert werden, ist es durchgehend UTF8?
ja ich glaube schon ich wüsste nicht wo man es sonst noch umstellen könnte
1) Database: Change Database default collation as
utf8mb4
.
2) Table: Change table collation as
CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
.
Query:
ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
3) Code:
INSERT INTO tablename (column1, column2, column3, column4, column5, column6, column7)
VALUES ('273', '3', 'Hdhdhdh😜😀😊😃hzhzhzzhjzj 我爱你 ❌', 49, 1, '2016-09-13 08:02:29', '2016-09-13 08:02:29')
4) Set
utf8mb4
in database connection:
$database_connection = new mysqli($server, $user, $password, $database_name);
$database_connection->set_charset('utf8mb4');
das unten ist aber php und ich habe den Befehel IN Mysql ausgeführt
Weil es bei PHP auch nicht ging
ist utf8mb4 mit utf-8 von php kompartiebel?
und was genau ist der Unterschied?
Am Encoding wird bei dem Prozess an mehreren Stellen gedreht:
- in dem Werkzeug, mit dem man in die Datenbank schreibt
- in der Datenbank selbst - manche Datenbanken unterstützen nicht alle Zeichen (auf DB2 zB würde das mit dem Emoji schon deshalb nicht gehen).
- in dem Werkzeug, mit dem man den Datenbankinhalt wieder anzeigt
Wenn mit MySQL etwas nicht geht, das mit einer anderen DB ging (mit welcher?), dann tippe ich mal auf Punkt 2.
DB2? Woran sehen ich denn den Typ (Ich weiß ich habe nicht so viel Ahnung
zu 1. ich habe aber auch direkt in mysql den Befehl ausgeführt
MySQL ist eine kostenlose Datenbank für kleine Anwendungen. DB2 ist eine Datenbank von IBM für sehr große Anwendungen. Andere bekannte Datenbanken sind MSSQL, Oracle, H2 ... Mit welcher Datenbank man arbeitet, weiß man, weil man sie installiert hat.
Ich habe sie aber nicht installiert ^^
aufjedenfall sieht phpmyadmin aus wie jede andere Datenbank die ich kenne
phpmyadmin ist keine Datenbank, es ist eine Administrationsoberfläche für eine Datenbank, nämlich für MySQL.
Aber dann müsste es doch eigentlich gehen oder nicht?
In der ursprünglichen Frage stand der Satz "Das hatte in einer anderen Datenbank wunderbar funktioniert" - und meine Frage in welcher das funktioniert hatte ist noch nicht beantwortet. Was genau sind die beiden Konfigurationen, die hier verglichen werden, die die funktioniert vs die die nicht funktioniert?
Die Datenbank war auch eine MYsql phpmadmin datenbank...
auf einer anderen habe ich es auch getestet da wird der Text sobald ein solches Zeichen auftaucht einfach abgeschnitten ab diesem Zeichen :/
Das kann doch nicht sein das die Datenbanj jedesmal was anderes macht?
das finde ich echt sehr sehr seltsam
wer immer diese Szenarien installiert hat, sollte solche Fragen dazu beantworten können. Wenn das irgendwo im Web ist, dann sollte es dazu Support geben. Emojis brauchen in UTF-8-Codierung die maximale Länge von 4-Byte, vielleicht wird das nicht überall unterstützt (auch chinesische Schriftzeichen wären dann ein Problem).
ja der der es installiert hat hat noch weniger Ahnung als ich :D ehm wie genau kann man das einstellen/ändern
ich kenne MySQL nicht im Detail und phpadmin gar nicht (ich habe immer alle Datenbanken mit Squirrel bedient). Da hilft nur noch Recherche im Internet.
ok und wonach suche ich ambesten? was genau meinst du mit maximale länge von 4 byte? von was?
wenn ich das jetzt richtig verstanden habe löse ich das Problem theorethisch wenn ich utf32 oder utf16 nehme?
normalerweise können auch 4-Byte Zeichen mit einer Gruppe von 4 UTF-8 dargestellt werden.
Den Typ kann man nicht immer sehen bzw. erkennen, welcher Typ notwendig ist bestimmt die Anwendung. Die Zahl 4711 kann auch Text sein, wenn es als Markenzeichen verwendet wird. Das bestimmt dann der Benutzer, wie er es haben will. Ein Kalenderdatum wie z.B '20.10.2019' sollte date als Typ haben, muss aber nicht, weil es auch als Text durch geht. Allerdings kann man es nicht mehr korrekt nach Datum sortieren und auch keine Datumsberechnungen damit machen. Es wird dann eben wie Text behandelt. Die unterschiedlichen Typen sind notwendig, weil diese in der Datenbank unterschiedlich behandelt werden. Zu einem Text kann man keine Zahl addieren, auch wenn der Text wie eine Zahl aussieht.
Achso also muss man diesen Typ ändern? In anderen Datenbanken hat es aber trotz des Typs funktioniert...
Die andere Datenbank hatte diesen Typ im Angebot, deshalb hat das dort funktioniert. Die Datenbank konnte diesen Typ auch erkennen, da er sich vonanderen Zeichen unterscheidet. Der DB2 ist ein rein professionelles Datenbanksystem und da sind Emojis reine Spielerei. Für deren Anwender sind sie nicht erforderlich.
ich habe das Problem nun gelöst indem ich den Datenbank Zeichensatz auf utf8_mb4_bin gestellt habe
ich verstehe nicht ganz, Zeichensatz? ich dachte Encoding?