12

MySQLにはデフォルトでlatin1エンコーディングがあり、文字をlatin1に格納するには 1 バイト、文字をutf-8に格納するには 3 バイトかかるようです。これは正しいですか?

私は、世界中で使用されることを願っているサイトに取り組んでいます。utf-8が絶対に必要ですか? または、latin1 を使用して逃げることができますか?

また、いくつかのテーブルをlatin1からutf8に変更しようとしましたが、次のエラーが発生しました: Speficief key was too long; max key length is 1000 bytes 誰かがこれに対する解決策を知っていますか? そして、私は本当にそれを解決する必要がありますか、それともlatin1で十分でしょうか?

ありがとう、アレックス

4

8 に答える 8

11

文字をlatin1に保存するには1バイト、utf-8に文字を保存するには3バイトかかります-それは正しいですか?

文字を格納するには1バイトが必要で、文字を格納するにはバイトが必要です。latin113UTF8

文字列で基本的なラテン文字と句読点のみを使用する場合 ( 0to 128in Unicode)、両方の文字セットが同じ長さを占めます。

また、いくつかのテーブルを latin1 から utf8 に変更しようとしましたが、「Speficief キーが長すぎました。最大キー長は 1000 バイトです」というエラーが発生しました。これに対する解決策を知っている人はいますか? そして、私は本当にそれを解決する必要がありますか、それともlatin1で十分でしょうか?

VARCHAR(334)以上の列がある場合、列がそれ以上のバイトMyISAMを占有する可能性がわずかにあるため、その列にインデックスを作成することはできません。1000

このような長さの鍵はめったに役に立たないことに注意してください。実際のデータに対してほぼ同じように選択的なプレフィックス付きインデックスを作成できます。

于 2011-02-01T00:54:25.740 に答える
9

最低限、UTF-8 を使用することをお勧めします。それらの 90% 以上が UTF-8 であるため、データは現在存在する他のすべてのデータベースと互換性があります。

LATIN1/ISO-8859-1 を使用すると、国際文字がサポートされていないため、データが適切に保存されないリスクがあります...そのため、この画像の左側のようなものに遭遇する可能性があります。

ここに画像の説明を入力

UTF-8 を使用すれば、これらの問題に対処する必要はありませ

エラーに関しては、データベースを最適化する必要があるようです。これを考慮してください:http://bugs.mysql.com/bug.php?id=4541#c284415

その問題のテーブル スキーマと列の詳細を指定すると役立ちます。

于 2011-02-01T00:48:36.823 に答える
4

ユーザーが自分の言語で投稿できるようにし、すべての国のユーザーに参加してもらいたい場合は、少なくともそれらの投稿を含むテーブルを UTF-8 に切り替える必要があります - Latin1 は ASCII と西ヨーロッパ文字のみをカバーします。UI に複数の言語を使用する場合も同様です。移行の処理方法については、この投稿を参照してください。

于 2011-02-01T00:49:39.833 に答える
2

私の経験では、アラビア語、ロシア語、アジア言語などのサポートを計画している場合、事前に UTF-8 サポートへの投資を行うことで、成果が得られます。ただし、状況によっては、しばらくの間、英語から逃れることができる場合があります。

エラーに関しては、キーまたはインデックス フィールドの文字数が 333 文字を超えている可能性があります。これは、UTF-8 エンコーディングの MySQL で許可されている最大文字数です。このバグレポートを参照してください。

于 2011-02-01T00:50:32.777 に答える
1

キーの最大長は 1000 BYTESであるため、utf8 を使用すると、333 文字に制限されます。

ただし、MySQL は Oracle とは文字セットが異なります。Oracle では、列ごとに異なる文字セットを使用することはできませんが、MySQL では可能であるため、キーを latin1 に設定し、他の列を utf8 に設定できます。

最後に、BMP (Basic Multilingual Plan) を超える Unicode 文字に対応できるのは、廃止されたバージョン 6.0alpha (Sun が MySQL を買収したときに破棄された) だけだと思います。したがって、基本的に、UTF-8 を使用しても、Unicode 文字セット全体をすべて使用できるわけではありません。実際には、それが本当に重要な場合、これはまれな漢字の問題にすぎません。

于 2011-02-01T00:52:56.537 に答える
1

ラテン語がデフォルトであるため、ラテン語を使用してアプリケーションを作成しました。しかし、後でスペイン語の文字のためにすべてを UTF に変更する必要がありました。信じられないほど難しいことではありませんが、不必要に変更する必要はありません。

簡単な答えは、最初から UTF-8 を使用することです。これにより、後で問題が発生しなくなります。

于 2011-02-01T00:53:17.310 に答える
0

現在のベスト プラクティスは、MySQL のutf8文字セットを使用しないことです。utf8mb4代わりに使用してください。これは、標準の適切な実装です。

詳細については、 Adam Hooper の説明を参照してください。

utf8mb4では、文字のバイト数は可変であることに注意してください。名前が示すように、文字は最大4 バイトです。としてエンコードされたラテン文字セットの文字の場合、utf8mb41 バイトしか占有しません。アクセント付きの文字、漢字、絵文字を含むその他の文字は、格納するのに 2、3、または 4 バイトを必要とします。

インデックスがこの制限を超えている可能性があるため、インデックスSpecified key was too long; max key length is 1000 bytesに列が含まれているとエラーが発生します。一部の文字列の列の長さを短くするか、この構文を使用して列のインデックスの長さを短くして、制限よりも短くする必要があります。utf8mb4

ALTER TABLE.. ADD INDEX `myIndex` ( column1(15), column2(200) );

于 2021-02-04T16:15:56.023 に答える