2010-11-23 26 views
6

Gibt es eine Möglichkeit, Unicode-Zeichenliterale in MySQL anzugeben?Unicode (hexadezimale) Zeichenliterale in MySQL

Ich möchte ein Unicode-Zeichen mit einem ASCII-Zeichen, so etwas wie die folgenden ersetzen:

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

Aber ich bin mit noch unverständliche Zeichen, die in den meisten Schriftarten nicht verfügbar sind, so will ich sein Lage Unicode Zeichenliterale zu verwenden, so etwas wie

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

Diese SQL-Anweisung aus einem PHP-Skript aufgerufen wird - die erste Form nicht nur lesbar ist, aber es funktioniert nicht wirklich!

Antwort

3

Vielen Dank für Ihre Anregungen, aber ich denke, das Problem weiter hinten im System war.

Es gibt eine Menge von Ebenen den Befehl unpick, aber soweit ich das beurteilen kann, (auf diesem Server mindestens)

set names utf8 

macht die utf-8 Handhabung richtig funktioniert, während

set character set utf8 

nicht.

In meiner Umgebung werden diese aus PHP mit PDO aufgerufen, was für einen Unterschied das macht.

Danke trotzdem!

0

Die MySQL-Zeichenkettensyntax ist here, wie Sie sehen können, gibt es keine Vorkehrungen für numerische Escape-Sequenzen.

Da Sie jedoch das SQL in PHP einbetten, können Sie die richtigen Bytes in PHP berechnen. Stellen Sie sicher, dass die Bytes, die Sie in SQL eingeben, tatsächlich mit Ihrer client character set übereinstimmen.

2

können Sie die hex und unhex Funktionen verwenden, z.B .:

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

Es gibt auch die char function, die erlaubt, was Sie wollten (Bereitstellung von Byte-Nummern und einem Zeichensatz-Namen) und erhalten ein Zeichen.

3

können Sie angeben hexadecimal literals (oder sogar binary literals) mit 0x, x'' oder X'':

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

Aber bewusst sein, dass der Rückgabetyp ein Binär-String ist, so dass jeder und jedes Byte eines betrachtet Charakter.Sie können dies mit char_length überprüfen:

select char_length(0xC2A2) 

2

Wenn Sie UTF-8 Strings wollen stattdessen, müssen Sie convert verwenden: siehe

select convert(0xC2A2 using utf8mb4) 

Und wir können das C2 A2 ist als 1 Zeichen in UTF-8 betrachtet:

select char_length(convert(0xC2A2 using utf8mb4)) 

1


Auch Sie müssen nicht über ungültige Bytes Sorgen, weil convert sie automatisch entfernen wird:

select char_length(convert(0xC1A2 using utf8mb4)) 

0

Wie zu sehen ist, ist der Ausgang 0, weil C1 A2 eine ungültige UTF-8-Byte-Sequenz ist.