2013-08-26 54 views
16

Tôi vô tình sử dụng mã hóa ký tự latin1_swedish_ci mặc định cho tất cả các hàng varchar trong cơ sở dữ liệu của tôi trong quá trình phát triển và tôi đã xác định rằng đây là gốc của các vấn đề mã hóa ký tự mà tôi gặp phải. Ngoài ra, có vẻ như hầu hết mọi người trong những ngày này đều đề xuất rằng utf8_unicode_ci được sử dụng.Làm cách nào để thay đổi đối chiếu tất cả các hàng từ latin1_swedish_ci thành utf8_unicode_ci?

Tôi muốn chuyển đổi mã hóa ký tự cho tất cả các hàng trong cơ sở dữ liệu của tôi từ latin1_swedish_ci thành utf8_unicode_ci, nhưng cách duy nhất tôi biết cách làm là thay đổi hàng từng hàng trong phpMyAdmin. .

Có cách nào nhanh hơn, chẳng hạn như truy vấn có thể chạy thay đổi collation của tất cả các hàng varchar/văn bản từ latin1_swedish_ci thành utf8_unicode_ci không?

Trả lời

35

Nếu các cột được sử dụng đặc tính bảng mặc định thiết lập sau đó nó chỉ là một truy vấn mỗi bảng để chuyển đổi:

ALTER TABLE t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

Nếu bộ ký tự được thiết lập riêng biệt trên mỗi cột, AFAIK không có cách nào để làm điều đó trên tất cả các cột của tất cả các bảng trong cơ sở dữ liệu trực tiếp trong MySql, nhưng bạn có thể viết một chương trình nhỏ trong ngôn ngữ mà bạn chọn.

chương trình của bạn sẽ truy vấn bảng INFORMATION_SCHEMA.COLUMNS và nhìn vào CHARACTER_SET_NAME cột:

SELECT * FROM `INFORMATION_SCHEMA.COLUMNS` 
WHERE TABLE_SCHEMA = 'dbname' AND CHARACTER_SET_NAME = 'latin1' 

Đối với mỗi kết quả chèo nó tầm thường để tổng hợp và thực hiện một truy vấn ALTER TABLE ngay tại chỗ mà thay đổi bộ ký tự và collation thích hợp:

ALTER TABLE t MODIFY col TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

trong các truy vấn trên t, colTEXT sẽ là giá trị của các TABLE_NAME, COLUMN_NAMEDATA_TYPE cột từ tập hợp kết quả INFORMATION_SCHEMA.COLUMNS.

+0

Cảm ơn bạn! nó hoạt động rất tốt và đã cứu tôi một khoảng thời gian rất lớn! – Nate

+0

Câu trả lời hay. Theo như tôi biết, 'utf8_unicode_ci' nên được sử dụng thay vì' utf8_general_ci', vì 'utf8_unicode_ci' chính xác hơn. Vì vậy, nên sử dụng 'utf8_unicode_ci'. http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci –

+0

@Sudarshan_SMD bạn nói đúng, không chắc tại sao tôi dùng chung thay vì unicode, đặc biệt là xem xét câu hỏi nói chung, và nó đã quá lâu rồi. Cảm ơn vì đã bắt nó! – Jon

9

Bạn thực sự có thể thực hiện việc này bên trong MySQL, sử dụng quy trình.

Dựa trên https://stackoverflow.com/a/12718767/1612273. Nó sử dụng cơ sở dữ liệu hiện tại, vì vậy hãy chắc chắn rằng bạn đang làm nó trên một trong những quyền!

delimiter // 

DROP PROCEDURE IF EXISTS convert_database_to_utf8 // 

CREATE PROCEDURE convert_database_to_utf8() 
BEGIN 
    DECLARE table_name VARCHAR(255); 
    DECLARE done INT DEFAULT FALSE; 

    DECLARE cur CURSOR FOR 
     SELECT t.table_name FROM information_schema.tables t WHERE t.table_schema = DATABASE() AND t.table_type='BASE TABLE'; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

    OPEN cur; 
     tables_loop: LOOP 
      FETCH cur INTO table_name; 

      IF done THEN 
       LEAVE tables_loop; 
      END IF; 

      SET @sql = CONCAT("ALTER TABLE ", table_name, " CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci"); 
      PREPARE stmt FROM @sql; 
      EXECUTE stmt; 
      DROP PREPARE stmt; 
     END LOOP; 
    CLOSE cur; 
END // 

delimiter ; 
call convert_database_to_utf8(); 
Các vấn đề liên quan