utf8mb4_unicode_ci utf8mb4_general_ci utf8_unicode_ci unicode_ci general php mysql utf-8 character-encoding

php - utf8mb4_general_ci - utf8mb4 vs utf8_unicode_ci



utf8mb4_unicode_ci vs utf8mb4_bin (1)

Así que primero veamos si lo hago bien:

Un conjunto de caracteres es un conjunto de símbolos y codificaciones. Una intercalación es un conjunto de reglas para comparar caracteres en un conjunto de caracteres.

Debería usar utf8mb4 porque mysql utf8 es un fraude, de hasta 3 bytes y no el verdadero juego de caracteres de utf8 en PHP, por ejemplo.

Como tal, utf8mb4 es un conjunto de caracteres y utf8mb4_unicode_ci / utf8mb4_bin son 2 de sus muchas diferentes colaciones disponibles.

utf8_unicode_ci hace una comparación que no distingue entre mayúsculas y minúsculas y otras comparaciones especiales (escuché que confunde con todos los acentos en francés, por ejemplo). utf8_bin distingue entre mayúsculas y minúsculas porque compara los valores binarios del carácter.

Ahora las preguntas:

  1. Si, por ejemplo, quiero permitir nombres de inicio de sesión sensibles a mayúsculas y minúsculas utilizando utf8mb4_unicode_ci, tendré que hacer cosas como:

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

  2. Si, por ejemplo, quiero permitir una búsqueda que no distinga mayúsculas de minúsculas utilizando utf8mb4_bin, tendré que hacer cosas como:

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

  3. Entonces cual es mejor ? ¿Qué pasa con las cosas malas que escucho sobre utf8_unicode_ci y los acentos / otros caracteres especiales?

Gracias :)


¿Has "hecho las cosas bien"? Sí, excepto que creo que los acentos franceses se comparan "correctamente" en utf8mb4_unicode_520_ci.

Sus dos SELECTs harán un escaneo completo de la tabla, por lo tanto serán ineficientes. La razón es que está anulando la intercalación (para # 1) u ocultando la columna en una función ( LOWER , para # 2) o usando un comodín inicial ( LIKE %... ).

Si desea que sea eficiente, declare que el name sea COLLATION utf8mb4_bin y simplemente haga WHERE name = ...

¿Crees que algunas de estas equivalencias y ordenamientos son "incorrectos" para el francés?

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 Þ=þ µ

Más utf8 colaciones .

La versión "520" (más nueva) al no tratar Æ , Ð , Ł y Ø como ''letras'' separadas, y quizás otras cosas.