MySql 从表和列中删除排序规则规范

Rig*_*iga 5 mysql collation

在我的数据库中,一些表和列是使用排序规则显式定义的:

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;
Run Code Online (Sandbox Code Playgroud)

现在在数据库级别定义默认字符集和排序规则

ALTER DATABASE `MyDatabase` CHARACTER SET latin1 COLLATE latin1_general_ci;
Run Code Online (Sandbox Code Playgroud)

是否可以删除排序规则(无需重新创建表),因此很明显正在使用数据库中的默认设置。当编写脚本时,表希望有这个:

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;
Run Code Online (Sandbox Code Playgroud)

尝试不指定排序规则值,但编写脚本时数据库是相同的

ALTER TABLE MyTable MODIFY CommandName varchar(255)
Run Code Online (Sandbox Code Playgroud)

Ric*_*mes 4

每列的字符集和排序规则是重要的东西。表和数据库上的设置是分别添加新列或表时的默认设置。

要查看给定字符集(例如 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 |
+-------------------+---------+----+---------+----------+---------+
Run Code Online (Sandbox Code Playgroud)

请注意,如果您说 just CHARACTER SET latin1,您就会得到COLLATION latin1_swedish_ci

因此,正如所述,您的问题是如何从 更改latin1_general_cilatin1_swedish_ci。如果这确实是您想要的,那么它需要重建表。上的任何更改CHARACTER SET都需要重建。更改默认值的侵入性较小。COLLATION

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

底线(基于问题本身):

ALTER TABLE MyTable
    MODIFY `CommandName` varchar(255) COLLATE latin1_general_ci NOT NULL;
Run Code Online (Sandbox Code Playgroud)

  • `最好为每列显式指定 CHARACTER SET 和 COLLATION,从而避免必须了解“默认值”的微妙问题。` - 您能否提供有关这些“微妙问题”的一些详细信息或链接?我真的很感兴趣。 (3认同)