在我的数据库中,一些表和列是使用排序规则显式定义的:
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)
每列的字符集和排序规则是重要的东西。表和数据库上的设置仅是分别添加新列或表时的默认设置。
要查看给定字符集(例如 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_ci为latin1_swedish_ci。如果这确实是您想要的,那么它需要重建表。列上的任何更改CHARACTER SET都需要重建。更改默认值的侵入性较小。COLLATION
最好为每一列明确指定CHARACTER SET和COLLATION,从而避免必须了解“默认值”的微妙问题。
底线(基于问题本身):
ALTER TABLE MyTable
MODIFY `CommandName` varchar(255) COLLATE latin1_general_ci NOT NULL;
Run Code Online (Sandbox Code Playgroud)