MySQLで、UTF-8テーブルに新しいVARCHAR(32)
フィールドを作成した場合、そのフィールドに32バイトのデータまたは32文字(マルチバイト)を格納できることを意味しますか?
5 に答える
この答えは私のグーグル検索結果の上部に表示されましたが、正しくありませんでした。
混乱はおそらく、テストされているMySQLの異なるバージョンが原因です。
- バージョン4はバイトをカウントします
- バージョン5は文字をカウントします
これが公式のMySQL5ドキュメントからの引用です:
MySQLは、文字列定義の長さの指定を文字単位で解釈します。(MySQL 4.1より前では、列の長さはバイト単位で解釈されていました。)これは、CHAR、VARCHAR、およびTEXTタイプに適用されます。
興味深いことに(私はそれについて考えていませんでした)、varchar列の最大長は次のようにutf8の影響を受けます。
MySQL 5.0.3以降のVARCHARの有効な最大長は、最大行サイズ(65,535バイト、すべての列で共有される)と使用される文字セットの影響を受けます。たとえば、utf8文字は1文字あたり最大3バイトを必要とする可能性があるため、utf8文字セットを使用するVARCHAR列は最大21,844文字であると宣言できます。
32個のマルチバイト文字を格納できます
UTF-8でスペースを節約するには、CHARの代わりにVARCHARを使用します。それ以外の場合、MySQLはCHAR CHARACTER SET utf8列の各文字に3バイトを予約する必要があります。これは、可能な最大長であるためです。たとえば、MySQLはCHAR(10)CHARACTERSETutf8列用に30バイトを予約する必要があります。
照合を使用するための32マルチバイトデータ、XAMPPでテストしました。varchar(32)
utf8_unicode_ci
1234567890123456789012345678901234567890
次のように切り捨てられます:
12345678901234567890123456789012
これらは通常のASCII文字ではないことに注意してください。
行の合計データ長は固定されて高速になるため、頻繁に更新されるテーブルには「char」を使用することをお勧めします。Varchar列は、行のデータサイズを動的にします。これはMyISAMには良くありませんが、InnoDBなどについてはわかりません。たとえば、「タイプ」列が非常に狭い場合は、最小限のスペースしか要求しないように、char(2)とlatin1文字セットを使用する方がよい場合があります。
latin1エンコーディングを使用して(たとえばPHPを使用して)データベースに接続し、PHPUTF8文字列をMySQLUTF8列に保存すると、ダブルUTF8エンコーディングになります。
UTF8文字列の$s
長さが32文字で64バイトの長さで、列がVARCHAR(32)
UTF8の場合、ダブルエンコーディングは文字列$s
を64文字の長さのUTF8文字列に変換し、データベースで最初の32バイトに対応する最初の32文字に切り捨てられます。の$s
。MySQL5はMySQL4のように動作すると思われるかもしれませんが、実際には同じ効果の2番目の原因です。