2011-10-28 12 views
5

का उपयोग करके MySQL तालिका में छोटा कर दिया गया है। मैं perl/dBI का उपयोग कर एक MySQL तालिका में utf-8 स्ट्रिंग्स लिखने की कोशिश कर रहा हूं। किसी कारण से स्ट्रिंग को पहले गैर-असीसी चरित्र में छोटा कर दिया जा रहा है।यूआरएफ -8 स्ट्रिंग को पर्ल/डीबीआई

उदाहरण के लिए, अगर मैं निम्न तालिका की स्थापना:

CREATE DATABASE testdb DEFAULT CHARSET=utf8; 
CREATE TABLE testdb.testtable (textval CHAR(30)) DEFAULT CHARSET=utf8; 

और फिर निम्नलिखित पर्ल कोड चलाएँ:

#!/usr/bin/perl 
use strict; 
use DBI; 
my $dbh = DBI->connect('DBI:mysql:host=localhost;database=testdb', 'testuser', 'somepassword', {mysql_enable_utf8 => 1}) or die $DBI::errstr; 
$dbh->do('SET NAMES utf8'); 
$dbh->do("INSERT INTO testtable (textval) VALUES ('the N\xFCrburgring')"); 

यह वास्तव में लिखते हैं "एन"।

271 Query INSERT INTO testtable (textval) VALUES ('the Nürburgring') 

तो स्ट्रिंग DB सर्वर बरकरार तक पहुंच रहा है: MySQL क्वेरी लॉग में देख रहे हैं

(जब यह "नुर्बुर्गिंग" लेखन किया जाना चाहिए), मैं इस को देखते हैं।

अगर मैं MySQL कंसोल में सीधे ही क्वेरी दर्ज करें:

INSERT INTO testtable (textval) VALUES ('the Nürburgring'); 

पूरी स्ट्रिंग सही ढंग से लिखा है। कोई विचार क्या मैं गलत कर रहा हूँ?

+0

और यह अगर आप '\ xFC'' अपनी स्क्रिप्ट में ü' को बदलने के बारे में क्या है? – TLP

+0

यह वही बात करता है यदि मैं पर्ल कोड में एक शाब्दिक ü का उपयोग करता हूं। – plasticinsect

उत्तर

4

आपने विशेषता mysql_enable_utf8 सेट की है, इसलिए आपने इंटरफ़ेस का वादा किया है कि आप इसे वर्णों की एक पर्ल स्ट्रिंग देंगे। हालांकि, यह लैटिन 1 एन्कोडिंग में ऑक्टेट्स का बफर है।

use Devel::Peek qw(Dump); 
Dump "the N\xfcrburgring"; 
# FLAGS = (POK,READONLY,pPOK) 
# PV = 0x208e4f0 "the N\374rburgring"\0 

फिक्स सरल है। या तो \x पलायन के बिना शाब्दिक वर्णों notate, utf8 pragma का उपयोग पर्ल बताते हैं कि अपने स्रोत कोड UTF-8 में है और अपने संपादक के साथ UTF-8 एन्कोडिंग में स्रोत को बचाने के लिए ...

use utf8; 
use Devel::Peek qw(Dump); 
Dump "the Nürburgring"; 
# FLAGS = (POK,READONLY,pPOK,UTF8) 
# PV = 0x20999f0 "the N\303\274rburgring"\0 [UTF8 "the N\x{fc}rburgring"] 

... या में ओक्टेट्स डिकोड एक स्ट्रिंग। अधिकांश समय आप शाब्दिक के साथ काम नहीं कर रहे हैं, लेकिन बाहर से आने वाले डेटा के साथ, learn about the whole topic of encoding बेहतर है।

use Encode qw(decode); 
use Devel::Peek qw(Dump); 
Dump decode 'Latin1', "the N\xfcrburgring"; 
# FLAGS = (TEMP,POK,pPOK,UTF8) 
# PV = 0x208f6b0 "the N\303\274rburgring"\0 [UTF8 "the N\x{fc}rburgring"] 
+0

स्पष्टीकरण के लिए धन्यवाद। मुझे लगता है मैं अब समझ गया। मैंने डालने की रेखा को '$ dbh-> करें (डीकोड (' लैटिन 1 ', "टेस्टटेबल (टेक्स्टवल) VALUES (' एन \ xFCrburgring ') में शामिल करें));' और अब यह पूरी तरह से काम करता है। – plasticinsect

संबंधित मुद्दे