utf8とlatin1の違い


128

utf8とlatin1の違いは何ですか?


3
それらは異なるエンコーディングです(ASCII文字や多くのアクセント付き文字など、一部の文字は一般的なバイトシーケンスにマップされます)。UTF-8は、すべてのコードポイントを持つUnicodeの1つのエンコーディングです。Latin1は256文字未満をエンコードします。
ShreevatsaR 2010

Linuxロケールで利用可能なlatin9もあり、質問で言及することができます:en.wikipedia.org/wiki/ISO/IEC_8859-15
baptx

回答:


151

UTF-8は世界支配のために準備されていますが、Latin1はそうではありません。

Latin1エンコーディングを使用して中国語、日本語、ヘブライ語、ロシア語などの非ラテン文字を保存しようとすると、最終的にはmojibakeになります。この記事の紹介文は役に立つかもしれません(少しJavaを知っている場合はさらに役立ちます)。

完全な4バイトUTF-8サポートはMySQL 5.5でのみ導入されたことに注意してください。それ以前のバージョンでは、1文字あたり最大3バイトであり、1文字あたり4バイトではありません。したがって、BMPプレーンのみをサポートし、絵文字プレーンなどはサポートしていません。4バイトのUTF-8を完全にサポートする場合は、MySQLを少なくとも5.5にアップグレードするか、PostgreSQLなどの別のRDBMSを使用してください。MySQL 5.5以降ではと呼ばれutf8mb4ます。


31
Mysql 5.1は3バイトのUTF-8をサポートしていますが、Mysql 5.5 utf8mb4として4バイトのUTF-8をサポートしています。
velcrow

2
@BalusC UTF-8が完全にサポートされていない方法について詳しく説明していただけますか?Mysql 5.1がすべての Unicode文字を格納できないということですか?
パチェリエ

2
@Pacerier:文字ごとに3バイトのみをサポートするため、BMP(最初の65535文字)のみがサポートされ、残りはサポートされません。すべての文字については、en.wikipedia.org
wiki / Plane_(Unicode

2
@BalusC 5.1.63を使用していて、Webサーバーのmysqlバージョンを更新する権限を持っていない場合、代替手段は何ですか?
パセリエ

6
@Pacerier:VARBINARY代わりにとして保存VARCHARし、ビジネス層でデコード/エンコードできますが、これはハッキーです。新しい質問をすることを検討してください。もっと良い方法があるかもしれません。
BalusC

47

latin1では、各文字はちょうど1バイト長です。utf8では、文字は複数のバイトで構成できます。その結果、utf8はlatin1よりも多くの文字を持っています(そしてそれらが共通に持っている文字は必ずしも同じバイト/バイトシーケンスで表されるとは限りません)。


1
アスキーとビンはどうですか?
Yousha Aleayoub

8
@YoushaAleayoub ASCIIは、1バイトエンコーディングで、0〜127の文字を使用するため、latin1の半分の文字をエンコードできます。これは、latin1とutf8の両方の厳密なサブセットです。つまり、latin1とutf8の両方のバイト0から127は、ASCIIと同じものをエンコードします。Binはエンコーディングではありません。これは通常、ファイルを読み取るときに指定できるオプションで、IO関数にエンコーディングを適用せず、バイト単位でファイルを読み取るように指示します。
sepp2k

1
おかげで、私はbinary照合を意味しました...?そして、どちらが英語/数値フィールドに適していますascii_general_ciascii_bin
Yousha Aleayoub
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.