2012-03-08 9 views
5

का उपयोग कर MySQL में यूटीएफ -8 सामग्री को स्टोर नहीं कर सकता है कुछ अजीब कारणों से मैं अपने MySQL डेटाबेस में यूटीएफ -8 डेटा जोड़ नहीं सकता। जब मैं एक गैर-लैटिन चरित्र दर्ज करता हूं, तो इसे ????? के रूप में संग्रहीत किया जाता है। बाकी सब कुछ ठीक से संग्रहीत किया जाता है। तो उदाहरण के लिए, "यह एक उदाहरण® ™ है" ठीक से संग्रहीत है, लेकिन "和 英 辞典" को "????" के रूप में संग्रहीत किया जाता है।जावा प्रीपेडस्टेटमेंट

कनेक्शन यूआरएल ठीक है:

private DataSource getDB() throws PropertyVetoException { 
    ComboPooledDataSource db = new ComboPooledDataSource(); 
    db.setDriverClass("com.mysql.jdbc.Driver"); 
    db.setJdbcUrl("jdbc:mysql://domain.com:3306/db?useUnicode=true&characterEncoding=UTF-8"); 
    db.setUser("..."); 
    db.setPassword("..."); 
    return db; 
} 

मैं PreparedStatement उपयोग कर रहा हूँ के रूप में आप उम्मीद करेंगे, मैं भी प्रवेश करने "के नाम UTF8 सेट" के रूप में कोई सुझाव की कोशिश की।

Connection conn = null; 
    PreparedStatement stmt = null; 
    ResultSet rs = null; 
    try { 
     conn = db.getConnection(); 

     stmt = conn.prepareStatement("set names utf8"); 
     stmt.execute(); 
     stmt = conn.prepareStatement("set character set utf8"); 
     stmt.execute(); 

        ... set title... 
     stmt = conn.prepareStatement("INSERT INTO Table (title) VALUES (?)"); 
     stmt.setString(1,title); 

     stmt.execute(); 
    } catch (final SQLException e) { 
    ... 

तालिका स्वयं ठीक दिखती है।

Default Character Set: utf8 
Default Collation: utf8_general_ci 
... 
Field title: 
Type text 
Character Set: utf8 
Collation: utf8_unicode_ci 

मैं यूनिकोड में प्रवेश करने से इसका परीक्षण किया ("和 英 辞典" विशेष रूप से) एक जीयूआई संपादक के माध्यम से और फिर मेज से चयन - और यह ठीक वापस आ गया था। तो यह जेडीबीसी के साथ एक मुद्दा प्रतीत होता है।

मुझे क्या याद आ रही है?

+0

क्या आप वाकई 'शीर्षक' की सही सामग्री रखते हैं? हो सकता है कि आप इसे आईएसओ-जो भी इस्तेमाल करते हुए फाइल से पढ़ लें? –

+0

हां, जब मैं शीर्षक पर ब्रेकपॉइंट डालता हूं तो मैं देख सकता हूं कि यह वास्तव में यूनिकोड है (उदा: और 英 辞典) और नहीं ???? – nostromo

+0

'utf8' एक स्ट्रिंग है, इसलिए इसे उद्धरणों में संलग्न करें: '' नाम सेट करें 'utf8' ''। चरित्र सेट के साथ गड़बड़ मत करो। –

उत्तर

3

यूएसएफ -8 वर्णसेट को सही ढंग से सेट करने के लिए MySQL सर्वर में 2 अंक हैं।

डाटाबेस स्तर

यह बात बनाने के द्वारा प्राप्त किया जाता है:

CREATE DATABASE 'db' CHARACTER SET 'utf8'; 

तालिका स्तर

तालिकाओं के सभी UTF-8 में भी होने की जरूरत है (जो लगता है आपके लिए मामला बनें)

CREATE TABLE `Table1` (
    [...] 
) DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; 

महत्वपूर्ण हिस्सा बनने डिफ़ॉल्ट charset = मुक़ाबला UTF8 = utf8_general_ci

अंत में, यदि आपका कोड सही तरीके UTF8 से निपटने नहीं कर रहे थे, तो आप अपने JVM स्टार्टअप पर से सेटिंग बदल कर UTF8 एन्कोडिंग का उपयोग करने के लिए मजबूर किया जा सकता था:

java -Dfile.encoding=UTF-8 [...] 

या का उपयोग करके वातावरण चर

"**JAVA_TOOLS_OPTIONS**" to -Dfile.encoding="UTF-8" 

या प्रोग्राम के रूप में बदल रहा है:

System.setProperty("file.encoding" , "UTF-8"); 

आशा है कि मदद की है (यह पिछले एक इच्छा प्रभाव के बाद से JVM स्टार्टअप पर डिफ़ॉल्ट वर्ण एन्कोडिंग का मूल्य कैश नहीं हो सकता है)।

JDBC:

+0

जेवीएम के लिए डिफ़ॉल्ट एन्कोडिंग सेट करना कुछ चीजों के लिए उपयोगी है, लेकिन निश्चित रूप से डेटाबेस में यूनिकोड डेटा को और बाहर करने की आवश्यकता नहीं है। ब्रेकपॉइंट के बारे में कल नॉस्ट्रोमो की टिप्पणी के आधार पर – jtahlborn

+0

। हम मान सकते हैं कि उसका जेवीएम पहले से ही यूनिकोड को सही तरीके से संभाला जा रहा है, इसलिए मैं मानता हूं कि उसके मामले में इसकी आवश्यकता नहीं है। – Kharaone

+0

वास्तव में तीन स्तर हैं। कनेक्शन स्तर भी है: http://stackoverflow.com/questions/9283575/getting-incorrectly-encoded-characters-when-retrieving-values-from-mysql-db –

1

यदि आप अपने mysql डेटाबेस में लॉग इन करते हैं और show variables like 'character%'; चलाते हैं तो यह कुछ अंतर्दृष्टि प्रदान कर सकता है।

चूंकि आप बहु-बाइट वर्णों के प्रश्न चिह्नों में एक-से-एक अनुपात प्राप्त कर रहे हैं, तो यह संभावना है कि कनेक्शन एक चरित्र सेट रूपांतरण कर रहा है और सिंगल बाइट के लिए चीनी वर्णों को प्रतिस्थापन चरित्र के साथ बदल रहा है सेट।

5

अपने JDBC- कनेक्शन स्ट्रिंग पर, आप सिर्फ इस तरह चारसेट एन्कोडिंग सेट की जरूरत है mysql: // स्थानीय होस्ट: 3306/dbname characterEncoding = UTF8

3

उपयोग stmt.setNString(...) बजाय stmt.setString(...)
डेटाबेस पक्ष में कॉलम संयोजन की जांच भी न भूलें।

+0

आप मेरा दिन बचाओ। –

0

स्थानीय लोगों की जांच करें- ubuntu डिफ़ॉल्ट उबंटू पर en_us लोकेल के साथ काम करता है और इसमें अन्य लोकेल स्थापित नहीं है। को जेडीबीसी के माध्यम से कनेक्ट करते समय वर्ण एन्कोडिंग = utf8 निर्दिष्ट करना होगा।

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