在MySQL中指定COLLATION时,CHARACTER SET是多余的吗?

时间:2015-08-12 22:33:13

标签: mysql

我一直很惊讶MySQL和相关工具倾向于在COLLATIONCREATE TABLE语句中指定ALTER TABLESHOW 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'

无效

仅指定排序规则是否安全?

如果是这样,为什么所有这些工具也会在声明中系统地包含字符集?

1 个答案:

答案 0 :(得分:4)

创建表格时不需要指定字符集,它会自动设置在 collat​​e 上,如MySQL Reference Manual中所述:< / p>

  

MySQL在下面选择表字符集和排序规则   方式:

     
      
  • 如果同时指定了CHARACTER SET charset_name 和COLLATE collat​​ion_name ,则使用字符集 charset_name 和collat​​ion collat​​ion_name
  •   
  • 如果指定CHARACTER SET charset_name 而没有COLLATE,则使用字符集 charset_name 及其默认排序规则。要查看每个字符集的默认排序规则,请使用SHOW CHARACTER SET语句或查询INFORMATION_SCHEMA CHARACTER_SETS表。
  •   
  • 如果指定COLLATE collat​​ion_name 而没有CHARACTER SET,则使用与 collat​​ion_name 和collat​​ion collat​​ion_name 关联的字符集。
  •   
  • 否则(既未指定CHARACTER SET也未指定COLLATE),则使用数据库字符集和排序规则。
  •   
     

字符集 collat​​ion 用作默认值   对于列定义,如果列字符集和排序规则是   未在单个列定义中指定。表格字符   set和collat​​ion是 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,请阅读以下内容: