sql >> Databasteknik >  >> RDS >> Mysql

ISO-8859-1-tecken trunkerar text som infogas i utf-8 mysql-kolumn

Något i din kod hanterar inte strängen som UTF8. Det kan vara din PHP/HTML, det kan vara i din anslutning till DB, eller det kan vara DB själv - allt måste ställas in som UTF8 konsekvent, och om något inte är det, kommer strängen att trunkeras precis som du se när du passerar en UTF8/icke-UTF8-gräns.

Jag antar att din DB är UTF8-kompatibel - det är lättast att kontrollera. Observera att sorteringen kan ställas in på servernivå, databasnivå, tabellnivå och kolumnnivå i tabellen. Att ställa in UTF8-sortering på kolumnen bör åsidosätta allt annat för lagring, men de andra kommer fortfarande att slå in när de pratar med DB om de inte också är UTF8. Om du inte är säker, ställ in anslutningen till UTF8 efter att du öppnat den:

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

Nu är din DB och anslutning UTF8, se till att din webbsida också är det. Återigen, detta kan ställas in på mer än ett ställe (.htaccess, php.ini). Om du inte är säker på/inte har åtkomst, åsidosätt bara vad PHP plockar upp som standard högst upp på din sida:

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

Observera att du vill ha ovanstående redan i början, innan någon text matas ut från din sida. När text väl matas ut är det potentiellt för sent att försöka ange en kodning - du kanske redan är låst till det som är standard på din server. Jag upprepar också detta i mina rubriker (möjligen överdrivet):

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

Och jag åsidosätter det på formulär där jag tar data också:

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

För att vara ärlig, om du har ställt in kodningen högst upp, är min uppfattning att de andra åsidosättningarna inte krävs - men jag behåller dem ändå, eftersom det inte bryter någonting heller, och jag skulle hellre bara säga kodning explicit, än låt servern göra antaganden.

Slutligen nämnde du att du infogade strängen i phpMyAdmin och att den såg ut som förväntat - är du dock säker på att phpMyAdmin-sidorna är UTF8? Det tror jag inte att de är. När jag lagrar UTF8-data från min PHP-kod ser den ut som råa 8-bitars tecken i phpMyAdmin. Om jag tar samma sträng och lagrar den direkt i phpMyAdmin ser den "korrekt" ut. Så jag gissar att phpMyAdmin använder standardteckenuppsättningen för min lokala server, inte nödvändigtvis UTF8.

Till exempel, följande sträng lagrad från min webbsida:

I can’t wait

Läser så här i min phpMyAdmin:

I can’t wait

Så var försiktig när du testar på det sättet, eftersom du inte riktigt vet vilken kodning phpMyAdmin använder för visning eller DB-anslutning.

Om du fortfarande har problem, prova min kod nedan. Först skapar jag en tabell för att lagra texten 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 ;

Och här är lite PHP för att testa det. Det tar i princip din input på ett formulär, ekar den inmatning tillbaka till dig och lagrar/hämtar texten från DB. Som jag sa, om du tittar på data direkt i phpMyAdmin, kanske du upptäcker att den inte ser ut där, men genom sidan nedan bör den alltid visas som förväntat, på grund av att sidan och db-anslutningen båda är låsta till 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. Hur gör du det möjligt för kunder att använda sin openid på din webbplats, precis som stackoverflow?

  2. Ansluter SquirreL SQL till Microsoft Excel

  3. hur gör man en funktion för att returnera radtyp från en tabell i pl/sql?

  4. mysql skickar data till in