我在这个论坛上阅读了不同的文章和主题,以帮助我设置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;
所以基本上我想知道我是在右边还是我做了可能导致问题的事情
感谢您的阅读。 此致
答案 0 :(得分:1)
不同的列可以有不同的字符集和/或排序规则,但是......
WHERE a.x = b.y
)的列,则无法使用索引。utf8
不处理所有中文,也不处理某些表情符号。对于那些,你需要utf8mb4。关于其他问题......
INT(5)
中,(5)
毫无意义。查看SMALLINT UNSIGNED
,范围为0..65535。time_start decimal(11,0)
一时很奇怪。如果是unix时间戳,TIMESTAMP
或INT UNSIGNED
应该可以正常工作。另请参阅TIME
。dst char(1) COLLATE utf8_bin
- 由于utf8,这需要3个字节。也许你想要CHARACTER SET ascii
所以它只有1个字节?PRIMARY KEY
。 (可能是zone_id
?)答案 1 :(得分:0)
您正在为sectoreName
专栏做出不错的选择。请注意一点:utf8mb4_unicode_ci
是大多数语言的良好校对。但是,对于西班牙语,它的字母错误:在该语言中N
和Ñ
被认为是不同的字母。 Ñ
在整理顺序中N
后立即显示。但在其他欧洲语言中,它们被认为是同一个字母。因此,当您的西班牙语用户请求Niña
时,他们会返回Niña
和Nina
。他们认为这可能是一个错误。 (但是,他们可能习惯于从泛欧软件应用程序中获取此类内容。)
您应该在任何新应用程序中使用utf8mb4
作为您的字符集。因此,在utf8
表中使用{而不是timezone
。对_bin
列使用abbreviation
排序规则很好。