sql >> Base de Datos >  >> RDS >> Mysql

UTF-8 hasta el final

Almacenamiento de datos :

  • Especifique el utf8mb4 conjunto de caracteres en todas las tablas y columnas de texto en su base de datos. Esto hace que MySQL almacene y recupere físicamente valores codificados de forma nativa en UTF-8. Tenga en cuenta que MySQL usará implícitamente utf8mb4 codificación si un utf8mb4_* se especifica la intercalación (sin ningún juego de caracteres explícito).

  • En versiones anteriores de MySQL (<5.5.3), lamentablemente se verá obligado a usar simplemente utf8 , que solo admite un subconjunto de caracteres Unicode. Desearía estar bromeando.

Acceso a datos :

  • En el código de su aplicación (por ejemplo, PHP), en cualquier método de acceso a la base de datos que utilice, deberá configurar el juego de caracteres de conexión en utf8mb4 . De esta forma, MySQL no convierte su UTF-8 nativo cuando transfiere datos a su aplicación y viceversa.

  • Algunos controladores proporcionan su propio mecanismo para configurar el conjunto de caracteres de la conexión, que actualiza su propio estado interno e informa a MySQL sobre la codificación que se utilizará en la conexión; este suele ser el enfoque preferido. En PHP:

    • Si está utilizando el PDO capa de abstracción con PHP ≥ 5.3.6, puede especificar charset en el DSN :

       $dbh = new PDO('mysql:charset=utf8mb4');
      
    • Si está utilizando mysqli , puede llamar a set_charset() :

        $mysqli->set_charset('utf8mb4');       // object oriented style
        mysqli_set_charset($link, 'utf8mb4');  // procedural style
      
    • Si está atascado con el simple mysql pero está ejecutando PHP ≥ 5.2.3, puede llamar a mysql_set_charset .

  • Si el controlador no proporciona su propio mecanismo para configurar el conjunto de caracteres de la conexión, es posible que deba emitir una consulta para decirle a MySQL cómo su aplicación espera que se codifiquen los datos de la conexión:ESTABLECER NOMBRES 'utf8mb4' .

  • La misma consideración con respecto a utf8mb4 /utf8 se aplica como arriba.

Salida :

  • Si su aplicación transmite texto a otros sistemas, también deberán ser informados de la codificación de caracteres. Con las aplicaciones web, el navegador debe estar informado de la codificación en la que se envían los datos (a través de encabezados de respuesta HTTP o metadatos HTML ).

  • En PHP, puede usar el default_charset opción php.ini, o emita manualmente el Content-Type mismo encabezado MIME, que es más trabajo pero tiene el mismo efecto.

  • Al codificar la salida usando json_encode() , agregue JSON_UNESCAPED_UNICODE como segundo parámetro.

Entrada :

  • Desafortunadamente, debe verificar que cada cadena recibida sea UTF-8 válida antes de intentar almacenarla o usarla en cualquier lugar. PHP mb_check_encoding() hace el truco, pero tienes que usarlo religiosamente. Realmente no hay forma de evitar esto, ya que los clientes malintencionados pueden enviar datos en la codificación que deseen, y no he encontrado ningún truco para que PHP lo haga por usted de manera confiable.

  • De mi lectura de las actuales especificaciones HTML , las siguientes subviñetas ya no son necesarias ni válidas para el HTML moderno. Tengo entendido que los navegadores trabajarán y enviarán datos en el conjunto de caracteres especificado para el documento. Sin embargo, si apunta a versiones anteriores de HTML (XHTML, HTML4, etc.), estos puntos pueden seguir siendo útiles:

    • Solo para HTML anterior a HTML5 :desea que todos los datos que le envíen los navegadores estén en UTF-8. Desafortunadamente, si sigue, la única forma de hacerlo de manera confiable es agregar accept-charset atribuye a todos tus
      etiquetas: .
    • Solo para HTML anterior a HTML5 :tenga en cuenta que la especificación HTML de W3C dice que los clientes "deberían" enviar formularios de vuelta al servidor de forma predeterminada en cualquier juego de caracteres que haya servido el servidor, pero aparentemente esto es solo una recomendación, de ahí la necesidad de ser explícito en cada etiqueta.

Otras consideraciones sobre el código :

  • Obviamente, todos los archivos que servirá (PHP, HTML, JavaScript, etc.) deben estar codificados en UTF-8 válido.

  • Debe asegurarse de que cada vez que procese una cadena UTF-8, lo haga de manera segura. Esta es, desafortunadamente, la parte difícil. Probablemente querrá hacer un uso extensivo de mbstring extensión.

  • Las operaciones de cadenas integradas de PHP no por defecto UTF-8 seguro. Hay algunas cosas que puede hacer con seguridad con las operaciones normales de cadenas PHP (como la concatenación), pero para la mayoría de las cosas debe usar el equivalente mbstring función.

  • Para saber lo que está haciendo (léase:no estropearlo), realmente necesita conocer UTF-8 y cómo funciona en el nivel más bajo posible. Consulte cualquiera de los enlaces de utf8.com para obtener algunos buenos recursos para aprender todo lo que necesita saber.