2010-11-23 15 views
6

Existe-t-il un moyen de spécifier des littéraux de caractères Unicode dans MySQL?Littéraux de caractères Unicode (hexadécimal) dans MySQL

Je veux remplacer un caractère Unicode avec un caractère Ascii, quelque chose comme ce qui suit:

Update MyTbl Set MyFld = Replace(MyFld, "ẏ", "y") 

Mais j'utilise même des personnages plus obscurs qui ne sont pas disponibles dans la plupart des polices, donc je veux être capable d'utiliser caractères Unicode littéraux, quelque chose comme

Update MyTbl Set MyFld = Replace(MyFld, "\u1e8f", "y") 

Cette instruction SQL est en cours à partir d'un script invoquaient PHP - la première forme est non seulement illisible, mais il ne fonctionne pas vraiment!

Répondre

3

Merci pour vos suggestions, mais je pense que le problème était plus en arrière dans le système.

Il y a beaucoup de niveaux pour en découdre, mais pour autant que je peux dire, (sur ce serveur au moins) la commande

set names utf8 

rend le travail de manutention utf-8 correctement, alors que

set character set utf8 

n'en a pas.

Dans mon environnement, ils sont appelés à partir de PHP en utilisant PDO, quelle différence cela peut faire.

Merci quand même!

0

La syntaxe de la chaîne MySQL est spécifiée here, comme vous pouvez le voir, il n'y a aucune disposition pour les séquences d'échappement numériques.

Cependant, comme vous intégrez le SQL dans PHP, vous pouvez calculer les bons octets en PHP. Assurez-vous que les octets que vous mettez dans le SQL correspondent réellement à votre client character set.

2

Vous pouvez utiliser les fonctions hex et unhex, .:

par exemple
update mytable set myfield = unhex(replace(hex(myfield),'C383','C3')) 
0

Il y a aussi le char function qui permettra ce que vous vouliez (fournir des numéros d'octets et un nom de jeu de caractères) et obtenir un caractère.

3

Vous pouvez spécifier hexadecimal literals (ou même binary literals) en utilisant 0x, x'' ou X'':

select 0xC2A2; 
select x'C2A2'; 
select X'C2A2'; 

Mais être conscient que le type de retour est une chaîne binaire, donc chaque octet est considéré comme un personnage.Vous pouvez vérifier cela avec char_length:

select char_length(0xC2A2) 

2

Si vous voulez UTF-8 chaînes à la place, vous devez utiliser convert:

select convert(0xC2A2 using utf8mb4) 

Et nous pouvons voir que C2 A2 est considéré 1 caractère en UTF-8:

select char_length(convert(0xC2A2 using utf8mb4)) 

1


En outre, vous n'avez pas à vous soucier des octets invalides parce que convert les supprime automatiquement:

select char_length(convert(0xC1A2 using utf8mb4)) 

0

Comme on peut le voir, la sortie est 0 car C1 A2 est une séquence d'octets UTF-8 invalide.

Questions connexes