2016-05-21 7 views
12

Also zuerst mal sehen, ob ich es richtig:utf8mb4_unicode_ci vs utf8mb4_bin

A charset eine Reihe von Symbolen und Kodierungen ist. Eine Kollatierung ist eine Reihe von Regeln zum Vergleichen von Zeichen in einem Zeichensatz.

Ich sollte utf8mb4 verwenden, weil mysql utf8 ist ein Betrug, bis zu 3 Bytes und nicht die wahre bis zu 4-Byte echte utf8 Zeichensatz in PHP zum Beispiel.

Als solcher ist utf8mb4 ein Zeichensatz und utf8mb4_unicode_ci/utf8mb4_bin sind 2 seiner vielen verschiedenen verfügbaren Kollationen.

utf8_unicode_ci Vergleiche Groß- und Kleinschreibung und andere spezielle Vergleiche (Ich habe gehört, dass es mit allen Akzenten in Französisch zum Beispiel versaut). utf8_bin unterscheidet zwischen Groß- und Kleinschreibung, da es die Binärwerte des Zeichens vergleicht.

Nun die Fragen:

1. Wenn zum Beispiel ich will Case-Sensitive-Login-Namen ermöglichen, mit utf8mb4_unicode_ci ich muss Dinge tun:

SELECT name FROM table WHERE BINARY name = 'MyNaMEiSFUlloFUPPERCases'; 

?

SELECT name FROM table WHERE LOWER(name) LIKE '%myname%' 

: Dinge tun, wie

2. Wenn zum Beispiel möchte ich Case-insensitive Suche Ich werde mit utf8mb4_bin ermöglichen?

3. Also welches ist besser? Was ist mit den schlechten Dingen, die ich über utf8_unicode_ci und die Akzente/andere Sonderzeichen höre?

Danke :)

+0

Um volle Kontrolle zu haben, denke ich, dass ich bei der binären und dann benutzerdefinierten Regex bleiben werde, wie schlechter ist es leistungsmäßig? – shrimpdrake

+0

Wenn Sie möchten, dass die Groß- und Kleinschreibung nicht berücksichtigt wird, wenden Sie sich bitte an http://bugs.mysql.com. –

Antwort

3

Haben Sie die Dinge richtig gemacht? Ja, außer dass ich denke, dass französische Akzente in utf8mb4_unicode_520_ci "korrekt" verglichen werden.

Ihre beiden SELECTs werden beide zu einem vollständigen Tabellenscan, dadurch ineffizient sein. Der Grund ist, dass Sie die Sortierung überschreiben (für # 1) oder die Spalte in einer Funktion (LOWER, für # 2) oder mit einem führenden Platzhalter (LIKE %...) ausblenden.

Wenn Sie möchten, dass es effizient ist, deklarieren Sie name als COLLATION utf8mb4_bin und tun Sie einfach WHERE name = ....

Denken Sie, dass einige dieser Äquivalenzen und Sortierungen für Französisch "falsch" sind?

A=a=ª=À=Á=Â=Ã=Ä=Å=à=á=â=ã=ä=å=Ā=ā=Ą=ą Aa ae=Æ=æ az B=b C=c=Ç=ç=Ć=ć=Č=č ch cz 
D=d=Ð=ð=Ď=ď dz E=e=È=É=Ê=Ë=è=é=ê=ë=Ē=ē=Ĕ=ĕ=Ė=ė=Ę=ę=Ě=ě F=f fz ƒ G=g=Ğ=ğ=Ģ=ģ 
gz H=h hz I=i=Ì=Í=Î=Ï=ì=í=î=ï=Ī=ī=Į=į=İ ij=ij iz ı J=j K=k=Ķ=ķ 
L=l=Ĺ=ĺ=Ļ=ļ=Ł=ł lj=LJ=Lj=lj ll lz M=m N=n=Ñ=ñ=Ń=ń=Ņ=ņ=Ň=ň nz 
O=o=º=Ò=Ó=Ô=Õ=Ö=Ø=ò=ó=ô=õ=ö=ø oe=Œ=œ oz P=p Q=q R=r=Ř=ř S=s=Ś=ś=Ş=ş=Š=š sh 
ss=ß sz T=t=Ť=ť TM=tm=™ tz U=u=Ù=Ú=Û=Ü=ù=ú=û=ü=Ū=ū=Ů=ů=Ų=ų ue uz V=v W=w X=x 
Y=y=Ý=ý=ÿ=Ÿ yz Z=z=Ź=ź=Ż=ż=Ž=ž zh zz Þ=þ µ 

More utf8 collations.

Die "520" (neuere) Version von nicht Æ Behandlung, Ð, Ł und Ø als separate 'Buchstaben', und vielleicht andere Dinge.