MySQL-length()とchar_length()


215

主な違いは何だlength()とはchar_length()

バイナリ文字列と非バイナリ文字列に関係があると思います。文字列をバイナリとして保存する実用的な理由はありますか?

mysql> select length('MySQL'), char_length('MySQL');
+-----------------+----------------------+
| length('MySQL') | char_length('MySQL') |
+-----------------+----------------------+
|               5 |                    5 |
+-----------------+----------------------+
1 row in set (0.01 sec)

2
はい、バイナリ文字列が実際にバイナリ文字列である(圧縮されているなど)場合、バイナリ文字列を格納する実用的な理由があります。
sanmai

回答:


351

LENGTH()バイト単位で測定され文字列の長さを返します
CHAR_LENGTH()文字数で測定され文字列の長さを返します。

これは、ほとんどの文字が2バイトでエンコードされるUnicodeに特に関連しています。またはバイト数が異なるUTF-8。例えば:

select length(_utf8 '€'), char_length(_utf8 '€')
--> 3, 1

ご覧のとおり、ユーロ記号は0xE282AC1文字だけですが、3バイトを占めています(UTF-8でエンコードされています)。


6
UCS-2のみが文字ごとに2バイトでエンコードされます。このエンコーディング(より正確にはUTF-16LE)は、Windowsが誤って「Unicode」と呼んでいるものです。MySQLはUTF-16をサポートしていません。代わりに、Unicode文字列を挿入する通常のアプローチは、UTF-8を使用することです。
ボビンス2009年

2
例:select length( '日本語')、char_length( '日本語');
sanmai

@bobince:たとえば、UCS-2でも、一部の文字が2バイトを超えてエンコードされます0313 combining comma above。a = 61なので、0x00610313はa̓として表示され、4バイトを占有します。
Andomar

2
実際にはUnicodeの用語では2文字のままですが、すべての結合マークのように、適切なフォントが利用可能であれば、1つのグリフとしてレンダリングできます。サロゲートのおかげで、UTF-16LEは引き続き4バイト文字を持つことができます。
ボビンス2009年

6
では、VARCHAR列のサイズを変更する方法を理解するときに、これらの関数のどれを使用する必要がありますか?テーブルを作成するとき、1つの列がVARCHAR(10)であるとしましょう。それは最大10文字、または最大10バイトを許可しますか?
still_dreaming_1 2014

19

varchar(10)は10文字を格納しますが、10バイトを超える場合があります。インデックスでは、フィールドの最大長を割り当てます。したがって、UTF8-mb4を使用している場合は、10文字のフィールドに40バイトを割り当てます。

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