如何为数据库中创建的所有表设置默认排序规则?
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 语句,因为字符集规范隐式设置了排序规则,而不考虑数据库或连接上的排序规则。以上是关于如何为数据库中创建的所有表设置默认排序规则?的主要内容,如果未能解决你的问题,请参考以下文章