2010-03-30 27 views
28

Tôi đang chuyển đổi một trang web từ ISO sang UTF-8, vì vậy tôi cũng cần phải chuyển đổi cơ sở dữ liệu MySQL.Chuyển đổi cơ sở dữ liệu MySQL từ latin sang UTF-8

Trên Internet, tôi đọc các giải pháp khác nhau, tôi không biết nên chọn giải pháp nào.

Tôi có thực sự cần phải chuyển đổi các cột VARCHAR của tôi để nhị phân, sau đó sang UTF-8 như thế:

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

Phải mất một thời gian dài để làm điều đó cho mỗi cột, mỗi bảng, mỗi cơ sở dữ liệu .

Tôi có 10 cơ sở dữ liệu, với 20 bảng mỗi bảng, với khoảng 2 - 3 cột VARCHAR (2 truy vấn mỗi cột), điều này cho tôi khoảng 1000 truy vấn để viết! Làm thế nào để làm nó?

Resolved: tôi gửi mã mà tôi đã sử dụng:

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 

Xem câu trả lời dưới đây để biết thêm thông tin.

+2

Không phải '--set-charset' và' --skip-set-charset' cờ cạnh tranh trực tiếp? Tài liệu cho biết chúng ảnh hưởng đến việc sử dụng 'SET NAMES', nhưng không đặt tham số' DEFAULT CHARSET = X' là kết quả đầu ra thông qua 'mysqldump' trên mỗi bảng. (mysql 5.5) – fideloper

Trả lời

19

Bạn có thể làm điều đó rất dễ dàng bằng cách sử dụng bãi chứa. Thực hiện một bãi sử dụng

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

Sau đó tạo cơ sở dữ liệu khác, thiết lập ký tự mặc định của nó thiết lập để UTF-8 và sau đó tải đống rác của anh trở lại với:

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

Ý tưởng chính là làm cho một bãi chứa mà không cần bất kỳ dấu hiệu của mã hóa dữ liệu.
Vì vậy, tại thời điểm tạo, mã hóa bảng sẽ được kế thừa từ mã hóa cơ sở dữ liệu và được đặt thành UTF-8. Và với --default-character-set, chúng tôi yêu cầu MySQL tự động mã hóa dữ liệu của mình.

+0

Điều này có vẻ tốt đẹp! Tại sao không phải là trên các tài liệu, hoặc không ai nói về điều đó bất cứ nơi nào, nhờ tôi sẽ kiểm tra nó –

+0

@ Matthieu như nó có vẻ như bạn sẽ làm cho nó với '--all-cơ sở dữ liệu', xin vui lòng làm cho nó với biện pháp phòng ngừa. Thực hiện sao lưu và kiểm tra toàn bộ thuật toán trên một cơ sở dữ liệu trước. –

+0

Tôi chỉ thử nghiệm (trên một cơ sở dữ liệu duy nhất, để chắc chắn) và điều này không thay đổi mã hóa của các cột (chúng vẫn còn trong "latin"). Chỉ cần chắc chắn, đối với mysqldump, 3 tham số không cần giá trị? –

6

Tôi đang sử dụng mysqldump Ver 10.11 distrib 5.0.77

Đối với một số lý do tạo các tùy chọn động cơ và auto_increment được bỏ qua. Điều này gây ra rất nhiều lỗi chèn, vì auto_increment đã biến mất trên các trường khóa chính.

Điều này phù hợp với tôi. Tôi đang sử dụng --opt và sử dụng sed để loại bỏ charset từ tập tin sql.

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

Vì Mysql 5.5 sẽ xuất ra 'DEFAULT CHARSET = latin1', mà' --default-character-set = utf8' sẽ không ghi đè lên quá trình nhập, bước này trở nên cần thiết. Tôi đã sử dụng 'sed -i 's/DEFAULT CHARSET = latin1/DEFAULT CHARSET = utf8/g'/tmp/dbname.sql' để đặt nó thành 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 
Các vấn đề liên quan