Chcę wstawić rekord do MySQL, który ma znak Unicode w standardzie innym niż ASCII, ale jestem na terminalu, który nie pozwala mi łatwo wpisywać znaków spoza ASCII. Jak mogę uniknąć literału Unicode w składni SQL MySQL?Literały w Unicode MySQL
Odpowiedz
Patrz: http://bugs.mysql.com/bug.php?id=10199 (Bug # 10199: "Pozwól sekwencję escape Unicode dla napisowych"). Wniosek ten został "Open" od 2005 roku
Od http://eng.kaching.com/2009/10/mysql-unicode-escape-sequences.html choć można zobaczyć następujący przykład , który faktycznie działa, ale wymaga znajomości aktualnego kodowania kodowania UTF8 bajt po bajcie:
"Można również użyć reprezentacji UTF-8 o zmiennej długości (wygodnej, gdy na przykład kopiowanie z utf-8 zakodowana wartość URL jak% E2% 80% 98). "
mysql> select _utf8 x'E28098';
+---+
| ‘ |
+---+
Funkcja ta zapewnia funkcjonalność przechowywane MySQL jest (podobno) brakuje, ze taki sposób, aby włączyć literalnego punktu kodeksu w charakterze bez konieczności już znać kodowanie UTF-8.
Jeśli VARCHAR(1)
wydaje się dziwne, ponieważ znaków UTF8 w MySQL może mieć długość do 3 bajtów, należy pamiętać o wielkości od VARCHAR
jest znaków, nie bajtów. Funkcja zwraca pojedynczy znak UTF-8 z wartości wejściowej.
W przypadku heksadecymalnych literałów należy dodać 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 ;
Przykâadowa:
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)
Dostaję trochę poza podrażniona przez losową głupoty drive-by, który bez komentarza, ODPOWIEDZI dół uznali, że są oczywiście poprawne and-down wyborców oczywiście praca. Jeśli nie masz wystarczających umiejętności, by zrozumieć odpowiedź i wyjaśnić swój sprzeciw, przynajmniej przestań to pokazywać. –
działa dobrze, dzięki –