MySQL의 모든 테이블에서 모든 열의 문자 집합 및 데이터 정렬 변경


18

모든 열의 모든 테이블에서 이러한 명령문을 실행해야합니다.

alter table table_name charset=utf8;
alter table table_name alter column column_name charset=utf8;

MySQL 내에서 어떤 식 으로든 자동화 할 수 있습니까? 나는 mysqldump를 피하는 것을 선호한다

업데이트 : Richard Bronosky는 나에게 길을 보여주었습니다 :-)

모든 테이블에서 실행 해야하는 쿼리 :

alter table DBname.DBfield CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

다른 모든 쿼리를 생성하는 미친 쿼리 :

SELECT distinct CONCAT( 'alter table ', TABLE_SCHEMA, '.', TABLE_NAME, '  CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'DBname';

하나의 데이터베이스에서만 실행하고 싶었습니다. 한 번에 모두 실행하는 데 너무 오래 걸렸습니다. 테이블 당 필드 당 하나의 쿼리를 생성하는 것으로 나타났습니다. 그리고 테이블 당 하나의 쿼리 만 필요했습니다 (구출과 구별됨). 파일에서 출력을 얻는 것이 내가 그것을 깨닫는 방법이었습니다.

파일로 출력을 생성하는 방법 :

mysql -B -N --user=user --password=secret -e "SELECT distinct CONCAT( 'alter table ', TABLE_SCHEMA, '.', TABLE_NAME, '  CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'DBname';" > alter.sql

마지막으로 모든 쿼리를 실행하십시오.

mysql --user=user --password=secret < alter.sql

고마워 Richard. 당신은 남자입니다!

답변:


16

우선, 그냥 내 말을 듣지 마십시오! 이것으로 내 제안을 테스트하십시오.

select CONCAT('alter table ',TABLE_SCHEMA,'.',TABLE_NAME,' charset=utf8;') from information_schema.TABLES WHERE TABLE_SCHEMA != 'information_schema' limit 10; select CONCAT('alter table ',TABLE_SCHEMA,'.',TABLE_NAME,' alter column ',COLUMN_NAME,' charset=utf8;') from information_schema.COLUMNS WHERE TABLE_SCHEMA != 'information_schema' limit 10;

결과가 좋으면 limit 절을 제거하고 출력을 SQL 스크립트에 저장하거나 출력하여 mysql에 직접 출력 하십시오 . 다음과 같이 보일 것입니다.

mysql -B -N --host=prod-db1 --user=admin --password=secret -e "select CONCAT('alter table ',TABLE_SCHEMA,'.',TABLE_NAME,' charset=utf8;') from information_schema.TABLES WHERE TABLE_SCHEMA != 'information_schema'; select CONCAT('alter table ',TABLE_SCHEMA,'.',TABLE_NAME,' alter column ',COLUMN_NAME,' charset=utf8;') from information_schema.COLUMNS WHERE TABLE_SCHEMA != 'information_schema';" | mysql --host=prod-db1 --user=admin --password=secret

유효한 SQL을 사용하여 유효한 SQL을 생성하려고하면 게임 전체가 변경됩니다. 당신은 그것을 얼마나 많이 사용하는지에 놀랄 것입니다.


거의 다 왔어! 그러나 구문을 제대로 얻을 수 없습니다
Disintegrator

알았어 정답에 올바른 sintax를 추가하고 있습니다. 당신의 아이디어 규칙
Disintegrator

4

실제로 테이블에서 CONVERT TO를 사용하여 해당 테이블 내의 모든 열을 문자 집합 및 데이터 정렬로 변환 할 수 있습니다.

SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'databasename';

또한이 작업을 수행하려는 실제 데이터베이스를 선택하는 것이 더 합리적입니다. 그래서 이건:

... WHERE TABLE_SCHEMA = 'databasename';

이보다는

... WHERE TABLE_SCHEMA != 'information_schema';

그러나 모든 테이블에서 실제로 원한다면 전자를 사용할 수 있습니다. 그래도 나에게 약간 무거운 것으로 보입니다. :)


1

내가 사용한 모든 열에서 데이터 정렬을 변경하려면

SELECT CONCAT(  'ALTER TABLE ',  `TABLE_NAME` ,  ' CHANGE `',  `COLUMN_NAME` ,  '` `',`COLUMN_NAME` ,  '` ',  `DATA_TYPE` ,  '(',  `CHARACTER_MAXIMUM_LENGTH` ,  ') CHARACTER SET utf8 COLLATE utf8_swedish_ci ;' ) FROM  `COLUMNS` WHERE  `TABLE_SCHEMA` =  <schema> AND  `COLLATION_NAME` !=  'utf8_swedish_ci' ORDER BY  `TABLE_NAME` ,  `ORDINAL_POSITION` ;

0

information_schema데이터베이스를 사용하여 변경해야하는 열과 테이블을 찾을 수 있습니다. 당신은 그들을 찾을 수 있습니다 :

SELECT table_name, column_name FROM information_schema.`COLUMNS`
WHERE table_schema='your database' AND collation_name LIKE 'latin%';

그런 다음 SQL 스크립트, 저장 프로 시저 또는 선호하는 개발 언어를 사용하여 변경을 자동화 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.