MySQL 테이블의 기본 문자 집합을 변경하는 방법은 무엇입니까?


100

table이 정의를 가져온 MySQL 이 있습니다 SQLYog Enterprise.

Table              Create Table                                             
-----------------  ---------------------------------------------------------
etape_prospection  CREATE TABLE `etape_prospection` (                       
                     `etape_prosp_id` int(10) NOT NULL AUTO_INCREMENT,      
                     `type_prosp_id` int(10) NOT NULL DEFAULT '0',          
                     `prosp_id` int(10) NOT NULL DEFAULT '0',               
                     `etape_prosp_date` datetime DEFAULT NULL,              
                     `etape_prosp_comment` text,                            
                     PRIMARY KEY (`etape_prosp_id`),                        
                     KEY `concerne_fk` (`prosp_id`),                        
                     KEY `de_type_fk` (`type_prosp_id`)                     
                   ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1  

default charset이 테이블의을에서 latin1으로 변경하고 싶습니다 utf8. 그렇게하는 방법 ?


3
MySQL에서 "UTF8"의 올바른 이름은 "utf8mb4"이고 문자 세트 "utf8"이 손상되었으며 최대 3 바이트 문자 만 지원합니다. 자세한 내용은 mysql 매뉴얼을 참조하거나 google "mysql"및 "utf8"... dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html
Samuel Åslund

답변:


210

테이블 default character set과 모든 문자 열을 새 문자 세트 로 변경하려면 다음 과 같은 명령문을 사용하십시오.

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

따라서 쿼리는 다음과 같습니다.

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;

23
반대로 ALTER TABLE tbl CHARACTER SET utf8다른 사람이 제안한 구문을 사용하는 경우 테이블의 기본 인코딩 만 변경합니다. 이 답변을 사용하면 기존 열이 변환되지 않습니다.
eaj

8
데이터베이스에서 ut8로 인코딩되지 않은 모든 테이블에이 변경 사항을 적용하려면이 쿼리를 사용하여 결과 쿼리를 실행할 수 있습니다. SELECT concat('alter table ', table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') FROM information_schema.tables WHERE table_schema='<your_database_name>' and table_collation != 'utf8_general_ci' GROUP BY table_name;
Maxooo

3
이것은 기본 문자 집합을 변경하지 않습니다 . eak이 말한대로 기본값을 변경하려면ALTER TABLE tbl CHARACTER SET utf8
Accountant م

7
나는 일반적으로 utf8을 사용하지 않고 대신 utf8mb4를 사용하여 utf8이 될 것으로 예상하는 것을 얻는 것을 추가하고 싶습니다. 설명하자면 : MySQL에서 utf8은 실제로 utf8의 하위 집합 일 뿐이며 utf8mb3이라는 이름이 더 좋습니다. 지정된 최대 4 바이트 대신 최대 3 바이트의 utf8 문자 만 인코딩 할 수 있습니다. 즉, 많은 이모지는 인코딩 할 수 없으며 DB에 쓰려고하면 손실됩니다. 예를 참조하십시오. medium.com/@adamhooper/… 자세한 내용은
dwt

7
멀티 바이트 당신은 사용할 수 있습니다ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
RN Kushwaha

19

테이블의 기본 문자 세트 변경 :

ALTER TABLE etape_prospection
  CHARACTER SET utf8,
  COLLATE utf8_general_ci;

문자열 열 문자 집합을 변경하려면 다음 쿼리를 실행하십시오.

ALTER TABLE etape_prospection
  CHANGE COLUMN etape_prosp_comment etape_prosp_comment TEXT CHARACTER SET utf8 COLLATE utf8_general_ci;

11
절대 utf8_general_ci를 사용해서는 안됩니다. 단순히 작동하지 않습니다. 그것은 50 년 전의 아스키 우스꽝 스러움의 나쁜 옛날로의 후퇴입니다. 유니 코드 대소 문자를 구분하지 않는 일치는 UCD의 foldcase 맵 없이는 수행 할 수 없습니다. 예를 들어, "Σίσυφος"에는 3 개의 다른 시그마가 있습니다. 또는 "TSCHüẞ"의 소문자가 "tschüβ"이지만 "tschüβ"의 대문자는 "TSCHÜSS"입니다. 당신이 옳을 수도 있고 빠를 수도 있습니다. 따라서 utf8_unicode_ci를 사용해야합니다. 정확성에 신경 쓰지 않으면 무한히 빠르게 만드는 것이 사소하기 때문입니다.
Yohanes AI

2
MySQL UTF8 문자 세트가 손상되었습니다. utf8mb4를 사용해야합니다!
Samuel Åslund

5

ALTER TABLEMySQL의 명령은 트릭을해야한다. 다음 명령은 테이블의 기본 문자 집합과 모든 열의 문자 집합을 UTF8로 변경합니다.

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

이 명령은 테이블의 모든 텍스트와 유사한 열을 새 문자 집합으로 변환합니다. 문자 집합은 문자 당 다른 양의 데이터를 사용하므로 MySQL은 일부 열의 유형을 변환하여 이전 열 유형과 동일한 수의 문자에 맞도록 충분한 공간을 확보합니다.

라이브 데이터를 수정하기 전에 ALTER TABLE MySQL 문서 를 읽는 것이 좋습니다 .


1
예, 트릭을 수행하지만 변환 방식 과 다른 점이 있습니다. 열에서 이전 charset 옵션을 자동으로 제거 할 수 없습니다.
tech_me

3

누군가가 모든 데이터베이스 테이블의 기본 문자 집합을 변경하고 데이터를 변환하기위한 완전한 솔루션을 찾고 있다면 다음 중 하나 일 수 있습니다.

DELIMITER $$

CREATE PROCEDURE `exec_query`(IN sql_text VARCHAR(255))
BEGIN
  SET @tquery = `sql_text`;
  PREPARE `stmt` FROM @tquery;
  EXECUTE `stmt`;
  DEALLOCATE PREPARE `stmt`;
END$$

CREATE PROCEDURE `change_character_set`(IN `charset` VARCHAR(64), IN `collation` VARCHAR(64))
BEGIN
DECLARE `done` BOOLEAN DEFAULT FALSE;
DECLARE `tab_name` VARCHAR(64);
DECLARE `charset_cursor` CURSOR FOR 
    SELECT `table_name` FROM `information_schema`.`tables`
    WHERE `table_schema` = DATABASE() AND `table_type` = 'BASE TABLE';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET `done` = TRUE;

SET foreign_key_checks = 0;
OPEN `charset_cursor`;
`change_loop`: LOOP
FETCH `charset_cursor` INTO `tab_name`;
IF `done` THEN
    LEAVE `change_loop`;
END IF;
CALL `exec_query`(CONCAT(
  'ALTER TABLE `',
  tab_name,
  '` CONVERT TO CHARACTER SET ',
  QUOTE(charset),
  ' COLLATE ',
  QUOTE(collation),
  ';'
));
CALL `exec_query`(CONCAT('REPAIR TABLE `', tab_name, '`;'));
CALL `exec_query`(CONCAT('OPTIMIZE TABLE `', tab_name, '`;'));
END LOOP `change_loop`;
CLOSE `charset_cursor`;
SET foreign_key_checks = 1;
END$$

DELIMITER ;

이 코드를 파일 안에 넣고 예를 들어 chg_char_set.sqlMySQL 터미널에서 호출하여 실행할 수 있습니다.

SOURCE ~/path-to-the-file/chg_char_set.sql

그런 다음 원하는 입력 매개 변수를 사용하여 정의 된 프로 시저를 호출합니다.

CALL change_character_set('utf8mb4', 'utf8mb4_bin');

결과를 테스트 한 후에는 해당 저장 프로 시저를 삭제할 수 있습니다.

DROP PROCEDURE `change_character_set`;
DROP PROCEDURE `exec_query`;

뷰를 선택하도록 유도하는 누락 된 조건이 있습니다. WHERE table_schema = DATABASE (); => WHERE table_schema = DATABASE () AND table_type = 'BASE TABLE'; 하지만 감사합니다 !! 이것이 내가 필요한 것입니다!
nguyenhoai890

2

로 기본값을 변경할 수 alter table set default charset있지만 기존 열의 문자 집합은 변경되지 않습니다. 이를 변경하려면 alter table modify column.

열의 문자 집합을 변경하면 더 넓은 범위의 문자를 저장할 수 있습니다. 애플리케이션은 mysql 클라이언트를 사용하여 db와 통신하므로 클라이언트 인코딩도 변경해야 할 수 있습니다.


나는 것 그것은 :-) 아이팟 터치의 제한된 키보드 아니었다면
조니

물론 아이팟 터치 / 아이폰이 있어야몇 가지 단점. :-P 당신이 그것을 언급 할 때까지 그들이 사라 졌다는 것을 결코 깨닫지 못했습니다. ;-)
Aufwind

따옴표 문자를 보려면 따옴표 문자 버튼을 누르고 계십시오.
Chloe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.