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

ISO-8859-1 tegn afkorter tekst, der indsættes i utf-8 mysql kolonne

Noget i din kode håndterer ikke strengen som UTF8. Det kan være din PHP/HTML, det kan være i din forbindelse til DB'en, eller det kan være DB'en selv - alt skal indstilles som UTF8 konsekvent, og hvis noget ikke er det, vil strengen blive trunkeret præcis som du se, når du passerer over en UTF8/ikke-UTF8-grænse.

Jeg vil antage, at din DB er UTF8-kompatibel - det er nemmest at kontrollere. Bemærk, at sorteringen kan indstilles på serverniveau, databaseniveau, tabelniveau og kolonneniveau i tabellen. Indstilling af UTF8-sortering på kolonnen bør tilsidesætte alt andet til opbevaring, men de andre vil stadig slå ind, når de taler med DB'en, hvis de ikke også er UTF8. Hvis du ikke er sikker, skal du udtrykkeligt indstille forbindelsen til UTF8, efter du har åbnet den:

$dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");

Nu er din DB og forbindelse UTF8, sørg for at din webside også er det. Igen, dette kan indstilles mere end ét sted (.htaccess, php.ini). Hvis du ikke er sikker på/ikke har adgang, skal du bare tilsidesætte det, PHP optager som standard øverst på din side:

<?php ini_set('default_charset', 'UTF-8'); ?>

Bemærk, at du vil have ovenstående lige i starten, før der udskrives tekst fra din side. Når først tekst bliver udskrevet, er det potentielt for sent at forsøge at angive en kodning - du er muligvis allerede låst til det, der er standard på din server. Jeg gentager så også dette i mine overskrifter (muligvis overkill):

<head>
<meta charset="UTF-8">
<meta http-equiv="Content-type" content="text/html; charset=UTF-8">
</head>

Og jeg tilsidesætter det på formularer, hvor jeg også tager data:

<FORM NAME="utf8-test" METHOD="POST" ACTION="utf8-test.php" enctype="multipart/form-data" accept-charset="UTF-8">"

For at være ærlig, hvis du har indstillet kodningen øverst, er min forståelse, at de andre tilsidesættelser ikke er påkrævet - men jeg beholder dem alligevel, for det knækker heller ikke noget, og jeg vil hellere bare oplyse kodning eksplicit, end lad serveren gøre antagelser.

Til sidst nævnte du, at du i phpMyAdmin indsatte strengen, og den så ud som forventet - er du dog sikker på, at phpMyAdmin-siderne er UTF8? Det tror jeg ikke, de er. Når jeg gemmer UTF8-data fra min PHP-kode, ser det ud som rå 8-bit tegn i phpMyAdmin. Hvis jeg tager den samme streng og gemmer den direkte i phpMyAdmin, ser den 'korrekt' ud. Så jeg gætter på, at phpMyAdmin bruger standardtegnsættet på min lokale server, ikke nødvendigvis UTF8.

For eksempel følgende streng gemt fra min webside:

I can’t wait

Læser sådan her i min phpMyAdmin:

I can’t wait

Så vær forsigtig, når du tester på den måde, da du ikke rigtig ved, hvilken kodning phpMyAdmin bruger til visning eller DB-forbindelse.

Hvis du stadig har problemer, så prøv min kode nedenfor. Først opretter jeg en tabel til at gemme teksten i UTF8:

CREATE TABLE IF NOT EXISTS `utf8_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `my_text` varchar(8000) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Og her er noget PHP til at teste det. Det tager dybest set dit input på en formular, ekko det input tilbage til dig og gemmer/henter teksten fra DB. Som sagt, hvis du ser dataene direkte i phpMyAdmin, vil du måske finde ud af, at det ikke ser lige ud der, men gennem siden nedenfor skulle det altid fremstå som forventet, på grund af at side- og db-forbindelsen begge er låst til UTF8.

<?php
  // Override whatever is set in php.ini
  ini_set('default_charset', 'UTF-8');

  // The following should not be required with the above override
  //header('Content-Type:text/html; charset=UTF-8');

  // Open the database
  $dbh = new PDO('mysql:dbname=utf8db;host=127.0.0.1;charset=utf8', 'root', 'password');

  // Set the connection to UTF8
  $dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
  // Tell MySql to do the parameter replacement, not PDO
  $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  // Throw exceptions (and break the code) if a query is bad
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $id = 0;
  if (isset($_POST["StoreText"]))
  {
    $stmt = $dbh->prepare('INSERT INTO utf8_test (my_text) VALUES (:my_text)');
    $stmt->execute(array(':my_text' => $_POST['my_text']));
    $id = $dbh->lastInsertId();
  }
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-type" content="text/html; charset=UTF-8">

<title>UTF-8 Test</title>
</head>

<body>

<?php
  // If something was posted, output it
  if (isset($_POST['my_text']))
  {
    echo "POSTED<br>\n";
    echo $_POST['my_text'] . "<br>\n";
  }

  // If something was written to the database, read it back, and output it
  if ($id > 0)
  {
    $stmt = $dbh->prepare('SELECT my_text FROM utf8_test WHERE id = :id');
    $stmt->execute(array(':id' => $id));
    if ($result = $stmt->fetch())
    {
      echo "STORED<br>\n";
      echo $result['my_text'] . "<br>\n";
    }
  }

  // Create a form to take some user input
  echo "<FORM NAME=\"utf8-test\" METHOD=\"POST\" ACTION=\"utf8-test.php\" enctype=\"multipart/form-data\" accept-charset=\"UTF-8\">";

  echo "<br>";

  echo "<textarea name=\"my_text\" rows=\"20\" cols=\"90\">";

  // If something was posted, include it on the form
  if (isset($_POST['my_text']))
  {
    echo $_POST['my_text'];
  }

  echo "</textarea>";

  echo "<br>";
  echo "<INPUT TYPE = \"Submit\" Name = \"StoreText\" VALUE=\"Store It\" />";

  echo "</FORM>";
?>
<br>

</body>

</html>


  1. Konstruktion af UPDATE-sætninger ved hjælp af associative arrays i PHP

  2. Sådan grupperer du en rapport efter flere felter i Access 2016

  3. Problemer med at installere mysqlclient med pip3

  4. Sådan opretter og sletter du databaser og tabeller i MySQL