在我的数据库中,一些表和列是使用显式定义的:
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)
每列的字符集和校对是重要的事情。表和数据库上的设置只是在您重新添加新列或表时的默认设置。
要查看给定字符集的默认排序规则(例如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
更改都需要重建。更改默认设置的侵入性较小。
最好为每列明确指定CHARACTER SET
和COLLATION
,从而避免必须知道“默认值”的细微问题。
底线(根据现有问题):
ALTER TABLE MyTable
MODIFY `CommandName` varchar(255) COLLATE latin1_general_ci NOT NULL;