MySQL में सेट NAMES utf8?


110

मैं अक्सर MySQL का उपयोग करके PHP स्क्रिप्ट में नीचे इस तरह के कुछ देखता हूं

query("SET NAMES utf8");   

मुझे कभी भी किसी प्रोजेक्ट के लिए ऐसा नहीं करना पड़ा, इसलिए मेरे पास इसके बारे में कुछ बुनियादी सवाल हैं।

  1. क्या यह कुछ ऐसा है जो केवल पीडीओ के साथ किया जाता है?
  2. यदि यह पीडीओ की विशिष्ट बात नहीं है, तो इसे करने का उद्देश्य क्या है? मुझे लगता है कि यह mysql के लिए एन्कोडिंग सेट कर रहा है, लेकिन मेरा मतलब है, मुझे इसका उपयोग कभी नहीं करना पड़ा है तो मैं इसका उपयोग क्यों करना चाहूंगा?

4
SQL इंजेक्शन के कारण "SET NAMES utf8" से बचा जाना चाहिए। विवरण के लिए php.net/manual/en/mysqlinfo.congets.charset.php देखें।
मस्कैलास्टिक

3
@masakielastic मैं यह नहीं देखता कि 'सेट नेम utf8' को स्थापित करने पर एसक्यूएल इंजेक्शन का क्या खतरा है? उचित MySQL एपीआई का उपयोग करना कहां धागा है?
ब्रॉडबैंड

3
मेरी बेदर्दी के लिए क्षमा करें। Ircmaxell का उत्तर देखें: stackoverflow.com/a/12118602/531320 Althogh "SET NAMES" को UTF-8 का उपयोग करने में कोई समस्या नहीं है, संभावना है कि आप भविष्य में GBK या Big5 (चीनी) या Shift_JIS (जापानी) का उपयोग नहीं करेंगे। ।
मस्कैलास्टिक

जवाबों:


74

जब भी आप सर्वर पर डेटा भेजना चाहते हैं, तो ऐसे वर्ण हैं जिन्हें शुद्ध ASCII में नहीं दिखाया जा सकता है, जैसे 'ñ' या 'ö'।

यदि क्लाइंट कनेक्शन से डिफ़ॉल्ट रूप से UTF-8 एन्कोडिंग की अपेक्षा करने के लिए MySQL उदाहरण कॉन्फ़िगर नहीं किया गया है (कई, प्रत्येक स्थान और प्लेटफ़ॉर्म पर निर्भर करता है।)

यदि आप जानते हैं कि यूनिकोड कैसे काम करता है, तो http://www.joelonsoftware.com/articles/Unicode.html पढ़ें ।

सेट नाम का विकल्प देखने के लिए "SET NAMES" का उपयोग करना है या नहीं इसके बारे में वास्तव में क्या है पढ़ें ।


3
'ö' और 'ñ' ASCII विस्तारित हैं। क्या आपको अभी भी SET NAMES UTF8उनके लिए की आवश्यकता होगी ?
टिम

2
मैंने पाया है कि मुझे अक्सर utf8_decode ($ my_text) जोड़ना पड़ता है; PHP में विशेष UTF-8 वर्णों को ठीक से वेबसाइटों पर दिखाने के लिए जब MySQL से डेटा की पुष्टि की गई थी। MySQL में मेरे टेबल और कॉलम UTF-8 में सेट हैं - तो क्या यह आवश्यक होना चाहिए?
NexusRex 30'11

1
@ Vinko Vrsalovic: ज़रूरी नहीं ... मेरे पास utf8 में मेरी सभी फाइलें थीं, लेकिन मेरे पिछले होस्टर ने mysql charset को latin1 में सेट कर दिया है और क्योंकि मैंने havent ने mysql को बताया कि मैं utf8 में chars भेज रहा हूं (इसलिए सेट नाम utf8) ने उन्हें संग्रहीत किया लैटिन चारसेट में और मेरे सभी विशेष वर्ण (स्लोवेनियाई čšž) ऐसे दिखते थे जैसे कि वे एक कार से आगे निकल गए हों - एक और बात: जब आप phpmyadmin में खोज करते हैं तो आपको परिणाम नहीं मिलेंगे, क्योंकि एक č ऐसा है जैसे Å और इसी तरह
एरिक Čerpnjak

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

