94

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

4

5 に答える 5

180

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

混乱はおそらく、テストされている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文字であると宣言できます。

于 2010-09-18T00:22:13.877 に答える
9

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

UTF-8でスペースを節約するには、CHARの代わりにVARCHARを使用します。それ以外の場合、MySQLはCHAR CHARACTER SET utf8列の各文字に3バイトを予約する必要があります。これは、可能な最大長であるためです。たとえば、MySQLはCHAR(10)CHARACTERSETutf8列用に30バイトを予約する必要があります。

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

于 2010-01-04T04:44:32.047 に答える
7

照合を使用するための32マルチバイトデータ、XAMPPでテストしました。varchar(32)utf8_unicode_ci

1234567890123456789012345678901234567890

次のように切り捨てられます:

12345678901234567890123456789012

これらは通常のASCII文字ではないことに注意してください。

于 2010-01-04T05:03:25.610 に答える
1

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

于 2010-11-17T13:03:07.157 に答える
0

latin1エンコーディングを使用して(たとえばPHPを使用して)データベースに接続し、PHPUTF8文字列をMySQLUTF8列に保存すると、ダブルUTF8エンコーディングになります。

UTF8文字列の$s長さが32文字で64バイトの長さで、列がVARCHAR(32)UTF8の場合、ダブルエンコーディングは文字列$sを64文字の長さのUTF8文字列に変換し、データベースで最初の32バイトに対応する最初の32文字に切り捨てられます。の$s。MySQL5はMySQL4のように動作すると思われるかもしれませんが、実際には同じ効果の2番目の原因です。

于 2017-09-20T18:38:17.290 に答える