Mysql
 sql >> Datenbank >  >> RDS >> Mysql

ISO-8859-1-Zeichen schneidet Text ab, der in die utf-8-mysql-Spalte eingefügt wird

Irgendetwas in Ihrem Code behandelt die Zeichenfolge nicht als UTF8. Es könnte Ihr PHP/HTML sein, es könnte sich in Ihrer Verbindung zur DB befinden, oder es könnte die DB selbst sein - alles muss konsistent als UTF8 eingestellt sein, und wenn etwas nicht der Fall ist, wird die Zeichenfolge genau wie Sie abgeschnitten siehe beim Passieren einer UTF8/Nicht-UTF8-Grenze.

Ich gehe davon aus, dass Ihre DB UTF8-konform ist - das ist am einfachsten zu überprüfen. Beachten Sie, dass die Sortierung auf Serverebene, Datenbankebene, Tabellenebene und Spaltenebene innerhalb der Tabelle festgelegt werden kann. Das Festlegen der UTF8-Sortierung in der Spalte sollte alles andere für die Speicherung überschreiben, aber die anderen werden immer noch aktiviert, wenn sie mit der DB sprechen, wenn sie nicht auch UTF8 sind. Wenn Sie sich nicht sicher sind, setzen Sie die Verbindung nach dem Öffnen explizit auf UTF8:

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

Jetzt sind Ihre DB und Ihre Verbindung UTF8, stellen Sie sicher, dass Ihre Webseite dies auch ist. Auch dies kann an mehr als einer Stelle gesetzt werden (.htaccess, php.ini). Wenn Sie sich nicht sicher sind / keinen Zugriff haben, überschreiben Sie einfach, was PHP als Standard oben auf Ihrer Seite aufnimmt:

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

Beachten Sie, dass Sie das Obige gleich zu Beginn möchten, bevor Text von Ihrer Seite ausgegeben wird. Sobald der Text ausgegeben wird, ist es möglicherweise zu spät, um zu versuchen, eine Codierung anzugeben - Sie sind möglicherweise bereits an die Standardeinstellung Ihres Servers gebunden. Ich wiederhole das dann auch in meinen Headern (möglicherweise übertrieben):

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

Und ich überschreibe es auch in Formularen, in denen ich Daten nehme:

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

Um ehrlich zu sein, wenn Sie die Codierung ganz oben eingestellt haben, sind die anderen Überschreibungen meines Wissens nach nicht erforderlich - aber ich behalte sie trotzdem, weil es auch nichts kaputt macht, und ich würde lieber nur die angeben explizit codieren, als den Server Annahmen treffen zu lassen.

Schließlich haben Sie erwähnt, dass Sie die Zeichenfolge in phpMyAdmin eingefügt haben und sie wie erwartet aussah. Sind Sie sicher, dass die phpMyAdmin-Seiten UTF8 sind? Ich glaube nicht, dass sie es sind. Wenn ich UTF8-Daten aus meinem PHP-Code speichere, werden sie in phpMyAdmin wie rohe 8-Bit-Zeichen angezeigt. Wenn ich denselben String nehme und ihn direkt in phpMyAdmin speichere, sieht er „korrekt“ aus. Ich vermute also, dass phpMyAdmin den Standardzeichensatz meines lokalen Servers verwendet, nicht unbedingt UTF8.

Zum Beispiel die folgende Zeichenfolge, die von meiner Webseite gespeichert wurde:

I can’t wait

Liest sich so in meinem phpMyAdmin:

I can’t wait

Seien Sie also vorsichtig, wenn Sie auf diese Weise testen, da Sie nicht wirklich wissen, welche Kodierung phpMyAdmin für die Anzeige oder die DB-Verbindung verwendet.

Wenn Sie immer noch Probleme haben, versuchen Sie meinen Code unten. Zuerst erstelle ich eine Tabelle, um den Text in UTF8 zu speichern:

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 ;

Und hier ist etwas PHP, um es zu testen. Es nimmt im Grunde Ihre Eingaben in ein Formular auf, sendet diese Eingaben an Sie zurück und speichert / ruft den Text aus der Datenbank ab. Wie ich schon sagte, wenn Sie die Daten direkt in phpMyAdmin anzeigen, werden Sie vielleicht feststellen, dass sie dort nicht richtig aussehen, aber auf der Seite unten sollten sie immer wie erwartet erscheinen, da sowohl die Seite als auch die DB-Verbindung auf 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>