Domanda

Ho creato una tabella e impostare le regole di confronto a utf8 in modo da essere in grado di aggiungere un indice univoco a un campo. Ora ho bisogno di fare ricerche di casi insensibili, ma quando ho eseguito alcune query con la parola chiave fascicolazione ed ho ottenuto:

mysql> select * from page where pageTitle="Something" Collate utf8_general_ci;
  

ERRORE 1253 (42000): COLLATION 'utf8_general_ci' non è valido per   CARATTERI SET 'latin1'

mysql> select * from page where pageTitle="Something" Collate latin1_general_ci;
  

ERRORE 1267 (HY000): Illegal mix di regole di confronto (utf8_bin, implicita) e   (Latin1_general_ci, esplicito) per il funzionamento '='

Sono abbastanza nuovo a SQL, quindi mi chiedevo se qualcuno potrebbe aiutare.

È stato utile?

Soluzione

Una stringa in MySQL ha un carattere set e un confronto . Utf8 è il set di caratteri, e utf8_bin è una delle sue regole di confronto. Per confrontare la stringa letterale a una colonna utf8, convertirlo in utf8 dal prefisso con la notazione _charset:

_utf8 'Something'

Ora un confronto è valido solo per alcuni set di caratteri. Il caso- sensibile di confronto per utf8 sembra essere utf8_bin, che è possibile specificare come:

_utf8 'Something' collate utf8_bin

Con queste conversioni, la query dovrebbe funzionare:

select * from page where pageTitle = _utf8 'Something' collate utf8_bin

Il prefisso _charset lavora con stringhe letterali. Per cambiare il set di caratteri di un campo, v'è Converti ... UTILIZZO. Questo è utile quando si desidera convertire il campo pageTitle ad un altro set di caratteri, come in:

select * from page 
where convert(pageTitle using latin1) collate latin1_general_cs = 'Something'

Per vedere il carattere e regole di confronto per una colonna denominata 'col' in una tabella chiamata 'TAB', provare:

select distinct collation(col), charset(col) from TAB

Un elenco di tutti i set di caratteri e collazioni può essere trovato con:

show character set
show collation

E tutte le regole di confronto validi per utf8 possono essere trovati con:

show collation where charset = 'utf8'

Altri suggerimenti

Inoltre si prega di notare che in caso di utilizzo di "Fascicola utf8_general_ci" o "Fascicola latin1_general_ci", vale a dire "forza" di fascicolazione - una tale conversione impedirà l'utilizzo di indici esistenti! Questo potrebbe essere un collo di bottiglia, in futuro, per le prestazioni.

Prova questo, il suo lavoro per me

SELECT * FROM WHERE users SUPERIORE (name) = UPPER ( 'Jose') COLLATE utf8_bin;

Posso chiedere perché si dispone di una necessità di cambiare le regole di confronto in modo esplicito quando si esegue un SELECT? Perché non solo la fascicolazione nel modo in cui si desidera recuperare i record quando ordinate?

Il problema si stanno avendo con le ricerche di essere case sensitive è che si ha un confronto binario. Cercate piuttosto di utilizzare le regole di confronto generale. Per ulteriori informazioni sulle maiuscole e minuscole e regole di confronto, guardate qui: Caso Sensibilità nella stringa Ricerche

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