MySQLVARCHAR(32)
で、UTF-8テーブルに新しいフィールドを作成した場合、そのフィールドに32バイトのデータまたは32文字(マルチバイト)を格納できることを意味しますか?
MySQLVARCHAR(32)
で、UTF-8テーブルに新しいフィールドを作成した場合、そのフィールドに32バイトのデータまたは32文字(マルチバイト)を格納できることを意味しますか?
回答:
この答えは私のグーグル検索結果の上部に表示されましたが、正しくありませんでした:
混乱はおそらく、テストされている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文字であると宣言できます。
utf8mb4
)は、「💩💩💩💩💩💩💩💩💩💩」(10パイルのうんち)を格納できます。これは10文字ですが40バイトです。
32個のマルチバイト文字を保存できます
UTF-8でスペースを節約するには、CHARの代わりにVARCHARを使用します。それ以外の場合、MySQLはCHAR CHARACTER SET utf8列の各文字に3バイトを予約する必要があります。これは、可能な最大長であるためです。たとえば、MySQLはCHAR(10)CHARACTER SETutf8列用に30バイトを予約する必要があります。
CHAR
しませんし、使用するときはマルチバイト文字を格納することを意図していないので、安全です。何についてVARCHAR
、あなたは必ず制限は、シングルバイト文字にマルチバイト文字といないで定義されていますか?
照合を使用するための32マルチバイトデータ、XAMPPでテストしました。varchar(32)
utf8_unicode_ci
1234567890123456789012345678901234567890
切り捨てられる:
12345678901234567890123456789012
これらは通常のASCII文字ではないことに注意してください。
utf8
が、MySQLでのUnicodeサポートが機能しなくなります。最大値utf8mb4
があるため、代わりにエンコーディングを使用する必要があります。MySQLのutf8のバリアントのように3ではなく、utf-8文字で4バイト
行の合計データ長は固定されて高速になるため、頻繁に更新されるテーブルには「char」を使用することをお勧めします。Varchar列は、行のデータサイズを動的にします。これはMyISAMには良くありませんが、InnoDBなどについてはわかりません。たとえば、「タイプ」列が非常に狭い場合は、最小限のスペースのみを要求するために、char(2)とlatin1文字セットを使用する方がよい場合があります。
CHAR
ます。InnoDBの場合、他にも多くのことが行われているため、「動的/固定行サイズ」の議論は本質的に無関係です。
CHAR
です。
latin1エンコーディングを使用して(たとえばPHPを使用して)データベースに接続し、PHPUTF8文字列をMySQLUTF8列に保存すると、二重UTF8エンコーディングになります。
UTF8文字列の$s
長さが32文字で64バイトの長さで、列がVARCHAR(32)
UTF8の場合、ダブルエンコーディングは文字列$s
を64文字の長さのUTF8文字列に変換し、データベースで最初の32バイトに対応する最初の32文字に切り捨てられます。の$s
。MySQL5はMySQL4のように動作すると思われるかもしれませんが、実際には同じ効果の2番目の原因です。