我对拉丁语与utf8的理解如下:
“拉丁语仅支持拉丁字符(如英语),但utf8支持所有国际语言,如法语,中文,阿拉伯语等(甚至不完全支持,因为它每个字符使用3个字节,而每个字符应使用4个字节来照顾所有国际utf8字符)。根据标准拉丁存储1个字节中的1个字符而1-3个字节中的utf8 1个字符。但是如果我们将所有字符存储在拉丁语中,即使在utf8类型列中,它也将在1个字节中存储1个字符。 “
latin vs utf8索引:“列值按列中的字符数和字符串类型取字节,但索引始终以字节为单位存储值。”
可能有人清楚我的下面的问题,我将非常感谢。
假设有一个标题varchar(250)列,并且在utf8字符集类型表中有一个索引作为Alter table mytable add index(title(16));
如果此列包含刺痛“这是我的标题”,其中包含16个字符和所有拉丁语。然后清楚以下查询:
1)由于字符串包含16个字符且所有都是latin类型意味着它应该只存储16个字节,即使表字符集是utf8,否则。
2)16个字节的索引足以照顾这个16个字符的字符串。
谢谢,
扎法
答案 0 :(得分:1)
1)是的。 2)是的。
请注意,“latin”不是字符编码。人们通常称为拉丁语的编码,如MySQL的“latin1”,包括在UTF-8编码时需要2或3个字节的字符。它是ASCII字符,可以用UTF-8中的一个字节存储。
答案 1 :(得分:1)
1)latin1(ISO-8859-1)字符在utf8中可以超过1个字节。如果字符是ASCII(如示例字符串中所示),则utf8中的每个字符只需要1个字节。如果它们是非ASCII但仍然是latin1,则需要更多的字节。
2)同样,假设16字节字符串中的字符始终为ASCII,则utf8索引中的16个字节将覆盖它。 但是,请注意,对于char / varchar / text列上的索引,索引长度为字符而不是字节。所以(16)意味着你的索引最多可以为utf8的48个字节。此外,您的列定义是相同的(因此varchar(250)是250 字符,对于utf8最多为750字节。)
请注意,MySQL还支持utf8mb4编码,这是正确的UTF-8 - 即字符最多可占用4个字节进行编码。但是,如果你使用它并想要更长的索引,你需要搞乱表格和行格式/创建和InnoDB设置,因为索引等将占用超过标准的767字节(例如250个字符索引需要1000个空间)个字节)。