2014-02-12 106 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個空間字節)。