Você está misturando APIs aqui,mysql_*
emysqli_*
não mistura. Você deve ficar commysqli_
(como parece que você é de qualquer maneira), comomysql_*
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 é paramysqli_*
, existem outros semelhantes paramysql_*
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 oJSON_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 comoutf-8
(com um traço) e em algum lugar comoutf8
(sem ele). É importante que você saiba quando usar quais, pois eles geralmente não são intercambiáveis. Por exemplo, HTML e PHP queremutf-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 serutf8_general_ci
ouutf8_unicode_ci
, consulte UTF-8:geral? Caixa? Unicode? .
Observação 3 :Se você estiver usando emojis, o MySQL precisa ser especificado com umutf8mb4
charset em vez do padrãoutf8
, tanto no banco de dados quanto na conexão. HTML e PHP terão apenasUTF-8
.
Configurando UTF-8 com
mysql_
e DOP -
PDO:Isso é feito no DSN do seu objeto. Observe ocharset
atributo,
$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
-
mysql_
:Isso é feito de maneira muito semelhante aomysqli_*
, mas não aceita o objeto de conexão como o primeiro argumento.
mysql_set_charset('utf8');