MySQLでは、UTF-8テーブルに新しいVARCHAR(32)
フィールドを作成すると、そのフィールドに32バイトのデータまたは32文字(マルチバイト)のデータを格納できるということですか?
この回答は、Google検索結果の上部に表示されましたが、正しくありませんでした。
混乱は、おそらくテストされているmysqlの異なるバージョンが原因です。
http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html
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)CHARACTER SET utf8カラム用に30バイトを予約する必要があります。
32 multibytes照合付きvarchar(32)
のデータutf8_unicode_ci
、XAMPPでテストしました。
1234567890123456789012345678901234567890
切り捨てられます:
12345678901234567890123456789012
これらは通常のASCII charsではありません。
頻繁に更新されるテーブルには「char」を使用することをお勧めします。これは、行の合計データ長が固定され高速になるためです。 Varchar列は、行データサイズを動的にします。これはMyISAMには良くありませんが、InnoDBやその他については知りません。たとえば、非常に狭い「タイプ」列がある場合は、char(2)をlatin1文字セットと一緒に使用して、最小限のスペースのみを要求することをお勧めします。
Latin1エンコーディング(PHPなど)を使用してデータベースに接続し、PHP UTF8文字列をMySQL UTF8カラムに保存する場合、UTF8エンコーディングが二重になります。
UTF8文字列_$s
_が32文字長で64バイト長で、列がVARCHAR(32)
UTF8である場合、ダブルエンコーディングは文字列_$s
_を64文字長のUTF8文字列に変換しますデータベースでは、_$s
_の最初の32バイトに対応する最初の32文字に切り捨てられます。 MySQL 5はMySQL 4のように振る舞うと思うかもしれませんが、実際には同じ効果の2番目の原因です。