Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

ISO-8859-1 कैरेक्टर utf-8 mysql कॉलम में डालने वाले टेक्स्ट को छोटा करता है

आपके कोड में कुछ स्ट्रिंग को यूटीएफ 8 के रूप में संभाल नहीं रहा है। यह आपका PHP/HTML हो सकता है, यह आपके DB के संबंध में हो सकता है, या यह स्वयं DB हो सकता है - सब कुछ UTF8 के रूप में लगातार सेट किया जाना है, और यदि कुछ भी नहीं है, तो स्ट्रिंग ठीक वैसे ही काट दी जाएगी जैसे आप UTF8/गैर-UTF8 सीमा पार करते समय देखें।

मुझे लगता है कि आपका डीबी यूटीएफ 8 अनुपालन है - यह जांचना सबसे आसान है। ध्यान दें कि संयोजन को सर्वर स्तर, डेटाबेस स्तर, तालिका स्तर और तालिका के भीतर स्तंभ स्तर पर सेट किया जा सकता है। कॉलम पर यूटीएफ 8 संयोजन सेट करना भंडारण के लिए किसी और चीज को ओवरराइड करना चाहिए, लेकिन अन्य लोग अभी भी डीबी से बात करते समय किक करेंगे यदि वे यूटीएफ 8 भी नहीं हैं। यदि आप सुनिश्चित नहीं हैं, तो इसे खोलने के बाद कनेक्शन को UTF8 से स्पष्ट रूप से सेट करें:

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

अब आपका DB और कनेक्शन 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 हैं? मुझे नहीं लगता कि वे हैं। जब मैं अपने PHP कोड से UTF8 डेटा संग्रहीत करता हूं, तो यह phpMyAdmin में कच्चे 8-बिट वर्णों की तरह दिखता है। अगर मैं वही स्ट्रिंग लेता हूं और इसे सीधे phpMyAdmin में संग्रहीत करता हूं, तो यह 'सही' दिखता है। तो मैं अनुमान लगा रहा हूं कि phpMyAdmin मेरे स्थानीय सर्वर के डिफ़ॉल्ट वर्ण सेट का उपयोग कर रहा है, जरूरी नहीं कि UTF8।

उदाहरण के लिए, निम्न स्ट्रिंग मेरे वेब पेज से संग्रहीत है:

I can’t wait

मेरे phpMyAdmin में इस तरह पढ़ता है:

I can’t wait

तो इस तरह से परीक्षण करते समय सावधान रहें, क्योंकि आप वास्तव में नहीं जानते कि phpMyAdmin डिस्प्ले या डीबी कनेक्शन के लिए किस एन्कोडिंग का उपयोग कर रहा है।

यदि आपको अभी भी समस्या हो रही है, तो नीचे मेरा कोड आज़माएं। सबसे पहले मैं टेक्स्ट को 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 है। यह मूल रूप से आपके इनपुट को एक फॉर्म पर लेता है, उस इनपुट को आप पर वापस लेता है, और डीबी से टेक्स्ट को स्टोर/पुनर्प्राप्त करता है। जैसा कि मैंने कहा, यदि आप डेटा को सीधे phpMyAdmin में देखते हैं, तो आप पा सकते हैं कि यह ठीक नहीं दिखता है, लेकिन नीचे दिए गए पेज के माध्यम से यह हमेशा अपेक्षित रूप से दिखाई देना चाहिए, क्योंकि पेज और डीबी कनेक्शन दोनों को 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. MySQL में MATCH () फ़ंक्शन कैसे काम करता है

  2. शीर्ष 10 MySQL में सर्वोत्तम प्रथाओं

  3. मैं MySQL में बाएं जुड़ने में संबंधित पंक्तियों की गिनती कैसे प्राप्त करूं?

  4. MySQL और Splunk - चुनें और जुड़ें

  5. MYSQL - ऑर्डर टाइमस्टैम्प मान नवीनतम से सबसे पुराने क्रम में आरोही क्रम में हैं?