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

UTF-8 až do konce

Úložiště dat :

  • Zadejte utf8mb4 znakovou sadu ve všech tabulkách a textových sloupcích v databázi. Díky tomu MySQL fyzicky ukládá a získává hodnoty zakódované nativně v UTF-8. Všimněte si, že MySQL bude implicitně používat utf8mb4 kódování v případě utf8mb4_* je specifikováno řazení (bez explicitní znakové sady).

  • Ve starších verzích MySQL (<5.5.3) budete bohužel nuceni používat jednoduše utf8 , který podporuje pouze podmnožinu znaků Unicode. Kéž bych si dělal srandu.

Přístup k datům :

  • V kódu vaší aplikace (např. PHP), v jakékoli metodě přístupu k databázi, kterou používáte, musíte nastavit znakovou sadu připojení na utf8mb4 . Tímto způsobem MySQL neprovádí žádnou konverzi ze svého nativního UTF-8, když předává data vaší aplikaci a naopak.

  • Některé ovladače poskytují svůj vlastní mechanismus pro konfiguraci znakové sady připojení, která aktualizuje svůj vlastní vnitřní stav a informuje MySQL o kódování, které se má při připojení použít – to je obvykle preferovaný přístup. V PHP:

    • Pokud používáte CHOP abstraktní vrstva s PHP ≥ 5.3.6, můžete zadat znakovou sadu v DSN :

       $dbh = new PDO('mysql:charset=utf8mb4');
      
    • Pokud používáte mysqli , můžete zavolat set_charset() :

        $mysqli->set_charset('utf8mb4');       // object oriented style
        mysqli_set_charset($link, 'utf8mb4');  // procedural style
      
    • Pokud jste zůstali u prostého mysql ale náhodou používáte PHP ≥ 5.2.3, můžete zavolat mysql_set_charset .

  • Pokud ovladač neposkytuje svůj vlastní mechanismus pro nastavení znakové sady připojení, možná budete muset zadat dotaz, abyste MySQL sdělili, jak vaše aplikace očekává kódování dat o připojení:NASTAVENÍ NÁZVŮ 'utf8mb4' .

  • Totéž platí pro utf8mb4 /utf8 platí jako výše.

Výstup :

  • Pokud vaše aplikace přenáší text do jiných systémů, budou také muset být informováni o kódování znaků. U webových aplikací musí být prohlížeč informován o kódování, ve kterém jsou data odesílána (prostřednictvím hlaviček odpovědí HTTP nebo metadat HTML ).

  • V PHP můžete použít default_charset php.ini nebo ručně zadejte Content-Type MIME záhlaví sami, což je jen více práce, ale má stejný účinek.

  • Při kódování výstupu pomocí json_encode() , přidejte JSON_UNESCAPED_UNICODE jako druhý parametr.

Vstup :

  • Bohužel byste měli ověřit každý přijatý řetězec jako platný UTF-8, než jej zkusíte uložit nebo kdekoli použít. mb_check_encoding() PHP dělá ten trik, ale musíte to používat nábožensky. Opravdu to nejde obejít, protože klienti se zlými úmysly mohou odesílat data v jakémkoli kódování, které chtějí, a nenašel jsem trik, jak přimět PHP, aby to za vás spolehlivě udělalo.

  • Z mého čtení aktuální specifikace HTML , následující dílčí odrážky již nejsou pro moderní HTML nutné nebo dokonce platné. Chápu to tak, že prohlížeče budou pracovat a odesílat data ve znakové sadě určené pro dokument. Pokud však cílíte na starší verze HTML (XHTML, HTML4 atd.), mohou být tyto body stále užitečné:

    • Pouze pro HTML před HTML5 :chcete, aby všechna data, která vám odesílají prohlížeče, byla v UTF-8. Bohužel, pokud to uděláte jediným způsobem, jak to spolehlivě udělat, je přidat accept-charset atribut ke všem vašim
      tagy: .
    • Pouze pro HTML před HTML5 :všimněte si, že specifikace HTML W3C říká, že klienti „by měli“ standardně odesílat formuláře zpět na server v jakékoli znakové sadě, kterou server obsluhoval, ale toto je zjevně pouze doporučení, a proto je potřeba být explicitní v každém tag.

Další aspekty kódu :

  • Je zřejmé, že všechny soubory, které budete poskytovat (PHP, HTML, JavaScript atd.), by měly být kódovány v platném UTF-8.

  • Musíte se ujistit, že pokaždé, když zpracováváte řetězec UTF-8, děláte to bezpečně. To je bohužel ta nejtěžší část. Pravděpodobně budete chtít široce využívat PHP mbstring rozšíření.

  • Vestavěné operace s řetězci v PHP nejsou ve výchozím nastavení bezpečné UTF-8. Existují některé věci, které můžete bezpečně dělat s běžnými operacemi s řetězci PHP (jako je zřetězení), ale pro většinu věcí byste měli použít ekvivalentní mbstring funkce.

  • Abyste věděli, co děláte (čtěte:nepokazit to), musíte opravdu znát UTF-8 a jak funguje na nejnižší možné úrovni. Podívejte se na některý z odkazů z utf8.com nějaké dobré zdroje, kde se dozvíte vše, co potřebujete vědět.



  1. 9 hlavních užitečných dotazů na tiskárnu Oracle Apps

  2. PostgreSQL, stav SQL:42601

  3. Operační analýza v reálném čase a index úložiště neshlukovaných sloupců

  4. Získejte velikost všech databází v PostgreSQL (psql)