AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 65043
Accepted
The Disintegrator
The Disintegrator
Asked: 2009-09-14 21:39:21 +0800 CST2009-09-14 21:39:21 +0800 CST 2009-09-14 21:39:21 +0800 CST

更改 MySQL 中所有表的所有列中的字符集和排序规则

  • 772

我需要在所有表的所有列中执行这些语句。

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

谢谢理查德。你就是那个男人!

mysql
  • 6 6 个回答
  • 38569 Views

6 个回答

  • Voted
  1. Best Answer
    Bruno Bronosky
    2009-09-16T07:50:26+08:002009-09-16T07:50:26+08:00

    首先,不要只相信我的话!用这个测试我的建议:

    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;
    

    如果您对此结果感到满意,请删除限制子句并将输出保存到 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 时,它会改变整个游戏。你会惊讶于你发现它有多少用途。

    • 20
  2. user51876
    2010-08-21T12:56:26+08:002010-08-21T12:56:26+08:00

    实际上,您可以在表上使用 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';
    

    但我想如果你真的想在所有桌子上都这样做,你可以使用前者。不过对我来说似乎有点沉重。:)

    • 8
  3. rbh
    2014-03-16T10:15:35+08:002014-03-16T10:15:35+08:00

    要更改我使用的所有列的排序规则

    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` ;
    
    • 2
  4. lg.
    2009-09-15T00:34:56+08:002009-09-15T00:34:56+08:00

    您可以使用information_schema数据库来查找您必须更改的列和表。您可以通过以下方式找到它们:

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

    然后,您可以使用 SQL 脚本、存储过程或您喜欢的开发语言自动执行更改。

    • 0
  5. Nebojsac
    2020-01-13T02:31:47+08:002020-01-13T02:31:47+08:00

    我最终做了以下事情:

    • 将数据库转储到 sql 文件,使用mysqldump db_name > db_name.sql
    • 使用 awk 替换 sql 文件中的字符集sed -i -e 's/old_charset/new_charset/g' db_name.sql
    • 导入这个新的数据库文件mysql < db_name

    我不会在生产中使用它,但我需要在本地开发环境中使用它。

    或者,我可以分别转储 SQL 结构和数据,然后进入 SQL 文件以更改那里的字符集。

    请记住,如果您在不兼容的字符集之间进行转换,这可能会弄乱您的数据。

    • 0
  6. MansiMansi
    2022-05-06T19:42:53+08:002022-05-06T19:42:53+08:00

    更改字符集 = utf8mb3 的所有表中的所有列

    从 information_schema.COLUMNS WHERE TABLE_SCHEMA = 'DB NAME HERE' 和 CHARACTER_SET_NAME = 'utf8mb3'中选择 concat('ALTER TABLE ',TABLE_Name, 'MODIFY ',COLUMN_NAME, '' , COLUMN_TYPE, 'CHARACTER SET utf8mb4;') 命令;

    然后运行结果。

    • 0

相关问题

  • 开源与专有关系 db mgt 系统的优缺点是什么?

  • 在 solaris 10 上为 mysql 设置 max_allowed_pa​​cket

  • 如何移动 MySQL 的数据目录?

  • 通过 VPN 连接什么是远程服务器 IP?

  • mysql崩溃

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve