我一直很惊讶MySQL和相关工具倾向于在COLLATION
和CREATE TABLE
语句中指定ALTER TABLE
和SHOW CREATE TABLE test;
CREATE TABLE ...
ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
:
ALTER TABLE ...
CHARACTER SET 'latin1' COLLATE 'latin1_general_ci' ...;
当我在MySQL Workbench中为列选择排序规则时,我得到:
CREATE TABLE ... DEFAULT CHARACTER SET utf8 collate latin1_bin;
我一直认为指定字符集和整理是多余的,因为整理意味着字符集。
我错了吗?
当我尝试将排序规则与另一个字符集混合时,我收到错误:
if (guess < 0 || > 6) {
COLLATION'latin1_bin'对CHARACTER SET'utf8'
无效
仅指定排序规则是否安全?
如果是这样,为什么所有这些工具也会在声明中系统地包含字符集?
答案 0 :(得分:4)
创建表格时不需要指定字符集,它会自动设置在 collate 上,如MySQL Reference Manual中所述:< / p>
MySQL在下面选择表字符集和排序规则 方式:
- 如果同时指定了CHARACTER SET charset_name 和COLLATE collation_name ,则使用字符集 charset_name 和collation collation_name 。
- 如果指定CHARACTER SET charset_name 而没有COLLATE,则使用字符集 charset_name 及其默认排序规则。要查看每个字符集的默认排序规则,请使用SHOW CHARACTER SET语句或查询INFORMATION_SCHEMA CHARACTER_SETS表。
- 如果指定COLLATE collation_name 而没有CHARACTER SET,则使用与 collation_name 和collation collation_name 关联的字符集。
- 否则(既未指定CHARACTER SET也未指定COLLATE),则使用数据库字符集和排序规则。
表字符集和 collation 用作默认值 对于列定义,如果列字符集和排序规则是 未在单个列定义中指定。表格字符 set和collation是 MySQL扩展;没有这样的事情 在标准SQL中。
因此,您可以使用此查询创建表:
CREATE TABLE `tabletest` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 COLLATE=latin1_general_ci;
此查询将创建一个包含CHARSET=latin1 COLLATE=latin1_general_ci
的表格,因此仅指定COLLATE是安全的。
至于为什么有CHARSET和COLLATE,请阅读以下内容: