web-dev-qa-db-ja.com

MySQL VARCHARの長さとUTF-8

MySQLでは、UTF-8テーブルに新しいVARCHAR(32)フィールドを作成すると、そのフィールドに32バイトのデータまたは32文字(マルチバイト)のデータを格納できるということですか?

75
Alix Axel

この回答は、Google検索結果の上部に表示されましたが、正しくありませんでした。

混乱は、おそらくテストされているmysqlの異なるバージョンが原因です。

  • バージョン4はバイトをカウントします
  • バージョン5は文字をカウントします

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文字として宣言できます。

159
M Brown

32個のマルチバイト文字を保存できます

UTF-8でスペースを節約するには、CHARではなくVARCHARを使用します。そうでない場合、MySQLはCHAR CHARACTER SET utf8カラムの各文字に対して3バイトを予約する必要があります。これは、可能な最大長です。たとえば、MySQLはCHAR(10)CHARACTER SET utf8カラム用に30バイトを予約する必要があります。

http://dev.mysql.com/doc/refman/5.0/en/charset-unicode.html

8
jspcal

32 multibytes照合付きvarchar(32)のデータutf8_unicode_ci、XAMPPでテストしました。

1234567890123456789012345678901234567890

切り捨てられます:

12345678901234567890123456789012

これらは通常のASCII charsではありません。

5
YOU

頻繁に更新されるテーブルには「char」を使用することをお勧めします。これは、行の合計データ長が固定され高速になるためです。 Varchar列は、行データサイズを動的にします。これはMyISAMには良くありませんが、InnoDBやその他については知りません。たとえば、非常に狭い「タイプ」列がある場合は、char(2)をlatin1文字セットと一緒に使用して、最小限のスペースのみを要求することをお勧めします。

1
Nudge

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番目の原因です。

0
Laurent Lyaudet