@Tim। वास्तव में "विस्तारित ASCII" जैसी कोई चीज नहीं है। विभिन्न एन्कोडिंगों का एक पूरा समूह है, जिन्हें सभी विस्तारित ASCII कहा जा सकता है (कोई भी एकल-बाइट वर्ण सेट, जहां पहले छमाही ASCII के समान है, और उन का भार है)।
TRIG

43

से मैनुअल :

सेट नाम इंगित करता है कि ग्राहक एसक्यूएल स्टेटमेंट को सर्वर पर भेजने के लिए किस वर्ण का उपयोग करेगा।

अधिक विस्तृत रूप से, (और एक बार फिर, मैन्युअल रूप से मैन्युअल रूप से उठा लिया गया ):

सेट नाम इंगित करता है कि ग्राहक एसक्यूएल स्टेटमेंट को सर्वर पर भेजने के लिए किस वर्ण का उपयोग करेगा। इस प्रकार, SET NAMES 'cp1251' सर्वर को बताता है, "इस क्लाइंट के आने वाले संदेश कैरेक्टर सेटpp5151 में हैं।" यह वर्ण सेट को भी निर्दिष्ट करता है जो सर्वर को क्लाइंट को परिणाम भेजने के लिए उपयोग करना चाहिए। (उदाहरण के लिए, यह इंगित करता है कि यदि आप किसी सेलेक्ट स्टेटमेंट का उपयोग करते हैं तो कॉलम वैल्यू के लिए कौन सा कैरेक्टर सेट करना है।)


6
मैं तुमसे प्यार करता हूँ। बस मेरी शाम हो गई!
karim79

34

सही एन्कोडिंग प्राप्त करना वास्तव में मुश्किल है - बहुत सारी परतें हैं:

  • ब्राउज़र
  • पृष्ठ
  • पीएचपी
  • माई एसक्यूएल

PHP से SQL कमांड "SET CHARSET utf8" यह सुनिश्चित करेगा कि ग्राहक पक्ष (PHP) को utf8 में डेटा मिलेगा, चाहे वे डेटाबेस में कैसे संग्रहीत हों। बेशक, उन्हें पहले सही ढंग से संग्रहीत करने की आवश्यकता है।

डीडीएल परिभाषा बनाम वास्तविक डेटा

तालिका / स्तंभ के लिए परिभाषित एन्कोडिंग वास्तव में इसका मतलब यह नहीं है कि डेटा उस एन्कोडिंग में हैं। यदि आप एक टेबल के रूप में परिभाषित किया गया है, utf8लेकिन अलग एन्कोडिंग के रूप में संग्रहीत किया गया है, तो MySQL उन्हें के रूप में इलाज करेंगे utf8और आप मुसीबत में हैं। जिसका मतलब है कि आपको पहले इसे ठीक करना होगा।

क्या जाँच करें?

आपको यह जांचने की जरूरत है कि प्रत्येक लेयर में डेटा इनकोडिंग कौन सी है।

  • HTTP हेडर, हेडर चेक करें।
  • जांचें कि वास्तव में अनुरोध के मुख्य भाग में क्या भेजा गया है।
  • यह न भूलें कि MySQL में लगभग हर जगह एन्कोडिंग है:
    • डेटाबेस
    • टेबल्स
    • कॉलम
    • सर्वर एक पूरे के रूप में
    • ग्राहक
      सुनिश्चित करें कि हर जगह सही है।

रूपांतरण

यदि आप उदाहरण में डेटा प्राप्त करते हैं windows-1250, और स्टोर करना चाहते हैं utf-8, तो स्टोर करने से पहले इस SQL ​​का उपयोग करें:

SET NAMES 'cp1250';

यदि आपके पास DB में डेटा है windows-1250और फिर से प्राप्त करना चाहते हैं utf8, तो उपयोग करें:

SET CHARSET 'utf8';

