latin1を使用することに対する文字セットとしてutf8を使用することの長所/短所は何ですか?
utfがより多くの文字をサポートでき、一貫して使用される場合、それは常により良い選択ではないでしょうか?latin1を選ぶ理由はありますか?
UTF8の利点:
ヘブライ語などのRTL言語を含むほとんどの言語をサポートします。
UTF8対応コンポーネント(JavaScript、Javaなど)にデータをインポート/エクスポートする場合、変換は必要ありません。
UTF8の短所:
非ASCII文字は、より複雑なエンコードスキームのため、エンコードとデコードに時間がかかります。
非ASCII文字は、1バイト(ASCII文字セットの最初の127文字にない文字)を使用して格納される可能性があるため、より多くのスペースを必要とします。CHAR(10)
またはVARCHAR(10)
フィールドは、一部のUTF8文字を格納するために最大30バイトを必要とする場合があります。
utf8_bin
ソート順が文字エンコード順に直接マップされないため、それ以外の照合は遅くなり、一部のストアドプロシージャでの変換が必要になります(変数はデフォルトでutf8_general_ci
照合になります)。
JOIN
UTF8および非UTF8フィールドが必要な場合、MySQLは重大なパフォーマンスヒットを課します。結合されたフィールドが異なる文字セット/照合である場合、 1秒未満のクエリは数分かかる可能性があります。
結論:
非Latin1言語をサポートする必要がない場合、最大のパフォーマンスを実現したい場合、またはを使用するテーブルがすでにある場合はlatin1
、を選択しますlatin1
。
それ以外の場合は、を選択しますUTF8
。
latin1
これはシングルバイトエンコーディングであるという利点があります。したがって、MySqlの文字列データ型の長さはエンコーディングに依存するため、同じ量のストレージスペースにより多くの文字を格納できます。マニュアルには次のように記載されています
特定のCHAR、VARCHAR、またはTEXT列の値を格納するために使用されるバイト数を計算するには、その列に使用される文字セットと、値にマルチバイト文字が含まれるかどうかを考慮する必要があります。特に、utf8 Unicode文字セットを使用する場合、すべての文字が同じバイト数を使用するわけではないことに注意する必要があります。utf8mb3およびutf8mb4文字セットは、文字ごとにそれぞれ最大3バイトおよび4バイトを必要とする場合があります。utf8mb3またはutf8mb4文字のさまざまなカテゴリに使用されるストレージの内訳については、10.9項「Unicodeのサポート」を参照してください。
さらに、多くの文字列操作(サブ文字列の取得や照合に依存する比較など)は、シングルバイトエンコーディングの方が高速です。
いずれにせよ、国際化をまったく気にかけていれば、latin1は深刻な競争相手ではありません。既知の安全な値(パーセントエンコードされたURLなど)を保存する場合は、これが適切な選択になる可能性があります。
@Ross Smith II、ポイント4は金の価値があります。つまり、列間の不整合は危険な場合があります。
すでに良い答えに価値を加えるために、ここに文字セット間の違いについての小さなパフォーマンステストがあります:
最新の2013サーバー、20000行の実際の使用テーブル、関連する列にインデックスがありません。
SELECT 4 FROM subscribers
WHERE 1 ORDER BY time_utc_str
; (4はキャッシュバスターです)
数値の日付のような単純な文字列の場合、パフォーマンスに関しては、utf8_bin(CHARACTER SET utf8 COLLATE utf8_bin)を使用することにします。これにより、データベース文字セットがutf8でありながら、一種のバイナリであることが期待される他のコードによる悪影響を防ぐことができます。
latin-1などの固定長エンコーディングは、CPU消費の点で常により効率的です。
いくつかの固定長文字セットのトークンのセットが目前の目的に十分であることがわかっていて、目的がLENGTH()およびSUBSTR()のものを多く含む、重くて集中的な文字列処理を含む場合、それはUTF-8などのエンコーディングを使用しない正当な理由。
ああ、ところで。あなたがそうしているように、文字セットとそのエンコーディングを混同しないでください。文字セットは、書き込み可能なグリフの定義済みセットです。同じ文字セットに複数の異なるエンコーディングを含めることができます。Unicode標準のさまざまなバージョンは、それぞれ文字セットを構成します。それぞれ、UTF-8、UTF-16、および「UTF-32」(正式な名前ではありませんが、任意の文字に4バイト全体を使用するという考えを指します)エンコーディングのいずれかを適用でき、後者の2つはそれぞれHOBファーストまたはHOBラストのフレーバーで提供されます。