MySql混合Charset&排序规则

时间:2016-11-03 22:38:12

标签: mysql character-encoding collation

我在这个论坛上阅读了不同的文章和主题,以帮助我设置charset&我的数据库的整理。我不确定我做出的选择。我将不胜感激任何意见或建议。

我使用的是mysql 5.5。 数据库(与php一起使用)将有一些来自不同语言的数据(中文,法语,荷兰语,美国,西班牙语,阿拉伯语等)。 我将主要插入数据并从表ID中获取信息。我不需要完全搜索和比较文本。

所以这就是我创建数据库所做的,我决定使用CHARSET utf8mb4和COLLATION utf8mb4_unicode_ci

ALTER DATABASE testDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

当我创建表时:

CREATE TABLE IF NOT EXISTS sector (
    idSector INT(5) NOT NULL AUTO_INCREMENT,
    sectoreName VARCHAR(45) NOT NULL DEFAULT '',
    PRIMARY KEY (idSector)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4  AUTO_INCREMENT=0;

对于某些TABLES,我认为最好使用utf8_bin 例如:时区(包含168 047行)

CREATE TABLE timezone (
  zone_id int(10) NOT NULL,
  abbreviation varchar(6) COLLATE utf8_bin NOT NULL,
  time_start decimal(11,0) NOT NULL,
  gmt_offset int(11) NOT NULL,
  dst char(1) COLLATE utf8_bin NOT NULL,
  KEY idx_zone_id (zone_id),
  KEY idx_time_start (time_start)
) ENGINE=InnoDB DEFAULT CHARSET=utf8  AUTO_INCREMENT=0;

所以基本上我想知道我是在右边还是我做了可能导致问题的事情

感谢您的阅读。 此致

2 个答案:

答案 0 :(得分:1)

不同的列可以有不同的字符集和/或排序规则,但是......

  • 如果您比较不同字符集排序规则(WHERE a.x = b.y)的列,则无法使用索引。
  • utf8不处理所有中文,也不处理某些表情符号。对于那些,你需要utf8mb4。

关于其他问题......

  • INT(5)中,(5)毫无意义。查看SMALLINT UNSIGNED,范围为0..65535。
  • time_start decimal(11,0)一时很奇怪。如果是unix时间戳,TIMESTAMPINT UNSIGNED应该可以正常工作。另请参阅TIME
  • dst char(1) COLLATE utf8_bin - 由于utf8,这需要3个字节。也许你想要CHARACTER SET ascii所以它只有1个字节?
  • 真的应该给InnoDB表一个明确的PRIMARY KEY。 (可能是zone_id?)

答案 1 :(得分:0)

您正在为sectoreName专栏做出不错的选择。请注意一点:utf8mb4_unicode_ci是大多数语言的良好校对。但是,对于西班牙语,它的字母错误:在该语言中NÑ被认为是不同的字母。 Ñ在整理顺序中N后立即显示。但在其他欧洲语言中,它们被认为是同一个字母。因此,当您的西班牙语用户请求Niña时,他们会返回NiñaNina。他们认为这可能是一个错误。 (但是,他们可能习惯于从泛欧软件应用程序中获取此类内容。)

您应该在任何新应用程序中使用utf8mb4作为您的字符集。因此,在utf8表中使用{而不是timezone。对_bin列使用abbreviation排序规则很好。