2014-02-12 72 views
0

我与拉美的理解VS UTF8是按如下:拉丁Vs的UTF8字符集和使用索引(MySQL的5.5)

“拉丁仅支持拉丁字符(如英语),但UTF-8支持的所有国际语言,如法语,,葡萄牙语,阿拉伯语等(甚至不支持完全,因为它使用每字符3字节,而它应该使用每个字符4字节来照顾所有国际utf8字符)按照标准拉丁存储1个字符在1字节而utf8 1个字符在1-3字节,但如果我们将所有字符以拉丁文存储在一个utf8类型列中,那么它将在1字节中存储1个字符。“

latin vs utf8索引:“列值取字节为每列中的字符和字符集类型,但索引总是以字节为单位存储值。”

可能有人清楚我的下面的问题,我会非常感激。

假设在utf8字符集类型表中有一个标题varchar(250)列,并且它有一个索引作为Alter table mytable add index(title(16));

如果此列包含刺痛“这是我的标题”,其中包含16个字符和所有拉丁文。然后清除以下查询:

1)由于字符串包含16个字符,并且都是拉丁类型,所以它应该只存储16个字节,即使表字符集是utf8或其他。

2)16个字节的索引足以处理这16个字符的字符串或其他。

谢谢,

扎法尔

回答

1

1)是。 2)是的。

请注意,“拉丁语”不是字符编码。编码人员通常会调用拉丁字符,例如MySQL的“latin1”,它包含以UTF-8编码时需要2或3个字节的字符。它是可以用UTF-8中的一个字节存储的ASCII字符。

+0

@Tim:谢谢你的解释性答案。 –

+0

Joni,谢谢你的帮助。 –

1

1)在utf8中,latin1(ISO-8859-1)字符可以超过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个空间字节)。