2010-03-30 18 views
28

से एक MySQL डेटाबेस कनवर्ट करें मैं आईएसओ से यूटीएफ -8 में एक वेबसाइट को परिवर्तित कर रहा हूं, इसलिए मुझे MySQL डेटाबेस को भी परिवर्तित करने की आवश्यकता है।लैटिन से यूटीएफ -8

इंटरनेट पर, मैंने विभिन्न समाधान पढ़े, मुझे नहीं पता कि कौन सा चयन करना है।

मैं वास्तव में मेरे varchar स्तंभ बाइनरी में, इस तरह UTF-8 में तो कन्वर्ट करने के लिए की जरूरत है:

ALTER TABLE t MODIFY col BINARY(150); 
ALTER TABLE t MODIFY col CHAR(150) CHARACTER SET utf8; 

यह एक लंबे समय क्या करना है कि प्रत्येक स्तंभ के लिए, हर तालिका के, प्रत्येक डेटाबेस के लेता है ।

मेरे पास 10 टेबल हैं, जिनमें से प्रत्येक के साथ 20 टेबल हैं, लगभग 2 - 3 वर्चर कॉलम (2 कॉलम प्रत्येक प्रश्न) के साथ, यह मुझे 1000 प्रश्न लिखने के लिए देता है! यह कैसे करना है?

हल:

PASSWORD="" 
db=$1 

mysqldump --password=$PASSWORD --set-charset --skip-set-charset --add-drop-table --databases "$db" > /home/dev/backup/bdd.sql 

QUERY="ALTER DATABASE \`$db\` DEFAULT CHARACTER SET utf8;" 
mysql --password=$PASSWORD --database "$db" -e "$QUERY" 

mysql --password=$PASSWORD --default-character-set=utf8 < /home/dev/backup/bdd.sql 

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

+2

'--set-charset' और' --skip-सेट charset' सीधे झंडे प्रतिस्पर्धा नहीं कर रहे हैं? डॉक्स का कहना है कि वे 'सेट नाम' के उपयोग को प्रभावित करते हैं, लेकिन 'DEFAULT CHARSET = X' पैरामीटर सेट नहीं करते हैं जो प्रति तालिका 'mysqldump' के माध्यम से आउटपुट होता है। (mysql 5.5) – fideloper

उत्तर

19

आप डंप का उपयोग करके बहुत आसानी से ऐसा कर सकते हैं।

mysql --default-character-set=<your iso encoding> 

मुख्य विचार किसी भी बिना एक डंप बनाने के लिए है: एक डंप का उपयोग कर

mysqldump --skip-opt --set-charset --skip-set-charset 

फिर एक और डेटाबेस बनाने के लिए, उसके डिफ़ॉल्ट चरित्र UTF-8 में सेट करें और फिर से वापस अपने डंप लोड सेट डेटा एन्कोडिंग का संकेत।
तो, समय बनाने पर, तालिका का एन्कोडिंग डेटाबेस एन्कोडिंग से प्राप्त होगा और यूटीएफ -8 पर सेट होगा। और --default-character-set के साथ हम MySQL को स्वचालित रूप से हमारे डेटा को रिकोड करने के लिए कहते हैं।

+0

ओह यह अच्छा लगता है! प्रलेखन पर ऐसा क्यों नहीं है, या कोई भी उस बारे में बात नहीं करता है, धन्यवाद, मैं इसे –

+0

@Matthieu का परीक्षण करूंगा क्योंकि ऐसा लगता है कि आप इसे '--all-डेटाबेस' के साथ बनाने जा रहे हैं, कृपया इसे सावधानी बरतें। पहले एक डेटाबेस पर बैकअप लें और पूरे एल्गोरिदम का परीक्षण करें। –

+0

वैसे मैंने अभी परीक्षण किया है (केवल एक डेटाबेस पर, सुनिश्चित करने के लिए) और यह कॉलम के एन्कोडिंग को नहीं बदलता है (वे अभी भी "लैटिन" में हैं)। बस सुनिश्चित करने के लिए, mysqldump के लिए, 3 पैरामीटर को मूल्यों की आवश्यकता नहीं है? –

6

मैं mysqldump उपयोग कर रहा हूँ 10.11 Distrib 5.0.77

किसी कारण से वर बनाने के लिए विकल्पों इंजन और auto_increment बाहर रखा गया था। इससे बहुत सारी त्रुटियां त्रुटियां आईं, क्योंकि प्राथमिक कुंजी फ़ील्ड पर auto_increment चला गया था।

यह मेरे लिए काम किया। मैं sql फ़ाइल से charset को हटाने के लिए --opt और sed का उपयोग कर रहा हूँ।

mysqldump -p --opt --skip-set-charset --add-drop-table dbname > /tmp/dbname.sql 
sed -i 's/DEFAULT CHARSET=latin1//g' /tmp/dbname.sql 
ALTER DATABASE dbname DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_danish_ci; 
mysql -p --default-character-set=utf8 db < /tmp/dbname.sql 
+1

चूंकि MySQL 5.5 आउटपुट 'DEFAULT CHARSET = latin1' आउटपुट करेगा, जो' --default-character-set = utf8' आयात पर ओवरराइट नहीं करेगा, यह चरण आवश्यक हो जाता है। मैंने इसे 'sed -i'/DEFAULT CHARSET = latin1/DEFAULT CHARSET = utf8/g '/ tmp/dbname.sql' का उपयोग स्पष्ट रूप से utf8 पर सेट करने के लिए किया था। – fideloper

1
mysqldump --opt --skip-set-charset --default-character-set='latin1' -u root -p revive_adserver --result-file='dump.sql' 

vim dump.sql 

:%s/latin1/utf8/gi 

:wq 

mysql -u root -p 

ALTER DATABASE revive_adserver CHARACTER SET utf8; 

\q 

mysql -D revive_adserver -u root -p < dump.sql 
संबंधित मुद्दे