2013-08-26 1 views
16

나는 개발 과정에서 내 데이터베이스의 모든 varchar 행에 대해 기본 latin1_swedish_ci 문자 인코딩을 사용하지 않고이 문자 인코딩 문제의 근원이라고 판단했습니다. 그 외에도 요즘 대부분의 사람들이 utf8_unicode_ci를 사용하는 것이 좋습니다.latin1_swedish_ci에서 utf8_unicode_ci로 모든 행의 데이터 정렬을 변경하는 방법은 무엇입니까?

내가 utf8_unicode_ci하는 latin1_swedish_ci에서 내 데이터베이스에있는 모든 행의 문자 인코딩을 변환하고 싶습니다,하지만 난이 수행하는 방법을 알고있는 유일한 방법은 변경입니다 행 단위 소모 정말 시간에 phpMyAdmin에서, .

latin1_swedish_ci에서 utf8_unicode_ci로 모든 varchar/text 행의 데이터 정렬을 변경하는 쿼리와 같이 더 빠른 방법이 있습니까? 문자 세트가 각 열을 개별적으로 설정되어

ALTER TABLE t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

경우, AFAIK 그렇게 할 수있는 방법은 없습니다 : 열 후 설정 한 기본 테이블 문자를 사용하는 경우

답변

35

그것은 변환 테이블 당 하나 개의 쿼리 데이터베이스에있는 모든 테이블의 모든 열을 MySql에 직접 입력 할 수 있지만 원하는 언어로 작은 프로그램을 작성할 수 있습니다.

INFORMATION_SCHEMA.COLUMNS 테이블을 조회하고 CHARACTER_SET_NAME 열을 보일 것이다 당신의 프로그램 : 그것은 합성 및 문자 집합 및 정렬을 적절하게 변경 자리에 ALTER TABLE 쿼리를 실행 사소한 행

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

각 결과의 경우 : 위의 질의 t, colTEXTTABLE_NAME의 값이 될 것이다에서

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

, COLUMN_NAMEDATA_TYPE 열을 INFORMATION_SCHEMA.COLUMNS 결과 집합에서 가져옵니다.

+0

고마워요! 그것은 큰 일을했고 엄청난 시간을 절약 해주었습니다! – Nate

+0

좋은 답변입니다. 내가 아는 한,'utf8_unicode_ci'가'utf8_general_ci' 대신에 사용되어야합니다. 왜냐하면'utf8_unicode_ci'가 더 정확하기 때문입니다. 따라서'utf8_unicode_ci'의 사용을 권장합니다. http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci –

+0

@Sudarshan_SMD 맞습니다. 왜 유니 코드 대신 일반을 사용했는지 모르겠습니다. 특히이 질문에 대해 장군이 말했듯이, 너무 오래되었습니다. 그것을 잡아 주셔서 감사합니다! – Jon

9

당신은 실제로 절차를 사용하여 MySQL 내부에서 이것을 할 수 있습니다.

https://stackoverflow.com/a/12718767/1612273에 기초 함. 현재 데이터베이스를 사용하므로 올바른 작업을 수행하고 있는지 확인하십시오!

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();