Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Karakter ISO-8859-1 memotong teks yang dimasukkan ke dalam kolom mysql utf-8

Sesuatu dalam kode Anda tidak menangani string sebagai UTF8. Bisa jadi PHP/HTML Anda, bisa jadi dalam koneksi Anda ke DB, atau bisa juga DB itu sendiri - semuanya harus disetel sebagai UTF8 secara konsisten, dan jika ada yang tidak, string akan terpotong persis seperti Anda lihat saat melewati batas UTF8/non-UTF8.

Saya akan menganggap DB Anda sesuai dengan UTF8 - itu paling mudah untuk diperiksa. Perhatikan bahwa susunan dapat diatur pada tingkat server, tingkat database, tingkat tabel, dan tingkat kolom dalam tabel. Menyetel susunan UTF8 pada kolom harus mengesampingkan hal lain untuk penyimpanan, tetapi yang lain akan tetap masuk saat berbicara dengan DB jika mereka juga bukan UTF8. Jika Anda tidak yakin, atur koneksi ke UTF8 secara eksplisit setelah Anda membukanya:

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

Sekarang DB &koneksi Anda adalah UTF8, pastikan halaman web Anda juga. Sekali lagi, ini dapat diatur di lebih dari satu tempat (.htaccess, php.ini). Jika Anda tidak yakin/tidak memiliki akses, ganti saja apa pun yang diambil PHP sebagai default di bagian atas halaman Anda:

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

Perhatikan bahwa Anda menginginkan hak di atas di awal, sebelum teks apa pun dikeluarkan dari halaman Anda. Setelah teks mendapatkan keluaran, kemungkinan sudah terlambat untuk mencoba dan menentukan penyandian - Anda mungkin sudah terkunci ke apa pun yang default di server Anda. Saya juga kemudian mengulangi ini di header saya (mungkin berlebihan):

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

Dan saya menimpanya pada formulir tempat saya mengambil data juga:

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

Sejujurnya, jika Anda telah mengatur pengkodean di atas, pemahaman saya adalah bahwa penggantian lainnya tidak diperlukan - tetapi saya tetap menyimpannya, karena itu juga tidak merusak apa pun, dan saya lebih suka hanya menyatakan encoding secara eksplisit, daripada membiarkan server membuat asumsi.

Terakhir, Anda menyebutkan bahwa di phpMyAdmin Anda memasukkan string dan tampak seperti yang diharapkan - apakah Anda yakin bahwa halaman phpMyAdmin adalah UTF8? Saya tidak berpikir mereka. Ketika saya menyimpan data UTF8 dari kode PHP saya, itu terlihat seperti karakter 8-bit mentah di phpMyAdmin. Jika saya mengambil string yang sama dan menyimpannya langsung di phpMyAdmin, terlihat 'benar'. Jadi saya kira phpMyAdmin menggunakan set karakter default dari server lokal saya, belum tentu UTF8.

Misalnya, string berikut disimpan dari halaman web saya:

I can’t wait

Dibaca seperti ini di phpMyAdmin saya:

I can’t wait

Jadi berhati-hatilah saat mengujinya, karena Anda tidak benar-benar tahu pengkodean apa yang digunakan phpMyAdmin untuk tampilan atau koneksi DB.

Jika Anda masih mengalami masalah, coba kode saya di bawah ini. Pertama saya membuat tabel untuk menyimpan teks dalam 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 ;

Dan inilah beberapa PHP untuk mengujinya. Ini pada dasarnya mengambil input Anda pada formulir, menggemakan input itu kembali kepada Anda, dan menyimpan/mengambil teks dari DB. Seperti yang saya katakan, jika Anda melihat data secara langsung di phpMyAdmin, Anda mungkin menemukan itu tidak terlihat di sana, tetapi melalui halaman di bawah ini akan selalu muncul seperti yang diharapkan, karena halaman &koneksi db keduanya terkunci ke 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. ckfinder php 2.6.2 pengaturan tampilan, tampilan, penyortiran tidak berfungsi

  2. Caching di JDBC

  3. Hirarki Kategori (PHP/MySQL)

  4. Bangun menu dinamis menggunakan Kumpulan Bersarang

  5. JSON vs. Serialized Array dalam database