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 SETCOLLATION 更改都需要重建。更改 default 行为的侵入性较小。

最好为每一列明确指定CHARACTER SETCOLLATION,从而避免必须了解“默认值”的微妙问题。

底线(基于当前的问题):

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 非法混合排序规则

操作“=”的排序规则的非法混合

mysql 字符集 utf 8 排序规则(dup 键)无法正常工作

SQL知识点详细总结(附操作图解)

SQL知识点详细总结(附操作图解)

没有排序规则的 Unicode (UTF-16) 数据如何存储在 varchar 列中?