Domanda

C'è un modo per specificare letterali di caratteri Unicode in MySQL?

Voglio sostituire un carattere Unicode con un carattere ASCII, qualcosa di simile al seguente:

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

Ma io sto usando anche personaggi più oscuri che non sono disponibili nella maggior parte dei tipi di carattere, quindi voglio essere in grado di utilizzare letterali di caratteri Unicode, qualcosa come

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

Questa istruzione SQL viene invocato da uno script PHP - la prima forma non solo è illeggibile, ma in realtà non lavoro

È stato utile?

Soluzione 2

Grazie per i vostri suggerimenti, ma credo che il problema era più indietro nel sistema.

C'è un sacco di livelli di disfare, ma per quanto ne so, (su questo server almeno) il comando

set names utf8

fa funzionare movimentazione utf-8 correttamente, mentre

set character set utf8

che non funziona.

Nel mio ambiente, questi vengono chiamati da PHP utilizzando DOP, per quello che la differenza che possono rendere.

Grazie comunque!

Altri suggerimenti

È possibile specificare esadecimale letterali (o anche binario letterali ) utilizzando 0x, x'', o X'':

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

Ma essere consapevoli che il tipo di ritorno è una stringa binaria, così ogni byte è considerato un personaggio. Lo si può verificare con char_length:

select char_length(0xC2A2)
  

2

Se desideri UTF-8 stringhe, invece, è necessario utilizzare < a href = "http://dev.mysql.com/doc/refman/5.7/en/charset-convert.html" rel = "noreferrer"> convert :

select convert(0xC2A2 using utf8mb4)

E possiamo vedere che C2 A2 è considerato 1 carattere in UTF-8:

select char_length(convert(0xC2A2 using utf8mb4))
  

1


Inoltre, non si deve preoccupare di byte non validi perché convert rimuoverà automaticamente:

select char_length(convert(0xC1A2 using utf8mb4))
  

0

Come si può vedere, l'uscita è 0 perché C1 A2 è un valido UTF-8 sequenza di byte.

È possibile utilizzare le hex e unhex funzioni , ad esempio:

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

La sintassi della stringa di MySQL è specificata qui , come si può vedere, non v'è alcuna disposizione per le sequenze di escape numerici.

Tuttavia, come si intende inserire l'SQL in PHP, è possibile calcolare i byte a destra in PHP. Assicurarsi che i byte che mettete nel SQL realmente abbinare il vostro set di caratteri client .

C'è anche il char funzione che la volontà permettono quello che si voleva (che fornisce i numeri di byte e un nome di set di caratteri) e ottenere un char.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top