sql >> Database teknologi >  >> RDS >> Mysql

UTF-8 hele vejen igennem

Datalagring :

  • Angiv utf8mb4 tegnsæt på alle tabeller og tekstkolonner i din database. Dette får MySQL til fysisk at gemme og hente værdier indkodet i UTF-8. Bemærk, at MySQL implicit vil bruge utf8mb4 kodning hvis en utf8mb4_* sortering er angivet (uden noget eksplicit tegnsæt).

  • I ældre versioner af MySQL (<5.5.3) bliver du desværre tvunget til blot at bruge utf8 , som kun understøtter et undersæt af Unicode-tegn. Jeg ville ønske, jeg lavede sjov.

Dataadgang :

  • I din applikationskode (f.eks. PHP), uanset hvilken DB-adgangsmetode du bruger, skal du indstille forbindelsestegnsættet til utf8mb4 . På denne måde foretager MySQL ingen konvertering fra sin oprindelige UTF-8, når den videregiver data til din applikation og omvendt.

  • Nogle drivere giver deres egen mekanisme til at konfigurere forbindelsestegnsættet, som både opdaterer sin egen interne tilstand og informerer MySQL om den kodning, der skal bruges på forbindelsen - dette er normalt den foretrukne tilgang. I PHP:

    • Hvis du bruger PDO abstraktionslag med PHP ≥ 5.3.6, du kan angive charset i DSN :

       $dbh = new PDO('mysql:charset=utf8mb4');
      
    • Hvis du bruger mysqli , kan du ringe til set_charset() :

        $mysqli->set_charset('utf8mb4');       // object oriented style
        mysqli_set_charset($link, 'utf8mb4');  // procedural style
      
    • Hvis du sidder fast med almindelig mysql men tilfældigvis kører PHP ≥ 5.2.3, kan du ringe til >mysql_set_charset .

  • Hvis driveren ikke har sin egen mekanisme til indstilling af forbindelsestegnsættet, skal du muligvis udsende en forespørgsel for at fortælle MySQL, hvordan din applikation forventer, at data på forbindelsen bliver kodet:SÆT NAVNE 'utf8mb4' .

  • Samme overvejelse vedrørende utf8mb4 /utf8 gælder som ovenfor.

Output :

  • Hvis din applikation sender tekst til andre systemer, skal de også informeres om tegnkodningen. Med webapplikationer skal browseren informeres om den kodning, som data sendes i (via HTTP-svarheaders eller HTML-metadata ).

  • I PHP kan du bruge default_charset php.ini mulighed, eller udsted manuelt Content-Type MIME header dig selv, hvilket bare er mere arbejde, men har samme effekt.

  • Ved indkodning af output ved hjælp af json_encode() , tilføj JSON_UNESCAPED_UNICODE som en anden parameter.

Input :

  • Desværre bør du bekræfte hver modtaget streng som værende gyldig UTF-8, før du forsøger at gemme den eller bruge den hvor som helst. PHP's mb_check_encoding() gør tricket, men du skal bruge det religiøst. Der er virkelig ingen vej udenom dette, da ondsindede klienter kan indsende data i hvilken som helst kodning, de ønsker, og jeg har ikke fundet et trick til at få PHP til at gøre dette for dig pålideligt.

  • Fra min læsning af den nuværende HTML-specifikation , er de følgende underpunkter ikke længere nødvendige eller endda gyldige for moderne HTML. Min forståelse er, at browsere vil arbejde med og indsende data i det tegnsæt, der er specificeret for dokumentet. Men hvis du målretter mod ældre versioner af HTML (XHTML, HTML4 osv.), kan disse punkter stadig være nyttige:

    • Kun til HTML før HTML5 :du ønsker, at alle data sendt til dig af browsere skal være i UTF-8. Desværre, hvis du går efter, er den eneste måde at gøre dette på pålideligt at tilføje accept-charset attribut til alle dine
      tags: .
    • Kun til HTML før HTML5 :bemærk, at W3C HTML-specifikationen siger, at klienter "skal" som standard sende formularer tilbage til serveren i det tegnsæt, serveren serverede, men dette er tilsyneladende kun en anbefaling, derfor behovet for at være eksplicit på hver enkelt tag.

Andre kodeovervejelser :

  • Det er klart nok, at alle filer, du vil betjene (PHP, HTML, JavaScript osv.), skal være kodet i gyldig UTF-8.

  • Du skal sørge for, at hver gang du behandler en UTF-8-streng, gør du det sikkert. Dette er desværre den svære del. Du vil sikkert gerne gøre udstrakt brug af PHP's mbstring udvidelse.

  • PHP's indbyggede strengoperationer er ikke som standard UTF-8 sikker. Der er nogle ting, du sikkert kan gøre med normale PHP-strengoperationer (såsom sammenkædning), men til de fleste ting bør du bruge den tilsvarende mbstring funktion.

  • For at vide, hvad du laver (læs:ikke ødelægge det), skal du virkelig kende UTF-8, og hvordan det virker på det lavest mulige niveau. Tjek et af linkene fra utf8.com for nogle gode ressourcer til at lære alt, hvad du behøver at vide.



  1. Forbind ODBC-applikationer på Windows til QuickBooks Online

  2. Hurtigste måde at udføre indlejrede masseindsættelser med anvendelse af scope_identity()?

  3. Sådan bruger du understrengsfunktionen i PostgreSQL og Redshift

  4. Sådan kontrolleres konfigurationsindstillingerne for databasemail i SQL Server (T-SQL)