MySQLVARCHARの長さとUTF-8


84

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


@naXa:私はしませんでした。あなたは私がすべきだと思いますか?
Alix Axel

わかりません。)それはあなたの質問です、そしてそれはあなた次第です。「別の答えがもっと完全に見える」と言いたかっただけです。
naXa 2014年

@robsch以前に受け入れられた答えは単純で正しかった。しかし、私はあなたが望むものを受け入れました。
Alix Axel

回答:


168

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

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


48
Mブラウン、これに言及してくれてありがとう。VARCHAR(10)フィールド(を使用utf8mb4)は、「💩💩💩💩💩💩💩💩💩💩」(10パイルのうんち)を格納できます。これは10文字ですが40バイトです。
basic6 2014

3
この。これが唯一の正しい答えです。あまりにも多くの人々がバージョン4の振る舞いを福音と信じています。
ブレンダンバード2014

2
受け入れられた答えはMySQL5でも正しいです-挿入された数字は実際には全幅文字セットの一部であり、「32マルチバイトデータ」を挿入したというポスターにも記載されているように、マルチバイトユニコード文字です。多くの人が誤解しているのは残念です。
user193130 2015

次のソースを引用すると、utf8文字には現在最大6バイトが必要なので、1〜6バイトのどこかにあると思います。これにより、最大文字数が10922になる最悪のケースが発生します。 joelonsoftware.com/articles/Unicode.html
usumoio

1
@usumoio現在、MySQLはUTF-8の3バイトバリアントを使用しているようです。(標準の)4バイトバリアントへの移行が計画されています:dev.mysql.com/doc/refman/8.0/en/charset-unicode -utf8.html
flow2k

8

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

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

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


私はほとんど使用CHARしませんし、使用するときはマルチバイト文字を格納することを意図していないので、安全です。何についてVARCHAR、あなたは必ず制限は、シングルバイト文字にマルチバイト文字といないで定義されていますか?
Alix Axel

9
@jspcal:UTF-8は、3ではなく文字あたり最大4バイトを使用します。またはMySQLは4バイトすべてをサポートしていませんか?
Remy Lebeau 2010年

4
@RemyLebeauあなたはutf8については正しいですが、MySQLについてはそうではありません。さまざまなutf8_xxx文字セットは最大3バイトです。utf8mb4_xxxは4バイト文字を取ります。dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html
Buttle Butkus

時間の経過とともに、MySQLは最終的に標準の4バイトバージョンを使用するように見えます(ただし、執筆時点ではまだです):dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8 .html
flow2k

6

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

1234567890123456789012345678901234567890

切り捨てられる:

12345678901234567890123456789012

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


4
UTF-8では、標準のASCII文字は1バイトにのみ格納されます。これを実際にテストするには、テスト用にマルチバイト(つまり非ASCII)文字を実際に使用する必要があります。
rjmackay 2013

5
これは、少なくともMySQL5以降では間違っています。varcharまたはcharの列サイズを指定する場合、文字で指定します。VARCHAR(32)列の実際のサイズは32x3 + 1 = 97バイトになると思います。
バトルブトクス2013年

5
@rjmackay '到来'は標準のASCII文字ではありません。en.wikipedia.org/wiki/…–
Alexey Lebedev

7
DBに40個のUnicode文字を挿入しましたが、32文字で切り捨てられました。しかし、人々は私がASCIIバイトを使用し、32バイトで切り捨てられると思っているようです。不思議ではありません、私は反対票を獲得しました、笑。
あなた

2
@ButtleButkus "VARCHAR(32)列の実際のサイズは32x3 + 1 = 97バイトになると思います"を使用するとそうなりますutf8が、MySQLでのUnicodeサポートが機能しなくなります。最大値utf8mb4があるため、代わりにエンコーディングを使用する必要がありますMySQLのutf8のバリアントのように3ではなく、utf-8文字4バイト
...– Stijn de Witt 2015

1

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


1
テーブルのいずれかの列がvarcharである場合、char列を持つことのすべての利点が失われることを読みました。基本的に、最大の利益を得るには、テーブル内のすべてのvarcharまたはすべてのcharを使用する必要があるようです。でも、それが本当かどうかはわかりません。
バトルブトクス2013年

MyISAMの場合、にはいくつかの議論がありCHARます。InnoDBの場合、他にも多くのことが行われているため、「動的/固定行サイズ」の議論は本質的に無関係です。
リックジェームス

ここで重要な点は、長さが非常に短い場合は、を使用すると便利な場合があるということCHARです。
toolmakerSteve 2017年

0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.