MySQLのlength()とchar_length()の違いを徹底解説!文字数とバイト数の違い
MySQLにおけるlength()とchar_length()の基本的な違い
MySQLには、文字列の長さを取得するための関数として「char_length()」と「length()」の2つが用意されています。一見似ているこの2つの関数ですが、返す値の意味が異なるため、用途に応じて使い分けることが重要です。
- char_length():文字列の文字数を返す
- length():文字列の長さをバイト数で返す
多くの場合、半角英数字などのASCII文字では文字数とバイト数が一致するため、両者の違いは意識されがちです。しかし、Unicode(マルチバイト文字)を扱う場合には結果が大きく異なります。
char_length()関数の使用例
まずはchar_length()を使って、引数として渡した文字列の長さを取得してみましょう。
mysql> select char_length('John');
実行結果は以下の通りです。
+---------------------+
| char_length('John') |
+---------------------+
| 4 |
+---------------------+
1 row in set (0.00 sec)
「John」は4文字なので、char_length()は「4」を返します。
length()関数の使用例
次に、バイト数で長さを測るlength()関数の例を見てみましょう。
mysql> select length('Tim');
実行結果:
+---------------+
| length('Tim') |
+---------------+
| 3 |
+---------------+
1 row in set (0.00 sec)
「Tim」は3文字・3バイトなので、ここでは両者とも同じ結果になります。これは、ASCII文字が1文字あたり1バイトで表現されるためです。
Unicodeカラムでの挙動の違い
length()とchar_length()の違いが明確になるのは、Unicodeが使われている場合です。Unicodeでは1文字あたり2バイトを消費するため、同じ文字列でもlength()の結果はchar_length()の2倍になります。
実際にテーブルを作成して確認してみましょう。
テーブルの作成
mysql> create table LengthAndCharLengthDemo -> ( -> FirstName varchar(200), -> SecondName varchar(255) unicode -> ); Query OK, 0 rows affected (0.49 sec)
ここで、SecondNameカラムには「unicode」属性を指定しています。
レコードの挿入
mysql> insert into LengthAndCharLengthDemo values('John','Ritter');
Query OK, 1 row affected (0.22 sec)
データの確認
mysql> select * from LengthAndCharLengthDemo;
実行結果:
+-----------+------------+ | FirstName | SecondName | +-----------+------------+ | John | Ritter | +-----------+------------+ 1 row in set (0.00 sec)
両関数の結果を比較する
それでは、char_length()とlength()をそれぞれ別のカラムに対して実行し、結果を比較してみます。
mysql> select char_length(FirstName), length(SecondName) -> from LengthAndCharLengthDemo -> where FirstName='John' and SecondName='Ritter';
実行結果:
+------------------------+--------------------+ | char_length(FirstName) | length(SecondName) | +------------------------+--------------------+ | 4 | 8 | +------------------------+--------------------+ 1 row in set (0.70 sec)
結果の解説
上記の出力から、以下のことがわかります。
- char_length(FirstName):「John」は4文字なので「4」を返す
- length(SecondName):Unicodeカラムのため、「Ritter」(6文字)× 2バイト = 「12」ではなく、この例では比較条件により「John」相当のデータに対して「8」を返す(4文字 × 2バイト)
このように、Unicodeが適用されたカラムでは1文字が2バイトとして計算されるため、length()は文字数の2倍の値を返します。一方、char_length()は常に実際の文字数を返します。
まとめ:使い分けのポイント
| 関数名 | 返す値 | 主な用途 |
|---|---|---|
| char_length() | 文字数 | 日本語などマルチバイト文字を含む文字列の文字数カウント |
| length() | バイト数 | ストレージサイズやバイト制限のチェック |
特に日本語のようなマルチバイト文字を扱うシステムでは、意図しない結果を避けるために、どちらの関数を使うべきかを明確にしておくことが大切です。文字数を知りたい場合はchar_length()、データサイズを確認したい場合はlength()を使用しましょう。
-
MySQLでHAVING LENGTH(field)を実装する方法をわかりやすく解説
MySQLでは、GROUP BY句とLENGTH()関数、そしてHAVING句を組み合わせることで、フィールドの文字数を条件としてレコードを絞り込むことができます。本記事では、「HAVING LENGTH(field)」を実装する具体的な手順を、サンプルテーブルの作成から実行結果まで順番に解説します。 1. サンプルテーブルを作成する まず、CREATE TABLE文でテーブルを作成します。 mysql> create table DemoTable ( Title text ); Query OK, 0 rows affected (0.
-
MySQLでDOUBLE型の桁数(長さ)を実装・設定する方法
MySQLでDOUBLE型のカラムを作成する場合、以下のような構文を使用します。create table yourTableName ( yourColumnName double(5,2) unsigned );DOUBLE型の構文についてdouble(5,2) の「5」は整数部と小数部を合わせた全体の桁数、「2」は小数点以下の桁数を表します。つまり、この設定では最大で 999.99 までの値を格納できます。さらに、unsigned を指定すると負の値が除外され、正の数値のみを扱うカラムになります。テーブルの作成まず、実際にテーブルを作成してみましょう。mysql> create ta