MySQL Unicode-Literale
-
26-09-2019 - |
Frage
Ich mag einen Datensatz in MySQL einzufügen, die ein Nicht-ASCII-Unicode-Zeichen hat, aber ich bin auf einem Terminal, das ich nicht leicht Nicht-ASCII-Zeichen eingeben nicht lassen. Wie entkommen ich ein Unicode wörtliche in MySQL SQL-Syntax?
Lösung
Siehe auch: http://bugs.mysql.com/bug.php?id = 10199 (Bug # 10199: "für Stringliterale zulassen Unicode-Escape-Sequenz"). Diese Anfrage wurde "Open" seit 2005 Weitere Details in Worklog Aufgabe # 3529: Unicode Escape-Sequenzen .
Von https://web.archive.org/web/20091117221116/http://eng.kaching.com/2009/10/mysql-unicode-escape-sequences.html obwohl, können Sie das folgende Beispiel sehen, die tatsächlich zu funktionieren scheinen, aber erfordern, dass Sie die aktuelle Byte-für-Byte-UTF8-Codierung wissen:
Sie können auch die mit variabler Länge UTF-8-Darstellung verwenden (praktisch, wenn zum Beispiel das Kopieren von einem utf-8 URL-codierten Wert wie% E2% 80% 98).
mysql> select _utf8 x'E28098'; +---+ | ‘ | +---+
Andere Tipps
Diese gespeicherte Funktion bietet die Funktionalität von MySQL (scheinbar) fehlt, mit einem Weg, um einen wörtlichen Codepunkt in einen Charakter zu drehen, ohne wissen zu müssen, um bereits die UTF-8-Codierung.
Wenn VARCHAR(1)
scheint seltsam, da UTF-8-Zeichen in MySQL können lang bis 3 Bytes auf, denken Sie daran, die Größe von VARCHAR
ist Zeichen , nicht Bytes . Die Funktion gibt ein einzelnes UTF-8-codiertes Zeichen aus dem Eingangswert.
Für hexadezimale Literale, prepend 0x
.
DELIMITER $$
DROP FUNCTION IF EXISTS `utf8_char` $$
CREATE FUNCTION `utf8_char`(v smallint unsigned) RETURNS VARCHAR(1) CHARSET utf8
NO SQL
DETERMINISTIC
BEGIN
-- http://stackoverflow.com/questions/3632410/mysql-unicode-literals/30675371#30675371
RETURN CHAR(CASE
WHEN v <= 0x7F THEN v
WHEN v <= 0x7FF THEN 0xC080 | ((v >> 6) << 8) | (v & 0x3F)
WHEN v <= 0xFFFF THEN 0xE08080 | (((v >> 12) & 0x0F ) << 16) | (((v >> 6) & 0x3F ) << 8) | (v & 0x3F)
ELSE NULL END);
END $$
DELIMITER ;
Beispiel Ausgabe:
mysql> select utf8_char(8592) AS 'leftwards_arrow';
+-----------------+
| leftwards_arrow |
+-----------------+
| ← |
+-----------------+
1 row in set (0.00 sec)
mysql> select utf8_char(0x2192) AS 'rightwards_arrow_hex';
+----------------------+
| rightwards_arrow_hex |
+----------------------+
| → |
+----------------------+
1 row in set (0.00 sec)
Wenn das Ziel ist es, den Codepunkt anstelle der codierten Byte-Sequenz zu spezifizieren (dh 0x0F02
anstelle des UTF-8 0xE0BC82
für „?“), dann müssen Sie eine Codierung verwenden, bei dem der Codepunktwert passiert einfach zu sein, die codierte Bytefolge. Zum Beispiel, "0xE28098" ist der UTF-8-codierte Bytefolge für das " "-Zeichen (wie in dkamins Antwort ), der Codepunkt U + 2018. Allerdings ist 0x2018
sowohl der Codepunktwert für ‘
und die codierte Bytefolge für ucs2
/ utf16
(sie effektiv die gleiche Codierung für BMP Zeichen sind, aber ich ziehe „utf16“ zu verwenden, da es im Einklang mit „uTF-8“ und „UTF32“, konsequent in dem „utf“ Thema). Daraus folgt:
_utf16 0x2018
gibt den gleichen ‘
Charakter wie:
_utf8 0xE0BC82
Aber utf16
funktioniert nur für BMP-Zeichen (Codepunkte U + 0000 - U + FFFF) in Bezug auf den Codepunktwert angibt. Wenn Sie einen Ergänzungs Charakter wollen (durch den Codepunkt Angabe anstelle einer Sequenz spezifischen Codierung von Bytes), dann müssen Sie die utf32
Codierung verwenden. Nicht nur, dass _utf32 0x2018
Rückkehr ‘
, aber:
_utf32 0x1F47E
Rückgabe: ??
entweder auf UTF-8 oder UTF-16-Codierungen für die gleichen Zusatzzeichen verwenden würde die folgende benötigen:
_utf8mb4 0xF09F91BE
_utf16 0xD83DDC7E
Wenn Sie jedoch Probleme haben, diese Zugabe zu einer Zeichenfolge, die bereits UTF-8 ist, dann müssen Sie diese in utf8
(oder in utf8mb4
wenn zusätzliche Zeichen als utf8
Codierung / charset erstellen, kann nur BMP Zeichen verarbeiten) konvertieren:
CONVERT(_utf32 0x1F47E USING utf8mb4)
Oder am Beispiel Zeichen von Michael - sqlbot Antwort :
CONVERT(_utf32 0x2192 USING utf8)
gibt einen →
. Daher ist eine benutzerdefinierte Funktion nicht benötigt, um ein UTF-8-codierten Zeichen von seinem Codepunkt zu erzeugen (zumindest nicht ab MySQL 8.0). Hier ist eine Testabfrage
SELECT _utf32 0x1F47E AS "Supplementary Character in utf32",
CONVERT(_utf32 0x1F47E USING utf8mb4) AS "Supplementary Character in utf8mb4",
CHARSET(CONVERT(_utf32 0x1F47E USING utf8mb4)) AS "Proof",
"---" AS "---",
_utf32 0x2192 AS "BMP character in utf32",
CONVERT(_utf32 0x2192 USING utf8) AS "BMP character in utf8",
CHARSET(CONVERT(_utf32 0x2192 USING utf8)) AS "Proof";
Und Sie können es sehen, arbeiten an db <> Geige (vielleicht auch nicht Arbeit in pre-8.0 MySQL).
Für weitere Informationen zu diesen Optionen und Unicode-Escape-Sequenzen, die für andere Sprachen und Plattformen finden Sie in meinem Beitrag: