MySql 移除表和列的排序规则指定

11 浏览
0 Comments

MySql 移除表和列的排序规则指定

在我的数据库中,一些表和列是明确地定义了排序规则:

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)

0
0 Comments

问题的原因:

- charset和collation对于每个列都很重要,表和数据库上的设置仅适用于添加新列或表时的默认值。

- 更改列的charset或collation需要重建表,而更改默认值则不需要。

解决方法:

- 最好为每个列明确指定charset和collation,避免了解“默认值”的微妙问题。

- 若要将列从一个collation更改为另一个collation,在修改列时需要指定新的collation,并重建表。

文章内容如下:

MySql的表和列上的charset和collation是非常重要的设置。表和数据库上的设置仅仅是为了添加新列或表时的默认值。要查看给定charset(如latin1)的默认collation,可以使用SHOW COLLATION命令。例如,使用SHOW COLLATION LIKE '%latin1%'可以查看所有与latin1相关的collation。需要注意的是,如果只使用CHARACTER SET latin1,会得到COLLATION latin1_swedish_ci。因此,问题的关键是如何从latin1_general_ci更改为latin1_swedish_ci。如果确实需要这样做,就需要重建表。在列上更改CHARACTER SET或COLLATION也需要重建表,而更改默认值则不需要。因此,最好为每个列明确指定CHARACTER SET和COLLATION,以避免了解“默认值”的微妙问题。

根据问题的描述,可以使用ALTER TABLE语句来修改表的列。例如,使用以下语句可以将CommandName列的collation从latin1_general_ci更改为latin1_swedish_ci:

ALTER TABLE MyTable

MODIFY `CommandName` varchar(255) COLLATE latin1_swedish_ci NOT NULL;

需要注意的是,无论如何更改列的collation,都需要重建包含该列的任何索引。

有关“默认值”的微妙问题的更多细节或链接可以参考文中提到的内容。

0