Thay đổi bộ ký tự và đối chiếu trong tất cả các cột trong tất cả các bảng trong MySQL


18

Tôi cần phải thực hiện các câu lệnh này trong tất cả các bảng cho tất cả các cột.

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

Có thể tự động hóa điều này theo bất kỳ cách nào trong MySQL không? Tôi muốn tránh mysqldump

Cập nhật: Richard Bronosky chỉ cho tôi cách :-)

Truy vấn tôi cần để thực hiện trong mỗi bảng:

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

Truy vấn điên để tạo tất cả các truy vấn khác:

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';

Tôi chỉ muốn thực hiện nó trong một cơ sở dữ liệu. Nó đã mất quá nhiều thời gian để thực hiện tất cả trong một lần. Hóa ra là nó đang tạo một truy vấn trên mỗi trường trên mỗi bảng. Và chỉ có một truy vấn trên mỗi bảng là cần thiết (khác biệt với giải cứu). Nhận đầu ra trên một tập tin là cách tôi nhận ra nó.

Cách tạo đầu ra cho một tệp:

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

Và cuối cùng để thực hiện tất cả các truy vấn:

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

Cảm ơn Richard. Bạn là đàn ông!

Câu trả lời:


16

Trước hết, đừng chỉ tin lời tôi! Kiểm tra đề xuất của tôi với điều này:

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;

Nếu bạn cảm thấy tốt với kết quả của điều đó, hãy xóa các mệnh đề giới hạn và lưu kết quả đầu ra vào tập lệnh SQL hoặc, lấy phần ưa thích và chuyển trực tiếp đầu ra sang mysql tương tự như những gì tôi trình bày ở đây . Điều đó sẽ trông như thế này:

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

Khi bạn bắt đầu nghĩ về việc sử dụng SQL hợp lệ để tạo SQL hợp lệ, nó sẽ thay đổi toàn bộ trò chơi. Bạn sẽ ngạc nhiên bởi bao nhiêu công dụng bạn tìm thấy cho nó.


Sắp đến rồi! Nhưng không thể hiểu đúng cú pháp
The Disintegrator

ok tôi hiểu rồi Tôi đang thêm sintax chính xác vào câu trả lời. Quy tắc ý tưởng của bạn
The Disintegrator

4

Trên thực tế, bạn có thể sử dụng CHUYỂN ĐỔI trên một bảng để chuyển đổi tất cả các cột trong bảng đó sang bảng mã và đối chiếu.

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';

Ngoài ra, nó có ý nghĩa hơn đối với tôi để chọn cơ sở dữ liệu thực tế mà bạn muốn làm điều này trên. Vậy đây:

... WHERE TABLE_SCHEMA = 'databasename';

thay vì thế này:

... WHERE TABLE_SCHEMA != 'information_schema';

Nhưng tôi đoán nếu bạn thực sự muốn làm điều đó trên tất cả các bảng, bạn có thể sử dụng trước đây. Có vẻ hơi nặng tay với tôi mặc dù. :)


1

Để thay đổi đối chiếu trên tất cả các cột tôi đã sử dụng

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

Bạn có thể sử dụng information_schemacơ sở dữ liệu để tìm cột và bảng bạn phải thay đổi. Bạn có thể tìm thấy chúng với:

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

Sau đó, bạn có thể tự động thay đổi bằng tập lệnh SQL, thủ tục lưu trữ hoặc với ngôn ngữ phát triển ưa thích của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.