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?

War es hilfreich?

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:

scroll top