Question

Y at-il un moyen de spécifier caractères Unicode littéraux 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 encore plus obscurs personnages qui ne sont pas disponibles dans la plupart des polices, donc je veux être en mesure d'utiliser caractères Unicode littéraux, quelque chose comme

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

Cette instruction SQL est appelé à partir d'un script PHP - la première forme est non seulement illisible, mais il ne fait pas le travail

Était-ce utile?

La solution 2

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 à découdre, mais pour autant que je peux dire, (sur ce serveur au moins) la commande

set names utf8

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

set character set utf8

ne fonctionne pas.

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

Merci quand même!

Autres conseils

Vous pouvez spécifier hexadécimal littéraux (ou même binaire littéraux ) 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 caractère. Vous pouvez vérifier cela avec char_length:

select char_length(0xC2A2)
  

2

Si vous voulez au lieu UTF-8 chaînes, vous devez utiliser < a href = "http://dev.mysql.com/doc/refman/5.7/en/charset-convert.html" rel = "noreferrer"> convert :

select convert(0xC2A2 using utf8mb4)

Et nous pouvons voir que C2 A2 est considéré comme 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 supprimera 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 UTF-8 octet invalide.

Vous pouvez utiliser les hex fonctions et unhex , par exemple:

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

La syntaxe de la chaîne de MySQL est spécifié , 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 en PHP, vous pouvez calculer les bons octets en PHP. Assurez-vous que vous le mettez dans octets SQL correspondre réellement votre jeu de caractères client .

Il y a aussi la fonction char volonté permettre ce que vous vouliez (fournir les numéros d'octets et un nom charset) et d'obtenir un omble chevalier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top