Je veux insérer un enregistrement dans MySQL qui a un caractère Unicode non ASCII, mais je suis sur un terminal qui ne me laisse pas taper facilement des caractères non-ASCII. Comment échapper un littéral Unicode dans la syntaxe SQL de MySQL?MySQL littéraux unicode
Répondre
Voir: http://bugs.mysql.com/bug.php?id=10199 (Bug # 10199: "Autoriser séquence d'échappement Unicode pour les littéraux de chaîne.") Cette demande a été "ouverte" depuis 2005.
De http://eng.kaching.com/2009/10/mysql-unicode-escape-sequences.html que vous pouvez voir l'exemple suivant , qui semble effectivement fonctionner, mais vous oblige à connaître le codage UTF8 byte by byte:
"Vous pouvez également utiliser la représentation UTF-8 de longueur variable (pratique lorsque, par exemple, la copie d'un valeur encodée par l'URL utf-8 comme% E2% 80% 98). "
mysql> select _utf8 x'E28098';
+---+
| ‘ |
+---+
Cette fonction stockée fournit la fonctionnalité MySQL est (apparemment) manque, avec un moyen de transformer un point de code littéral dans un personnage sans avoir à connaître déjà l'encodage UTF-8.
Si VARCHAR(1)
semble étrange, car les caractères UTF8 dans MySQL peuvent être jusqu'à 3 octets, rappelez-vous la taille des caractères VARCHAR
est , pas octets. La fonction renvoie un seul caractère codé en UTF-8 à partir de la valeur d'entrée. Pour les littéraux hexadécimaux, ajoutez .
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 ;
Exemple de sortie:
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)
Je reçois un peu au-delà irrité par la stupidité aléatoire de disque par le bas-électeurs qui, sans commentaire, les réponses vers le bas-vote qui sont manifestement correctes et travaille évidemment. Si vous n'êtes pas suffisamment qualifié pour comprendre la réponse et expliquer votre objection, veuillez cesser de le montrer, au moins. –
fonctionne bien, merci –