sql >> Databáze >  >> RDS >> Mysql

MySQL a PHP:UTF-8 se znaky azbuky

Zde mícháte rozhraní API, mysql_* a mysqli_* nemíchá se. Měli byste se držet mysqli_ (jak se zdá, že jste), jako mysql_* funkce jsou v PHP7 zastaralé a zcela odstraněny.

Váš skutečný problém je někde problém se znakovou sadou. Zde je několik tipů, které vám mohou pomoci získat správnou znakovou sadu pro vaši aplikaci. To pokrývá většinu z obecných problémů, se kterými se člověk může setkat při vývoji aplikace PHP/MySQL.

  • VŠECHNY atributy v celé aplikaci musí být nastaveny na UTF-8
  • Uložte dokument jako UTF-8 bez kusovníku (pokud používáte Notepad++, je to Format -> Convert to UTF-8 w/o BOM )
  • Záhlaví v PHP i HTML by mělo být nastaveno na UTF-8

    • HTML (uvnitř <head></head> tagy):

      <meta charset="UTF-8">
      
    • PHP (v horní části vašeho souboru, před jakýmkoli výstupem):

      header('Content-Type: text/html; charset=utf-8');
      
  • Po připojení k databázi nastavte znakovou sadu na UTF-8 pro váš objekt připojení, takto (přímo po připojení)

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

    Toto je pro mysqli_* , existují podobné pro mysql_* a PDO (viz spodní část této odpovědi).

  • Také se ujistěte, že vaše databáze a tabulky jsou nastaveny na UTF-8, můžete to udělat takto:

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

    (Žádná již uložená data nebudou převedena na správnou znakovou sadu, takže to budete muset udělat s čistou databází, nebo poté data aktualizovat, pokud jsou v nich poškozené znaky).

  • Pokud používáte json_encode() , možná budete muset použít JSON_UNESCAPED_UNICODE příznak, jinak převede speciální znaky na jejich hexadecimální ekvivalent.

Pamatujte, že VŠE v celém kanálu kódu musí být nastaveno na UFT-8, jinak by se ve vaší aplikaci mohly objevit nefunkční znaky.

Kromě tohoto seznamu mohou existovat funkce, které mají specifický parametr pro specifikaci znakové sady. Návod vám o tom řekne (příkladem je htmlspecialchars() ).

Existují také speciální funkce pro vícebajtové znaky, příklad:strtolower() nesníží vícebajtové znaky, k tomu budete muset použít mb_strtolower() , podívejte se na tuto živou ukázku .

Poznámka 1 :Všimněte si, že je někde označen jako utf-8 (s pomlčkou) a někde jako utf8 (bez toho). Je důležité, abyste věděli, kdy které použít, protože obvykle nejsou zaměnitelné. Například HTML a PHP chtějí utf-8 , ale MySQL ne.

Poznámka 2 :V MySQL není „charset“ a „collation“ totéž, viz Rozdíl mezi kódováním a řazením? . Oba by však měly být nastaveny na utf-8; obecně by řazení mělo být buď utf8_general_ci nebo utf8_unicode_ci , viz UTF-8:Obecné? Zásobník? Unicode? .

Poznámka 3 :Pokud používáte emotikony, MySQL musí být specifikováno pomocí utf8mb4 znaková sada namísto standardního utf8 , a to jak v databázi, tak ve spojení. HTML a PHP budou mít pouze UTF-8 .

Nastavení UTF-8 pomocí mysql_ a CHOPa

  • PDO:To se provádí v DSN vašeho objektu. Všimněte si charset atribut,

    $pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
    
  • mysql_ :Toto se provádí velmi podobně jako mysqli_* , ale nebere objekt connection-object jako první argument.

    mysql_set_charset('utf8');
    


  1. Funkce CURRENT_TIMESTAMP() v Oracle

  2. 3 způsoby, jak zjistit, zda se řetězec shoduje s regulárním výrazem v MySQL

  3. Jaký je smysl počátečního katalogu v připojovacím řetězci SQL Server?

  4. IntegrityError:rozlišujte mezi jedinečným omezením a nenulovým porušením