sql >> Database >  >> RDS >> Mysql

UTF-8 helemaal door

Gegevensopslag :

  • Specificeer de utf8mb4 tekenset op alle tabellen en tekstkolommen in uw database. Dit zorgt ervoor dat MySQL waarden fysiek opslaat en ophaalt die native zijn gecodeerd in UTF-8. Merk op dat MySQL impliciet gebruik zal maken van utf8mb4 codering als een utf8mb4_* sortering is gespecificeerd (zonder enige expliciete tekenset).

  • In oudere versies van MySQL (<5.5.3) zult u helaas genoodzaakt zijn om gewoon utf8 te gebruiken , die alleen een subset van Unicode-tekens ondersteunt. Ik wou dat ik een grapje maakte.

Gegevenstoegang :

  • In uw applicatiecode (bijv. PHP), in welke DB-toegangsmethode u ook gebruikt, moet u de verbindingstekenset instellen op utf8mb4 . Op deze manier voert MySQL geen conversie uit van zijn oorspronkelijke UTF-8 wanneer het gegevens aan uw applicatie overdraagt ​​en vice versa.

  • Sommige stuurprogramma's bieden hun eigen mechanisme voor het configureren van de verbindingstekenset, die zowel de eigen interne status bijwerkt als MySQL informeert over de codering die op de verbinding moet worden gebruikt - dit is meestal de voorkeursbenadering. In PHP:

    • Als u de BOB gebruikt abstractielaag met PHP ≥ 5.3.6, u kunt tekenset . specificeren in de DSN :

       $dbh = new PDO('mysql:charset=utf8mb4');
      
    • Als je mysqli gebruikt , kunt u set_charset() bellen :

        $mysqli->set_charset('utf8mb4');       // object oriented style
        mysqli_set_charset($link, 'utf8mb4');  // procedural style
      
    • Als je vastzit met gewone mysql maar toevallig PHP ≥ 5.2.3 draait, kunt u mysql_set_charset .

  • Als het stuurprogramma geen eigen mechanisme biedt voor het instellen van de verbindingstekenset, moet u mogelijk een query uitvoeren om MySQL te vertellen hoe uw toepassing verwacht dat gegevens over de verbinding worden gecodeerd:STEL NAMEN IN 'utf8mb4' .

  • Dezelfde overweging met betrekking tot utf8mb4 /utf8 is van toepassing zoals hierboven.

Uitvoer :

  • Als uw toepassing tekst naar andere systemen verzendt, moeten zij ook op de hoogte worden gesteld van de tekencodering. Bij webapplicaties moet de browser worden geïnformeerd over de codering waarin gegevens worden verzonden (via HTTP-responsheaders of HTML-metadata ).

  • In PHP kun je de default_charset gebruiken php.ini optie, of geef handmatig het Content-Type op MIME-header zelf, dat is gewoon meer werk maar heeft hetzelfde effect.

  • Bij het coderen van de uitvoer met json_encode() , voeg JSON_UNESCAPED_UNICODE toe als een tweede parameter.

Invoer :

  • Helaas moet u elke ontvangen string verifiëren als geldige UTF-8 voordat u deze probeert op te slaan of ergens te gebruiken. PHP's mb_check_encoding() doet de truc, maar je moet het religieus gebruiken. Er is echt geen manier om dit te omzeilen, aangezien kwaadwillende klanten gegevens kunnen indienen in elke codering die ze willen, en ik heb geen truc gevonden om PHP dit op een betrouwbare manier voor je te laten doen.

  • Uit mijn lezing van de huidige HTML-specificatie , zijn de volgende sub-bullets niet nodig of zelfs niet meer geldig voor moderne HTML. Ik heb begrepen dat browsers werken met en gegevens indienen in de tekenset die voor het document is opgegeven. Als u zich echter op oudere versies van HTML (XHTML, HTML4, enz.) richt, kunnen deze punten nog steeds nuttig zijn:

    • Alleen voor HTML vóór HTML5 :u wilt dat alle gegevens die door browsers naar u worden verzonden, in UTF-8 staan. Helaas, als je dit doet, is de enige manier om dit op een betrouwbare manier te doen, het toevoegen van de accept-charset toeschrijven aan al uw
      tags: .
    • Alleen voor HTML vóór HTML5 :merk op dat de W3C HTML-specificatie zegt dat clients standaard formulieren terug moeten sturen naar de server in welke tekenset de server ook gebruikt, maar dit is blijkbaar slechts een aanbeveling, vandaar de noodzaak om expliciet te zijn op elk afzonderlijk tag.

Overige code-overwegingen :

  • Het is duidelijk dat alle bestanden die u wilt gebruiken (PHP, HTML, JavaScript, enz.) gecodeerd moeten zijn in geldige UTF-8.

  • Elke keer dat u een UTF-8-tekenreeks verwerkt, moet u ervoor zorgen dat u dit veilig doet. Dit is helaas het moeilijkste. Je zult waarschijnlijk uitgebreid gebruik willen maken van PHP's mbstring extensie.

  • De ingebouwde tekenreeksbewerkingen van PHP zijn niet standaard UTF-8 veilig. Er zijn een aantal dingen die je veilig kunt doen met normale PHP-tekenreeksbewerkingen (zoals aaneenschakeling), maar voor de meeste dingen moet je de equivalente mbstring gebruiken functie.

  • Om te weten wat je doet (lees:niet verknoeien), moet je UTF-8 echt kennen en weten hoe het werkt op het laagst mogelijke niveau. Bekijk een van de links van utf8.com voor een aantal goede bronnen om alles te leren wat u moet weten.



  1. Gegevens invoegen met mysqli

  2. PostgreSQL kolommen naar rijen converteren? transponeren?

  3. Een serverloze GraphQL-API maken voor MySQL, Postgres en Aurora

  4. Hoe groepeer ik op continue bereiken