2013-03-30 41 views
6

Hôm qua là lần đầu tiên tôi xuất khẩu cơ sở dữ liệu Mysql của tôi và tôi thấy một số nhân vật rất lạ ở bãi như:mysqldump xuất dữ liệu trong một nhân vật xấu thiết

INSERT INTO `piwik_archive_blob_2013_01` VALUES (15,'Actions_actions_url_6',1,'2013-01-17','2013-01-17',1,'2013-01-20 07:36:53','xuNM0ý/œ#&ÝÕ³\ZõNYpÊÀì#!üw7Hж}°ÀAáZoN*šgµ\'GWª[Yûðe¯57 ÃÁÆ7|Ÿ\'Ü%µDh©-EÛ^ËL±ÕÞtª[email protected](,b±ßZ.ÒÃ6b²aiÓÍ)87[­ïÎœ,æya¥uÒ<|+íª7MNuïÝ¿8ñ%1Ʊ>Ú­X'); 

Các phiên bản của máy chủ của tôi MySQL là: 5.1 .66-0 + squeeze1 (Debian). Cơ sở dữ liệu này được tạo tự động bởi tập lệnh thiết lập Piwik.

Dưới đây là những gì tôi đã cố gắng để khắc phục vấn đề này:

# 1 Trước tiên tôi đã kiểm tra các cơ sở dữ liệu charset.

> show table status; 

26 bảng có collation utf8_general_ci có vẻ khá bình thường. tôi đoán mysqldump xuất khẩu trong một charset khác nhau Vì vậy, tôi đã cố gắng (latin1?):

mysqldump -u user -p**** --all-databases --default-character-set=utf8 | gzip -9 > dump.sql.gz 

quả = Tôi vẫn có những nhân vật kỳ lạ tương tự.

Lưu ý) sau này tôi đã biết rằng bộ ký tự mặc định cho mysqldump là utf8, bất kể bộ ký tự mặc định của máy chủ. Vì vậy, --default-character-set=utf8 là vô ích.

# 2 Sau đó, tôi nghĩ rằng tôi có thể giải quyết vấn đề bằng cách cập nhật conf mysql. Các conf ban đầu là:

mysql> show variables like "%character%";show variables like "%collation%"; 

+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | latin1      | 
| character_set_connection | latin1      | 
| character_set_database | latin1      | 
| character_set_filesystem | binary      | 
| character_set_results | latin1      | 
| character_set_server  | latin1      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 
+----------------------+-------------------+ 
| Variable_name  | Value    | 
+----------------------+-------------------+ 
| collation_connection | latin1_swedish_ci | 
| collation_database | latin1_swedish_ci | 
| collation_server  | latin1_swedish_ci | 
+----------------------+-------------------+ 

Vì vậy, tôi cập nhật /var/lib/mysql/my.cnf và tôi nói thêm:

[mysqld] 
init_connect='SET collation_connection = utf8_general_ci' 
init_connect='SET NAMES utf8' 
character-set-server=utf8 
collation-server=utf8_general_ci 
default-character-set=utf8 
default-collation=utf8_general_ci 

[mysqldump] 
default-character-set=utf8 

Sau đó

/etc/init.d/mysql restart 
mysql> show variables like "%character%";show variables like "%collation%"; 

+--------------------------+----------------------------+ 
| 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/ | 
+--------------------------+----------------------------+ 
+----------------------+-------------------+ 
| Variable_name  | Value    | 
+----------------------+-------------------+ 
| collation_connection | utf8_general_ci | 
| collation_database | latin1_swedish_ci | 
| collation_server  | utf8_general_ci | 
+----------------------+-------------------+ 

quả = cùng các ký tự lạ.

# 3 tôi đã thay đổi character_set_databasecollation_database:

mysql> ALTER DATABASE piwik default character SET utf8 collate utf8_general_ci; 

mysql> show variables like "%character%";show variables like "%collation%"; 

+--------------------------+----------------------------+ 
| 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/ | 
+--------------------------+----------------------------+ 
+----------------------+-----------------+ 
| Variable_name  | Value   | 
+----------------------+-----------------+ 
| collation_connection | utf8_general_ci | 
| collation_database | utf8_general_ci | 
| collation_server  | utf8_general_ci | 
+----------------------+-----------------+ 

quả = cùng các ký tự lạ.

# 4 Tôi hiểu bây giờ tôi nên đã thay đổi nhân vật mặc định trong MySQL (latin1) để UTF8 trước tạo cơ sở dữ liệu.

collation utf8_general_ci (# 1) nghĩa là dữ liệu được lưu trữ trong utf8. Tuy nhiên, nó có thể là mysqldump nghĩ rằng dữ liệu được lưu trữ trong latin1 và mã hóa dữ liệu trong utf8? Điều đó có nghĩa là dữ liệu cuối cùng được mã hóa utf8 đôi (tiếng thở dài). Trong trường hợp này làm thế nào tôi có thể khắc phục vấn đề?

Cảm ơn sự giúp đỡ của bạn.

ps) Tôi tự hỏi tại sao Piwik không yêu cầu thay đổi bộ ký tự mặc định của cơ sở dữ liệu thành utf8.

+0

gì * nên * là nơi bạn nhìn thấy những ký tự? Làm thế nào chính xác là bạn xem các ký tự? – deceze

+0

Tôi thấy các ký tự này khi mở tệp sql bằng ZendStudio. –

+0

Và dữ liệu bạn mong đợi là gì? – deceze

Trả lời

0

Theo tên bảng "piwik_archive_ blob _2013_01", tôi đoán cột chứa các ký tự lạ là loại BLOB.

Cột BLOB chứa dữ liệu nhị phân. Đó là lý do tại sao nó chứa những nhân vật kỳ lạ này. Điều này được mong đợi.

Đừng lo lắng về điều đó, tôi chắc chắn rằng MysqlDump biết cách kết xuất dữ liệu này.

Chúc mừng, Eric.

+0

Bạn sẽ ngạc nhiên về những gì mysqldump làm và không biết ... nó cực kỳ không thông minh, và sẽ vui vẻ sản xuất các tập tin borked yêu cầu un-borking cẩn thận để nhập khẩu. –

+0

--hex-blob nói chung sẽ làm việc cho điều này với dữ liệu nhị phân. Các giải pháp bộ ký tự sẽ không hoạt động cho các đốm màu, vì câu trả lời này cho biết –

0

Có thể hệ điều hành đang thay đổi bộ ký tự trong khi xuất và bỏ qua tham số bộ ký tự mặc định.

Để chắc chắn rằng việc xuất khẩu không sử dụng sử dụng hệ điều hành charset tham số kết quả-file

Kiểm tra bài viết này: http://nathan.rambeck.org/blog/1-preventing-encoding-issues-mysqldump

+0

tính đến hôm nay, liên kết dường như bị hỏng – superjos

Các vấn đề liên quan