Mysql
 sql >> база данни >  >> RDS >> Mysql

Знак ISO-8859-1 съкращава текст, вмъкващ се в utf-8 mysql колона

Нещо във вашия код не обработва низа като UTF8. Може да е вашият PHP/HTML, може да е във вашата връзка с DB или може да е самата DB - всичко трябва да бъде зададено като UTF8 последователно и ако нещо не е, низът ще бъде съкратен точно както вие вижте, когато преминавате през граница на UTF8/не-UTF8.

Предполагам, че вашата DB е съвместима с UTF8 - това е най-лесно да се провери. Имайте предвид, че съпоставянето може да бъде зададено на ниво сървър, ниво на база данни, ниво на таблица и ниво на колона в таблицата. Задаването на UTF8 съпоставяне в колоната трябва да отмени всичко друго за съхранение, но останалите все пак ще се включат, когато говорят с DB, ако не са също UTF8. Ако не сте сигурни, изрично задайте връзката на UTF8, след като я отворите:

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

Сега вашата база данни и връзка са UTF8, уверете се, че вашата уеб страница също е такава. Отново, това може да бъде зададено на повече от едно място (.htaccess, php.ini). Ако не сте сигурни/нямате достъп, просто заменете това, което PHP приема по подразбиране в горната част на страницата ви:

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

Имайте предвид, че искате горепосоченото още в началото, преди какъвто и да е текст да бъде изведен от вашата страница. След като текстът бъде изведен, потенциално е твърде късно да се опитате да посочите кодиране - може вече да сте заключени в това, което е по подразбиране на вашия сървър. След това повтарям това в моите заглавки (евентуално излишно):

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

И го отменям във формуляри, където вземам и данни:

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

Честно казано, ако сте задали кодирането в горната част, разбирам, че другите заменяния не са задължителни - но въпреки това ги запазвам, защото и това не нарушава нищо и бих предпочел просто да заявя кодиране изрично, отколкото позволява на сървъра да прави предположения.

Накрая споменахте, че в phpMyAdmin сте вмъкнали низа и той изглеждаше както се очаква - сигурни ли сте, че страниците на phpMyAdmin са UTF8? Не мисля, че са. Когато съхранявам UTF8 данни от моя PHP код, те се виждат като необработени 8-битови знаци в phpMyAdmin. Ако взема същия низ и го запазя директно в phpMyAdmin, той изглежда "правилен". Така че предполагам, че phpMyAdmin използва набора от символи по подразбиране на моя локален сървър, а не непременно UTF8.

Например следният низ, съхранен от моята уеб страница:

I can’t wait

Чете се така в моя phpMyAdmin:

I can’t wait

Така че бъдете внимателни, когато тествате по този начин, тъй като всъщност не знаете какво кодиране използва phpMyAdmin за дисплей или DB връзка.

Ако все още имате проблеми, опитайте моя код по-долу. Първо създавам таблица за съхраняване на текста в 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 ;

И ето малко PHP, за да го тествате. По принцип приема вашия вход във формуляр, отразява това въведено обратно към вас и съхранява/извлича текста от DB. Както казах, ако преглеждате данните директно в phpMyAdmin, може да откриете, че не изглеждат точно там, но през страницата по-долу винаги трябва да се показва, както се очаква, поради връзката между страницата и db, които са заключени към 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Измерване на онлайн времето на уебсайта

  2. Намиране на най-близките места с помощта на точков тип данни и st_distance_sphere в MySQL 8

  3. MySql :Подреждане по и групиране Чрез комбиниране не дава последния запис

  4. Разлики между MySQL и SQL Server

  5. Как да накарам mysqli да хвърля изключения с помощта на MYSQLI_REPORT_STRICT?