2012-06-12 15 views
5

So che ci sono molte domande simili su SF, ma penso che il mio sia abbastanza diverso da giustificare una nuova domanda. Ho una tabella che ha una singola colonna come utf8 con utf8_unicode_ci. Ha anche una chiave univoca in questa colonna insieme a un'altra colonna che contrassegna un codice di lingua. I dati nella colonna sono in molti script diversi (in latino con vari accenti, cinese e russo, tra gli altri).MySQL Case Insensitive ma Accent Sensitive UTF8 Chiave unica

Il problema è che a volte voglio entrare in due parole con significati diversi che differiscono solo per un segno diacritico (cioè spagnolo ano vs año). Dal momento che utf8_unicode_ci è al contempo caso e insensibile agli accenti, pensa che siano uguali e mi consenta solo di inserirne uno. Questo fa schifo. Idealmente, mi piacerebbe semplicemente passare l'intera colonna su alcune regole di confronto che sono case INsensitive ma sensibili agli accenti, ma ciò non sembra esistere. Un sacco di cose diverse usa questa colonna, quindi preferirei non modificare le regole di confronto predefinite della colonna in utf8_bin per timore di fare confusione con la distinzione tra maiuscole e minuscole.

Quindi, tutto ciò detto, ho bisogno di una soluzione che non influenzi la distinzione tra maiuscole e minuscole predefinita nelle molte query esistenti che colpiscono questa colonna, ma mi consentirà di aggiungere parole che differiscono solo da un segno diacritico. Idee? Passerò solo il vincolo di chiave univoco a utf8_bin se necessario, ma preferirei non farlo perché non voglio mai due cose nella tabella che differiscono solo caso per caso.

risposta

0

L'unica cosa che riesco a pensare (senza trovare una collazione che si adatta alle tue esigenze) è di cambiare qualcosa al livello dell'applicazione (al di fuori di MySQL) che si occuperà della differenziazione.

Ad esempio, poiché non ti interessa il caso, puoi fare qualcosa a livello di codice per ridurre il caso di tutte le righe nel database. Quindi modifica le regole di confronto su utf8_bin.

Quindi è possibile, nell'applicazione, convertire tutto in minuscolo prima che entri nel database (suppongo che ciò non influenzi i caratteri diacritici). In questo modo, riceverai comunque degli errori se le persone tentassero di entrare in più casi, dovresti solo cambiare alcune righe di codice per le cose di precondizione che entrano nella tabella e non avrai il problema diacritico.

+1

Alcuni caratteri maiuscoli non hanno un equivalente in lettere minuscole. Alcuni hanno equivalenti minuscoli multipli. È un po 'un casino. –

0

Qui non è necessario reinventare lo pneumatico sgonfio (reinventare la ruota).

Ci sono due regole di confronto di lingua spagnola in MySQL:

utf8_spanish_ci (moderna spagnola) e utf8_spanish2_ci (tradizionale spagnola)

Questi conoscono la lingua abbastanza bene per sapere che N e n devono essere raccolte insieme , ma che Ñ e ñ sono lettere diverse tra N e O. In spagnolo, Ñ è in realtà una lettera diversa, non un accento.

Imposta le regole di confronto delle colonne su utf8_spanish_ci e tutto funzionerà nel modo desiderato.

+0

Grazie, ma come ho detto, non sono solo lo spagnolo di cui sono preoccupato. Ci sono cose in un sacco di lingue diverse. – Eli

+0

Hmm. Le persone che hanno immaginato le raccolte Unicode sono eccellenti linguisti. Se ci fosse una soluzione universale che ha fatto la cosa giusta per tutte le lingue di alfabeto romano, l'avrebbero implementata. Potrebbe essere necessario eseguire alcune query relative alla lingua, in base alla lingua dell'utente. È possibile inserire una clausola COLLATE in un'istruzione WHERE. –