2012-02-28 11 views
9

के लिए प्रश्न चिह्न (????) दिखाते हैं मैंने प्रत्येक एन्कोडिंग सेट वैरिएबल सेट किया है जिसे मैं utf8 पर देख सकता हूं।रेल मेरे इनपुट utf8 डेटा

database.yml में:

development: &development 
    adapter: mysql2 
    encoding: utf8 

my.cnf में:

[client] 
default-character-set = utf8 

[mysqld] 
default-character-set = utf8 
skip-character-set-client-handshake 
character-set-server = utf8 
collation-server = utf8_general_ci 
init-connect = SET NAMES utf8 

और अगर मैं टर्मिनल में mysql ग्राहक चलाएँ:

mysql> show variables like 'character%'; 
+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | utf8      | 
| character_set_connection | utf8      | 
| character_set_database | utf8      | 
| character_set_filesystem | binary      | 
| character_set_results | utf8      | 
| character_set_server  | utf8      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 

mysql> show variables like 'collation%'; 
+----------------------+-----------------+ 
| Variable_name  | Value   | 
+----------------------+-----------------+ 
| collation_connection | utf8_general_ci | 
| collation_database | utf8_general_ci | 
| collation_server  | utf8_general_ci | 
+----------------------+-----------------+ 

लेकिन यह हवा को हरा है। जब मैं Rails ऐप से utf8 डेटा डालता हूं, तो अंत में यह ???????????? बन जाता है।

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

+0

देखें http://stackoverflow.com/questions/29805029/stored-non-english-characters-got-mysql-character-set-issue/29810725#: मैं mysql कनेक्शन स्ट्रिंग के अंत तक characterEncoding जोड़ा प्रश्न चिह्नों की चर्चा और उनके साथ कैसे निपटने के लिए 29810725। –

उत्तर

15

वैश्विक सेटिंग्स की जांच न करें लेकिन जब आप एप्लिकेशन के लिए विशिष्ट डेटाबेस से कनेक्ट हों। जब आपने mysql के लिए सेटिंग्स बदल दी हैं तो आपने अपने ऐप डेटाबेस के लिए सेटिंग्स भी बदल दी हैं।

सरल यह एप्लिकेशन डाटाबेस में MySQL करने के लिए लॉग इन करने की है की जाँच करने के लिए रास्ता:

mysql app_db_production -u db_user -p 

या रेल आदेश:

rails dbconsole production 

मेरे ऐप के लिए यह इस तरह दिखता है:

mysql> show variables like 'character%'; 
+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | utf8      | 
| character_set_connection | utf8      | 
| character_set_database | latin1      | 
| character_set_filesystem | binary      | 
| character_set_results | utf8      | 
| character_set_server  | utf8      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 
8 rows in set (0.00 sec) 

mysql> show variables like 'collation%'; 
+----------------------+-------------------+ 
| Variable_name  | Value    | 
+----------------------+-------------------+ 
| collation_connection | utf8_general_ci | 
| collation_database | latin1_swedish_ci | 
| collation_server  | utf8_general_ci | 
+----------------------+-------------------+ 
3 rows in set (0.00 sec) 

डेटाबेस संयोजन और वर्णमाला बदलने के लिए कमांड:

mysql> alter database app_db_production CHARACTER SET utf8 COLLATE utf8_general_ci ; 
Query OK, 1 row affected (0.00 sec) 

और याद अपने सभी तालिकाओं के लिए चारसेट और मिलान को बदलने के लिए:

ALTER TABLE tablename CHARACTER SET utf8 COLLATE utf8_general_ci; # changes for new records 
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; # migrates old records 

अब यह काम करना चाहिए।

+1

utf_general_ci के बजाय utf_unicode_ci का उपयोग करना चाह सकता है। http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8- सामान्य-ci-and-utf8-unicode-ci – mahemoff

+0

मैंने एक गिस्ट बनाया है जिसे मैं माइग्रेट करने के लिए SQL उत्पन्न करता था रेल ऐप जिसमें इस समस्या थी - हालांकि छोटे, यह खूबसूरती से गठित किया गया है: https://gist.github.com/richhollis/7153490 –

0

क्या आपके पास यह HTML में है?

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

या पर <!doctype html>

<meta charset="utf-8"> 

साथ एचटीएमएल 5 पृष्ठों आप ब्राउज़र UTF8 में तार भेज देने के लिए यह आवश्यकता हो सकती है।

+0

वैसे भी अच्छा है, लेकिन ध्यान रखें कि यदि डेटा को "????" के रूप में संग्रहीत किया जाता है तो यह आपकी मदद नहीं करेगा पहले से ही डेटाबेस में। –

0

मुझे आज कुछ समस्या है! यह मेरी मेज छोड़कर और नया बनाकर हल किया जाता है, फिर डीबी: माइग्रेट करें और सब कुछ सुंदर काम है!
चेतावनी:
$ mysql -u USER -p
mysql > drop database YOURDB_NAME_development;
mysql > create database YOURDB_NAME_development CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql > \q
$ rake db:migrate
शाबाश: यह इस तालिका

तो समस्त आपके डेटा को हटा जाएगा!

+0

तालिका डाटाबेस से विरासत में प्राप्त होती है। कॉलम टेबल से विरासत में मिलता है। इसलिए, यदि आपके पास डेटाबेस छोड़ने की विलासिता है, तो यह कोड सरल और प्रभावी है। –

1

किसी और के लिए ठीक है के लिए जिसे @Ravbaker जवाब इसे काट नहीं है .. कुछ और सुझाव दिए गए

MySQL एन्कोडिंग कई स्तरों में निर्दिष्ट है: सर्वर, डाटाबेस, कनेक्शन, टेबल और यहां तक ​​कि क्षेत्र/स्तंभ। मेरी समस्या यह थी कि फ़ील्ड/कॉलम को लैटिन (जो अन्य सभी एन्कोडिंग पर सवार हो) पर मजबूर होना पड़ा था।मैंने फ़ील्ड को टेबल एन्कोडिंग पर वापस सेट किया (जो यूटीएफ -8 था) और दुनिया फिर से अच्छी थी।

इनमें से अधिकतर सेटिंग्स सामान्य स्थानों पर सेट की जा सकती हैं: my.cnf, क्वेरी और रेल डेटाबेस.इमल फ़ाइल को बदलें।

ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET utf8; 

वह प्रश्न था जो मेरे लिए चाल थी।

के लिए सर्वर/कनेक्शन एनकोडिंग my.cnf का उपयोग करें और डेटाबेस/तालिका/स्तंभ एन्कोडिंग उपयोग के लिए database.yml प्रश्नों

(तुम भी अन्य तरीकों से इन प्राप्त कर सकते हैं)

+0

सावधान रहें ... 'वैकल्पिक ... संशोधित करें' और 'वैकल्पिक ... अलग-अलग चीजें करने के लिए कनवर्ट करें। यदि आपके पास एकमात्र पाठ है तो एसीआईआई है, या तो करेगा। यदि आपके पास वर्तमान में कॉलम में सही लैटिन 1 बाइट्स हैं, तो बाइट्स को बदलने के लिए आपको 'कनवर्टर टू' की आवश्यकता है। –

3

मैं एक ही समस्या थी ।

use this: jdbc:mysql://localhost/dbname?characterEncoding=utf8 
instead of this: jdbc:mysql://localhost/dbname 
संबंधित मुद्दे