sql >> Database >  >> RDS >> Mysql

MySQL en PHP:UTF-8 met Cyrillische tekens

Je mixt hier API's, mysql_* en mysqli_* mengt niet. Je moet je houden aan mysqli_ (zoals het er toch op lijkt), als mysql_* functies zijn verouderd en volledig verwijderd in PHP7.

Uw werkelijke probleem is ergens een tekensetprobleem. Hier zijn een paar tips die u kunnen helpen de juiste tekenset voor uw toepassing te vinden. Dit omvat de meeste van de algemene problemen waarmee men te maken kan krijgen bij het ontwikkelen van een PHP/MySQL-toepassing.

  • ALLE attributen in je hele applicatie moeten zijn ingesteld op UTF-8
  • Sla het document op als UTF-8 zonder stuklijst (als u Notepad++ gebruikt, is dit Format -> Convert to UTF-8 w/o BOM )
  • De koptekst in zowel PHP als HTML moet worden ingesteld op UTF-8

    • HTML (binnen <head></head> tags):

      <meta charset="UTF-8">
      
    • PHP (bovenaan je bestand, vóór elke uitvoer):

      header('Content-Type: text/html; charset=utf-8');
      
  • Als u verbinding maakt met de database, stelt u de tekenset in op UTF-8 voor uw verbindingsobject, zoals dit (direct na het verbinden)

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

    Dit is voor mysqli_* , er zijn vergelijkbare voor mysql_* en BOB (zie onderaan dit antwoord).

  • Zorg er ook voor dat uw database en tabellen zijn ingesteld op UTF-8, u kunt dat als volgt doen:

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

    (Alle gegevens die al zijn opgeslagen, worden niet geconverteerd naar de juiste tekenset, dus u moet dit doen met een schone database, of de gegevens bijwerken nadat u dit hebt gedaan als er gebroken tekens zijn).

  • Als je json_encode() gebruikt , moet u mogelijk de JSON_UNESCAPED_UNICODE . toepassen vlag, anders worden speciale tekens geconverteerd naar hun hexadecimale equivalent.

Onthoud dat ALLES in uw hele codepijplijn moet worden ingesteld op UFT-8, anders kunt u gebroken tekens in uw toepassing ervaren.

Naast deze lijst kunnen er functies zijn die een specifieke parameter hebben voor het specificeren van een tekenset. De handleiding zal je hierover vertellen (een voorbeeld is htmlspecialchars() ).

Er zijn ook speciale functies voor multibyte-tekens, bijvoorbeeld:strtolower() zal multibyte-tekens niet verlagen, daarvoor moet je mb_strtolower() gebruiken , bekijk deze live demo .

Opmerking 1 :Merk op dat het ergens genoteerd staat als utf-8 (met een streepje), en ergens als utf8 (zonder het). Het is belangrijk dat u weet wanneer u welke moet gebruiken, omdat ze meestal niet uitwisselbaar zijn. HTML en PHP willen bijvoorbeeld utf-8 , maar MySQL niet.

Opmerking 2 :In MySQL zijn "charset" en "collation" niet hetzelfde, zie Verschil tussen codering en sortering? . Beide moeten echter worden ingesteld op utf-8; in het algemeen moet de sortering utf8_general_ci . zijn of utf8_unicode_ci , zie UTF-8:Algemeen? bak? Unicode? .

Opmerking 3 :als je emoji's gebruikt, moet MySQL worden gespecificeerd met een utf8mb4 tekenset in plaats van de standaard utf8 , zowel in de database als in de verbinding. HTML en PHP hebben gewoon UTF-8 .

UTF-8 instellen met mysql_ en BOB

  • PDO:Dit gebeurt in de DSN van uw object. Let op de charset attribuut,

    $pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
    
  • mysql_ :Dit gebeurt op dezelfde manier als mysqli_* , maar het neemt het verbindingsobject niet als het eerste argument.

    mysql_set_charset('utf8');
    


  1. 6 manieren om de grootte van een database in SQL Server te controleren met T-SQL

  2. Alle gebruikers in PostgreSQL weergeven?

  3. NOT NULL beperking over een set kolommen

  4. Hoe QUOTE() werkt in MariaDB