Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL e PHP:UTF-8 com caracteres cirílicos


Você está misturando APIs aqui, mysql_* e mysqli_* não mistura. Você deve ficar com mysqli_ (como parece que você é de qualquer maneira), como mysql_* funções são obsoletas e removidas inteiramente no PHP7.

Seu problema real é um problema de charset em algum lugar. Aqui estão algumas dicas que podem ajudá-lo a obter o conjunto de caracteres correto para seu aplicativo. Isso abrange a maioria dos problemas gerais que se pode enfrentar ao desenvolver uma aplicação PHP/MySQL.
  • TODOS atributos em todo o seu aplicativo devem ser definidos como UTF-8
  • Salve o documento como UTF-8 sem BOM (se estiver usando o Notepad++, é Format -> Convert to UTF-8 w/o BOM )

  • O cabeçalho em PHP e HTML deve ser definido como UTF-8

    • HTML (dentro de <head></head> Tag):
      <meta charset="UTF-8">
      

    • PHP (no topo do seu arquivo, antes de qualquer saída):
      header('Content-Type: text/html; charset=utf-8');
      

  • Ao conectar-se ao banco de dados, defina o charset para UTF-8 para seu objeto de conexão, assim (diretamente após a conexão)
    mysqli_set_charset($conn, "utf8"); /* Procedural approach */
    $conn->set_charset("utf8");        /* Object-oriented approach */
    

    Isto é para mysqli_* , existem outros semelhantes para mysql_* e PDO (veja a parte inferior desta resposta).

  • Certifique-se também de que seu banco de dados e tabelas estejam configurados para UTF-8, você pode fazer isso assim:
    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    

    (Quaisquer dados já armazenados não serão convertidos para o conjunto de caracteres adequado, portanto, você precisará fazer isso com um banco de dados limpo ou atualizar os dados depois de fazer isso se houver caracteres quebrados).


  • Se você estiver usando json_encode() , talvez seja necessário aplicar o JSON_UNESCAPED_UNICODE sinalizador, caso contrário, ele converterá caracteres especiais em seu equivalente hexadecimal.

Lembre-se de que TUDO em todo o seu pipeline de código precisa ser definido como UFT-8, caso contrário, você poderá encontrar caracteres quebrados em seu aplicativo.

Além desta lista, podem existir funções que possuam um parâmetro específico para especificar um charset. O manual informará sobre isso (um exemplo é htmlspecialchars() ).

Existem também funções especiais para caracteres multibyte, exemplo:strtolower() não diminuirá caracteres multibyte, para isso você terá que usar mb_strtolower() , veja esta demonstração ao vivo .

Observação 1 :Observe que está em algum lugar marcado como utf-8 (com um traço) e em algum lugar como utf8 (sem ele). É importante que você saiba quando usar quais, pois eles geralmente não são intercambiáveis. Por exemplo, HTML e PHP querem utf-8 , mas o MySQL não.

Observação 2 :No MySQL, "charset" e "collation" não são a mesma coisa, veja Diferença entre codificação e agrupamento? . Ambos devem ser configurados para utf-8; geralmente o agrupamento deve ser utf8_general_ci ou utf8_unicode_ci , consulte UTF-8:geral? Caixa? Unicode? .

Observação 3 :Se você estiver usando emojis, o MySQL precisa ser especificado com um utf8mb4 charset em vez do padrão utf8 , tanto no banco de dados quanto na conexão. HTML e PHP terão apenas UTF-8 .

Configurando UTF-8 com mysql_ e DOP

  • PDO:Isso é feito no DSN do seu objeto. Observe o charset atributo,
    $pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
    

  • mysql_ :Isso é feito de maneira muito semelhante ao mysqli_* , mas não aceita o objeto de conexão como o primeiro argumento.
    mysql_set_charset('utf8');