2010-09-03 32 views
10

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

7

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'; 
+---+ 
| ‘ | 
+---+ 
0

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) 
+1

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. –

+0

fonctionne bien, merci –