2013-07-08 8 views
11

Ho una tabella che utilizza le regole di confronto UTF-8- default.È possibile REPLACE() essere reso insensibile all'aspetto (é = e)?

Ho una colonna nella tabella chiamata company che ha questo valore Café Rouge

Quando faccio la domanda come:

select * from company where name ='Cafe Rouge' 

elenca questa azienda perché tratta il personaggio é =e ma quando uso il comando replace, non considera é come e.

Quindi,

select replace('Café Rouge','e','z') 

mi dà 'Café Rougz' cioè non sostituisce é con z.

Tutti i suggerimenti saranno apprezzabili

+2

Non sono sicuro se questo comportamento può essere modificato - 'REPLACE()' sta probabilmente facendo un confronto binario. Non è un'opzione semplicemente sostituire in modo esplicito 'é'? –

+1

perché è necessario sostituire "é"? probabilmente dovresti creare una nuova colonna 'company_normalized' dove puoi inserire un valore senza accento, troncato, con spazi normalizzati ecc. e quindi usare la variante normalizzata dove è utile, e il nome della compagnia reale altrimenti ... – sasjaq

+0

No :(non è un opzione perché potrebbero esserci molti altri caratteri che causeranno problemi. Inoltre, non posso modificare la mia tabella in regole di confronto binarie perché attualmente stiamo usando insensibilità alle maiuscole e minuscole e cambiandola in binario significherà cambiamenti in vari luoghi. – Jeets

risposta

0

Non credo che si può fare. Una scommessa più sicura sarebbe semplicemente fare una sostituzione su quei caratteri particolari.

1

Penso che tra le cose buone che si possono fare è mantenere una seconda colonna che mantiene queste stringhe in una forma normale; per esempio, questa colonna dovrebbe contenere "Cafe Rouge" piuttosto che "Café Rouge". È possibile proiettare i caratteri eccezionali nella query e quindi utilizzare la colonna del modulo normale per eseguire una query.

0

Perché non eseguire una selezione su café rouge e sostituire la colonna desiderata su ciascuno dei risultati restituiti?

1

Prova

SELECT REPLACE(CONVERT(name USING ascii), 'e', 'z') 

per convertire la colonna name in ASCII prima di fare la sostituzione.

+0

Ho pensato anche a questo, ma distruggerà i dati e quindi è probabile che sia inutile. Immagina "Café Üntenbärger" -> finirebbe con "Cafz Untenbarger' –

+1

Ma se vuoi usare una versione diversa dei dati" nome "per il confronto, puoi caricare la versione sostituita con un alias in modo che il" nome "originale sarebbe anche disponibile. Sarebbe utile se spiegassi la tua intenzione in modo più chiaro. –

+0

Ho capito il tuo punto, ma come faresti il ​​confronto in mySQL? Non penso sia possibile. (Avresti bisogno di un linguaggio di scripting per farlo.) –

0

È necessario eseguire questa operazione al di fuori di mySQL.

È possibile normalizzare la stringa all'interno mySQL come dimostrano @Christian utilizzando CONVERT(), ma che distruggerà tutti gli altri caratteri non-ASCII presenti:

Bürgercafé Römer 

finirebbe

Burgercafz Romer 

personaggi altri set di caratteri come il cirillico o il cinese verrebbero cancellati del tutto.

Il tuo miglior risultato è quello di sostituire in modo specifico tutti i caratteri che desideri sostituire.

replace('Café Rouge','e','z') 
replace('Café Rouge','é','z') 
replace('Café Rouge','è','z') 

Per fare esattamente ciò che si vuole, che avrebbe dovuto caricare ogni stringa in un linguaggio di programmazione come PHP.

Lì, si può fare come segue:

  1. Carica la stringa dal database; assicurarsi che sia UTF-8

  2. dividere la stringa nelle sue caratteri (essere consapevoli di caratteri multibyte - utilizzare mb_split())

  3. Passeggiata attraverso ogni carattere

  4. Normalizzare il carattere utilizzando iconv($character, "UTF-8", "ASCII//TRANSLIT");

  5. Se il carattere normalizzato risulta in e, è necessario sostituirlo nella stringa.

  6. Riportare la stringa modificata nel database.

Questo, tuttavia, sembra un sacco di guai per quello che sembra una piccola cosa. Sei proprio sicuro che sia necessario?

+0

Grazie, ci proverò. – Jeets