2016-11-03 38 views
0

我在这个论坛上阅读了不同的文章和主题,以帮助我为我的数据库设置字符集排序&排序规则。不确定我所做的选择。我将不胜感激任何意见或建议。MySql混合字符集和排序规则

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

因此,这里是我做了什么来创建我的数据库,我决定使用charset utf8mb4和整理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; 

对于一些表,我认为最好使用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; 

所以基本上我想知道如果我是在右边,或者如果我正在做的事情可能导致问题

谢谢您的阅读。 Regards

+0

你知道,MySQL有内置的时区支持。 https://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html如果您自己重新实现它,则您将拥有时区更新。这是一场噩梦。除非必须,否则不要这样做。认真。 –

回答

0

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

  • 如果你比较不同的字符集核对(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?)
+0

谢谢你的回答。我在网站上找到了一个脚本(https://timezonedb.com/)。我同意你对时区表的评论,我会做出一些改变。 我主要关心的是在一个网站上使用CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,该网站将会有几种语言并且会混合不同的字符集。 – Nico33400

+0

使用utf8mb4处理网站上的所有多语言文本是唯一的方法。 –

+0

(可能还有其他专栏 - country_code,postal_code,timezone等 - 应该简单地用ascii。) –

0

您正在为您的sectoreName列做出不错的选择。请注意一件事:utf8mb4_unicode_ci是大多数语言的良好整理。但是,对于西班牙语,它会得到错误的字母:NÑ被认为是不同的字母。 Ñ在排序序列中的N之后立即出现。但在其他欧洲语言中,它们被认为是同一封信。因此,您的西班牙语用户在询问Niña时,将返回NiñaNina。这可能对他们来说是一个错误。 (但是,他们可能习惯于从泛欧软件应用程序中获得这类东西。)

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

相关问题