Mysql
 sql >> Baza danych >  >> RDS >> Mysql

ISO-8859-1 Znak obcina tekst wstawiając do kolumny mysql utf-8

Coś w twoim kodzie nie obsługuje ciągu jako UTF8. Może to być twój PHP/HTML, może to być twoje połączenie z bazą danych lub może to być sama baza danych - wszystko musi być ustawione na UTF8 konsekwentnie, a jeśli coś nie jest, ciąg zostanie obcięty dokładnie tak, jak ty zobacz podczas przechodzenia przez granicę UTF8/nie-UTF8.

Zakładam, że twoja baza danych jest zgodna z UTF8 - najłatwiej to sprawdzić. Zauważ, że sortowanie można ustawić na poziomie serwera, bazy danych, tabeli i kolumny w tabeli. Ustawienie sortowania UTF8 w kolumnie powinno przesłonić wszystko inne do przechowywania, ale inne nadal będą włączać się podczas komunikowania się z bazą danych, jeśli nie są również UTF8. Jeśli nie masz pewności, po otwarciu jawnie ustaw połączenie na UTF8:

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

Teraz twoja baza danych i połączenie to UTF8, upewnij się, że twoja strona też jest. Ponownie, można to ustawić w więcej niż jednym miejscu (.htaccess, php.ini). Jeśli nie jesteś pewien/nie masz dostępu, po prostu zastąp to, co PHP wybiera domyślnie u góry strony:

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

Pamiętaj, że chcesz to zrobić na samym początku, zanim jakikolwiek tekst zostanie wyprowadzony z Twojej strony. Gdy tekst zostanie wypisany, jest potencjalnie za późno, aby spróbować określić kodowanie — możesz już być zablokowany na tym, co jest domyślne na twoim serwerze. Powtarzam to również w moich nagłówkach (być może przesadnie):

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

I zastępuję to również w formularzach, w których pobieram dane:

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

Szczerze mówiąc, jeśli ustawiłeś kodowanie na górze, rozumiem, że inne nadpisania nie są wymagane - ale i tak je zachowuję, ponieważ to też niczego nie psuje i wolę po prostu określić kodowanie jawnie, niż pozwól serwerowi przyjąć założenia.

Na koniec wspomniałeś, że w phpMyAdminie wstawiłeś ciąg i wyglądał on zgodnie z oczekiwaniami - czy na pewno strony phpMyAdmin są w UTF8? Nie sądzę, że są. Kiedy przechowuję dane UTF8 z mojego kodu PHP, są one wyświetlane w phpMyAdmin jak surowe 8-bitowe znaki. Jeśli wezmę ten sam ciąg i zapiszę go bezpośrednio w phpMyAdmin, wygląda to „poprawnie”. Więc zgaduję, że phpMyAdmin używa domyślnego zestawu znaków mojego lokalnego serwera, niekoniecznie UTF8.

Na przykład następujący ciąg przechowywany z mojej strony internetowej:

I can’t wait

Czyta tak w moim phpMyAdmin:

I can’t wait

Zachowaj więc ostrożność podczas testowania w ten sposób, ponieważ tak naprawdę nie wiesz, jakiego kodowania używa phpMyAdmin do wyświetlania lub połączenia z bazą danych.

Jeśli nadal masz problemy, wypróbuj poniższy kod. Najpierw tworzę tabelę do przechowywania tekstu w 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 ;

A oto trochę PHP do przetestowania. Zasadniczo pobiera dane wejściowe w formularzu, wysyła echo tych danych z powrotem do ciebie i przechowuje/pobiera tekst z bazy danych. Jak powiedziałem, jeśli przeglądasz dane bezpośrednio w phpMyAdmin, może się okazać, że nie wyglądają one dokładnie tam, ale na poniższej stronie powinny zawsze pojawiać się zgodnie z oczekiwaniami, ponieważ połączenie strony i bazy danych jest zablokowane w 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. Funkcje punktów przestrzennych przy użyciu Laravel Eloquent ORM

  2. MySQL LIMIT w skorelowanym podzapytaniu

  3. Unikaj podwójnych cudzysłowów ze zmienną wewnątrz echa HTML

  4. Transformacja wiersza do kolumny z różnych tabel (unia) w MySQL w wersji 8.0.17 przy użyciu Pivot

  5. Liczba kolumn nie odpowiada liczbie wartości w wierszu, ale tak jest