如何为数据库中创建的所有表设置默认排序规则?

Posted

技术标签:

【中文标题】如何为数据库中创建的所有表设置默认排序规则?【英文标题】:How do I set default collation for all tables that are created in a database? 【发布时间】:2011-10-14 05:16:14 【问题描述】:

我有一个从损坏的数据库中提取的数据库转储,我需要将其导入到全新安装中。但是,原来的数据库似乎已经设置为使用 utf8_unicode_ci。

当将此转储导入干净的数据库时,所有数据库都是使用默认的 utf8_general_ci 创建的,这会为我提供包括 ß 在内的单词的重复条目,因为一般会生成 'ß' == 's',而 utf8_unicode_ci 应该有 'ß' == 'ss'

但是,在导入mysql时,创建表时似乎总是选择默认的utf8_general_ci,即使我将数据库(架构)默认设置为utf8_unicode_ci。

有没有办法强制它使用 utf8_unicode_ci 创建表,而不必在我的转储中注入 alter table 语句?它有几 GB 大小,手动修改会很痛苦。

在系统范围内配置 MySQL 很好。

我试过设置:

collation-server=utf8_unicode_ci

在 my.cnf 中,但这似乎没有为表创建设置默认排序规则。

【问题讨论】:

不,我正在使用命令行导入,mysql db_name < dbdump.sql 【参考方案1】:

今天早上我正在处理同样的问题,我能够通过以下方式设置表格排序规则。

DROP TABLE IF EXISTS `agtAgentTypes`;
CREATE TABLE `agtAgentTypes` (
  `agentTypeID` int(11) NOT NULL,
  `agentType` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`agentTypeID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 DEFAULT COLLATE utf8_unicode_ci;

由于某种原因,引擎和字符集似乎需要一个 =,但如果有一个,排序规则就会出错。我试了一下,因为我注意到 MySQL Charset Examples 也没有使用 =。

这是针对 MySQL Community Server 5.5.32-cll-lve 进行测试的。

【讨论】:

太好了,它也对我有用。我一直在尝试使用 = 并遇到错误。【参考方案2】:

如果您在创建语句中指定字符集,显然没有办法强制对新创建的表进行排序,这意味着如果您有:

CREATE TABLE foo
...
CHARSET=utf8;

它将隐式设置为 utf8_general_ci,这是该字符集的默认排序规则。这与数据库设置、系统设置和连接设置无关。

我最终调用了这个:

 cat dump.sql|sed s/CHARSET=utf8/CHARSET=utf8\ COLLATE=utf8_unicode_ci/ > dump_replaced.sql

然后就等着了。

【讨论】:

【参考方案3】:

如果您使用的是 phpmyadmin,请阅读以下文章:

http://kb.mediatemple.net/questions/138/Default+MySQL+character+set+and+collation#gs

或者试试这个方法

CREATE TABLE tbl_name (column_list)
    [[DEFAULT] CHARACTER SET charset_name]
    [COLLATE collation_name]]

ALTER TABLE tbl_name
    [[DEFAULT] CHARACTER SET charset_name]
    [COLLATE collation_name]

Reference

【讨论】:

但我不想更改创建语句,所有创建语句都在数 GB 大的转储中。 查看我在下面给出的链接。有一个关于如何使用 sed 更新转储中的编码的说明。 好吧,它说明了如何删除转储中的任何字符集规范。我最终在转储中直接使用 sed 替换了 CREATE 语句,因为字符集规范隐式设置了排序规则,而不考虑数据库或连接上的排序规则。

以上是关于如何为数据库中创建的所有表设置默认排序规则?的主要内容,如果未能解决你的问题,请参考以下文章

firebird 设置不区分大小写的排序规则

SQL Server转换数据库的排序规则

按需要在 JDBC 中创建的顺序对外键关系进行排序

如何为 Azure 移动应用表设置架构?

如何为在 Cloudformation 中创建的 Lambda 设置 Cloudwatch 日志

ORACLE中创建如何创建表,并设置结构和默认值