MySql 从表和列中删除排序规则
Posted
技术标签:
【中文标题】MySql 从表和列中删除排序规则【英文标题】:MySql remove collation spec from table and columns 【发布时间】:2018-05-05 01:37:13 【问题描述】:在我的数据库中,一些表和列是用排序规则明确定义的:
CREATE TABLE `MyTable` (
`MyTableId` int(11) NOT NULL AUTO_INCREMENT,
`CommandName` varchar(255) COLLATE latin1_general_ci NOT NULL,
PRIMARY KEY (`MyTableId`),
ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
现在在数据库级别定义了默认字符集和排序规则
ALTER DATABASE `MyDatabase` CHARACTER SET latin1 COLLATE latin1_general_ci;
是否可以删除排序规则(无需重新创建表),因此很明显正在使用数据库中的默认设置。当为表格编写脚本时,希望改为:
CREATE TABLE `MyTable` (
`MyTableId` int(11) NOT NULL AUTO_INCREMENT,
`CommandName` varchar(255) NOT NULL,
PRIMARY KEY (`MyTableId`),
ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=latin1;
在没有指定排序规则值的情况下进行了尝试,但是在编写脚本时数据库是相同的
ALTER TABLE MyTable MODIFY CommandName varchar(255)
【问题讨论】:
How to change the default collation of a database?的可能重复 @SebastianBrosch,不,这不是这篇文章的重复。正如我所说,尝试使用 ALTER 但没有产生我想要的结果 【参考方案1】:每列的字符集和排序规则是重要的东西。表和数据库上的设置仅是默认值,当您分别添加新列或表时。
查看给定字符集(例如 latin1)的默认排序规则:
mysql> SHOW COLLATION LIKE '%latin1%';
+-------------------+---------+----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+-------------------+---------+----+---------+----------+---------+
| latin1_german1_ci | latin1 | 5 | | Yes | 1 |
| latin1_swedish_ci | latin1 | 8 | Yes | Yes | 1 |
| latin1_danish_ci | latin1 | 15 | | Yes | 1 |
| latin1_german2_ci | latin1 | 31 | | Yes | 2 |
| latin1_bin | latin1 | 47 | | Yes | 1 |
| latin1_general_ci | latin1 | 48 | | Yes | 1 |
| latin1_general_cs | latin1 | 49 | | Yes | 1 |
| latin1_spanish_ci | latin1 | 94 | | Yes | 1 |
+-------------------+---------+----+---------+----------+---------+
请注意,如果你只说CHARACTER SET latin1
,你会得到COLLATION latin1_swedish_ci
。
因此,如上所述,您的问题是关于如何从 latin1_general_ci
更改为 latin1_swedish_ci
。如果这确实是您想要的,那么它需要重建表。 列上的任何CHARACTER SET
或COLLATION
更改都需要重建。更改 default 行为的侵入性较小。
最好为每一列明确指定CHARACTER SET
和COLLATION
,从而避免必须了解“默认值”的微妙问题。
底线(基于当前的问题):
ALTER TABLE MyTable
MODIFY `CommandName` varchar(255) COLLATE latin1_general_ci NOT NULL;
【讨论】:
一句像:ALTER TABLE `MyTable` CONVERT TO CHARACTER SET latin1;
你能在不重建的情况下将CommandName
列从latin1_general_ci
更改为latin1_swedish_ci
吗?。
以任何方式更改列的排序规则必然需要重建包含该列的任何索引。当列没有在任何索引中使用时,我不知道是否需要重建。
It is best to explicitly specify CHARACTER SET and COLLATION for each column, thereby avoiding having to know the subtle issues of "defaults".
- 你能提供一些关于那些“微妙问题”的细节或链接吗?我真的很感兴趣。
@nevvermind - 也许没什么微妙的......它将获取未指定字符集/排序规则的默认值。但我很确定该列的设置随后被冻结(在添加列的情况下)。以上是关于MySql 从表和列中删除排序规则的主要内容,如果未能解决你的问题,请参考以下文章
在 LOCATE 中使用用户定义的变量时,MySQL 非法混合排序规则