कुछ और नोट:

  • डेटा दिखाने के लिए बहुत "स्मार्ट" टूल पर भरोसा न करें। उदाहरण के लिए phpMyAdmin करता है (जब मैं इसका उपयोग कर रहा था तो कर रहा था) वास्तव में बुरा एन्कोडिंग। और यह सभी परतों से गुजरता है इसलिए इसका पता लगाना कठिन है।
  • इसके अलावा, इंटरनेट एक्सप्लोरर में वास्तव में अजीब नियमों के आधार पर एन्कोडिंग "अनुमान" का व्यवहार था।
  • सरल संपादकों का उपयोग करें जहां आप एन्कोडिंग स्विच कर सकते हैं। मैं MySQL कार्यक्षेत्र की सलाह देता हूं।

19

यह क्वेरी डेटाबेस में डेटा बनाने या अपडेट करने वाली क्वेरी से पहले लिखी जानी चाहिए, यह क्वेरी इस तरह दिखती है:

mysql_query("set names 'utf8'");

ध्यान दें कि आपको शीर्षलेख का उपयोग करना चाहिए जिसे आप हेडर में उपयोग कर रहे हैं उदाहरण के लिए यदि आप यूटीएफ -8 का उपयोग कर रहे हैं तो आप इसे हेडर में इस तरह से जोड़ते हैं या यह इंटरनेट एक्सप्लोरर के साथ एक समस्या उत्पन्न करेगा

तो आपका पेज इस तरह दिखता है

<html>
    <head>
        <title>page title</title>
        <meta charset="UTF-8" />   
    </head>
    <body>
    <?php
            mysql_query("set names 'utf8'");   
            $sql = "INSERT * FROM ..... ";  
            mysql_query($sql);
    ?>    

    </body>
</html>

8
आपको PHP mysql लाइब्रेरी का उपयोग नहीं करना चाहिए इसके बजाय आपको MySQLi या PDO का उपयोग करना चाहिए।
आंद्रे फिगुएरा

महान जवाब, उदाहरण के लिए धन्यवाद। यह एक उत्तर है जिसने मुझे यह कल्पना करने में मदद की कि मुझे क्या करने की आवश्यकता है और इसने मेरी समस्या को हल कर दिया!
जीटीएस

1
अंतिम टैग </ html> नहीं होना चाहिए <html>
GTS जो


5

SQL क्वेरी के माध्यम से ऐसा करने के बजाय php फ़ंक्शन का उपयोग करें: mysqli :: set_charset mysqli_set_charset

Note:

This is the preferred way to change the charset. Using mysqli_query() to set it (such as SET NAMES utf8) is not recommended.

अधिक जानकारी के लिए MySQL वर्ण सेट अवधारणा अनुभाग देखें।

से http://www.php.net/manual/en/mysqli.set-charset.php


1

सबको शुक्रीया!

उपयोग न करें: क्वेरी ("सेट NAMES utf8"); यह सेटअप सामान है और क्वेरी नहीं है। इसे सीधे सेट करें कनेक्शन से शुरू करें setCharset () (या समान विधि)

Parctice में कुछ छोटी बात:

स्थिति:

  • mysql सर्वर डिफ़ॉल्ट वार्ता के द्वारा latin1
  • अपने छेद app utf8 में है
  • कनेक्शन बिना किसी अतिरिक्त के किया जाता है (इसलिए: latin1) (कोई सेट NAMES utf8 ..., कोई set_charset () विधि / फ़ंक्शन)

स्टोर करें और पढ़ें डेटा कोई समस्या नहीं है क्योंकि लंबे समय तक mysql पात्रों को संभाल सकता है। यदि आप db में देखते हैं तो आप पहले ही देखेंगे कि इसमें बकवास है (उदाहरणार्थ phpmyadmin)।

अब तक यह कोई समस्या नहीं है! (गलत लेकिन अक्सर (यूरोप में) काम करता है) ।।

..अन्य ग्राहक / प्रोग्राम या एक परिवर्तित पुस्तकालय, जो सही काम करता है, डेटा को पढ़ेगा / बचाएगा। तो आप बड़ी मुसीबत में हैं!


0

पीडीओ ही नहीं। यदि sql उत्तर '????' की तरह है प्रतीक, आप के पूर्व निर्धारित charset (उम्मीद है कि UTF-8) वास्तव में सिफारिश की है:

if (!$mysqli->set_charset("utf8")) 
 { printf("Can't set utf8: %s\n", $mysqli->error); }

या प्रक्रिया शैली के माध्यम से mysqli_set_charset($db,"utf8")

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.