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

MySQL y PHP:UTF-8 con caracteres cirílicos

Estás mezclando API aquí, mysql_* y mysqli_* no se mezcla Deberías quedarte con mysqli_ (como parece que eres de todos modos), como mysql_* Las funciones están obsoletas y eliminadas por completo en PHP7.

Su problema real es un problema de juego de caracteres en alguna parte. Aquí hay algunos consejos que pueden ayudarlo a obtener el conjunto de caracteres adecuado para su aplicación. Esto cubre la mayoría de los problemas generales que uno puede enfrentar al desarrollar una aplicación PHP/MySQL.

  • TODOS los atributos en toda su aplicación deben establecerse en UTF-8
  • Guarde el documento como UTF-8 sin BOM (si está usando Notepad++, es Format -> Convert to UTF-8 w/o BOM )
  • El encabezado tanto en PHP como en HTML debe establecerse en UTF-8

    • HTML (dentro de <head></head> etiquetas):

      <meta charset="UTF-8">
      
    • PHP (en la parte superior de su archivo, antes de cualquier salida):

      header('Content-Type: text/html; charset=utf-8');
      
  • Al conectarse a la base de datos, establezca el conjunto de caracteres en UTF-8 para su objeto de conexión, así (directamente después de conectarse)

    mysqli_set_charset($conn, "utf8"); /* Procedural approach */
    $conn->set_charset("utf8");        /* Object-oriented approach */
    

    Esto es para mysqli_* , hay similares para mysql_* y PDO (ver la parte inferior de esta respuesta).

  • También asegúrese de que su base de datos y tablas estén configuradas en UTF-8, puede hacerlo así:

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    

    (Los datos ya almacenados no se convertirán al juego de caracteres adecuado, por lo que deberá hacer esto con una base de datos limpia o actualizar los datos después de hacer esto si hay caracteres rotos).

  • Si está utilizando json_encode() , es posible que deba aplicar el JSON_UNESCAPED_UNICODE de lo contrario, convertirá los caracteres especiales a su equivalente hexadecimal.

Recuerda que TODO en toda su canalización de código debe establecerse en UFT-8, de lo contrario, es posible que experimente caracteres rotos en su aplicación.

Además de esta lista, puede haber funciones que tengan un parámetro específico para especificar un conjunto de caracteres. El manual le informará sobre esto (un ejemplo es htmlspecialchars() ).

También hay funciones especiales para caracteres multibyte, ejemplo:strtolower() no bajará los caracteres multibyte, para eso tendrás que usar mb_strtolower() , vea esta demostración en vivo .

Nota 1 :Observe que está en algún lugar anotado como utf-8 (con un guión), y en algún lugar como utf8 (sin ello). Es importante que sepa cuándo usar cuál, ya que generalmente no son intercambiables. Por ejemplo, HTML y PHP quieren utf-8 , pero MySQL no.

Nota 2 :En MySQL, "charset" y "collation" no son lo mismo, consulte ¿Diferencia entre codificación y intercalación? . Sin embargo, ambos deben establecerse en utf-8; generalmente la intercalación debe ser utf8_general_ci o utf8_unicode_ci , consulte UTF-8:¿General? ¿Compartimiento? Unicode? .

Nota 3 :si usa emojis, MySQL debe especificarse con un utf8mb4 conjunto de caracteres en lugar del estándar utf8 , tanto en la base de datos como en la conexión. HTML y PHP solo tendrán UTF-8 .

Configuración de UTF-8 con mysql_ y DOP

  • PDO:Esto se hace en el DSN de su objeto. Tenga en cuenta el charset atributo,

    $pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
    
  • mysql_ :Esto se hace de manera muy similar a mysqli_* , pero no toma el objeto de conexión como primer argumento.

    mysql_set_charset('utf8');