MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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()を使用しましょう。

  1. 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.

  2. MySQLでDOUBLE型の桁数(長さ)を実装・設定する方法

    MySQLでDOUBLE型のカラムを作成する場合、以下のような構文を使用します。create table yourTableName ( yourColumnName double(5,2) unsigned );DOUBLE型の構文についてdouble(5,2) の「5」は整数部と小数部を合わせた全体の桁数、「2」は小数点以下の桁数を表します。つまり、この設定では最大で 999.99 までの値を格納できます。さらに、unsigned を指定すると負の値が除外され、正の数値のみを扱うカラムになります。テーブルの作成まず、実際にテーブルを作成してみましょう。mysql> create ta