忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

MySQL 文字列の文字数の取得の注意点について(CHAR_LENGTH、LENGTH)

MySQL で文字列の文字数を半角、および全角(マルチバイト文字)の区別無く、1文字は1文字としてカウントしたい場合があります。
今回はその取得方法としての CHAR_LENGTH 関数の使い方について説明します。
なお、この関数に関連して LENGTH 関数がありますが、こちらは内部的な文字列のコードのバイト数を返します。 文字セットにより文字コードのバイト数は異なりますので、表面上は同じ文字列でも LENGTH が返す値はことる場合があります。

■[CHAR_LENGTH]の例

SELECT CHAR_LENGTH('あいう'), LENGTH('あいう');

この SQL を実行すると多分「3」と「6」が表示されるはずだと思っていたのですが、 Windowsのコマンドプロンプトから MySQL にログインして SQL を実行すると以下の結果となりました。

C:\xampp\mysql\bin>mysql -u root -p
Enter password: ****
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 329
Server version: 10.1.19-MariaDB mariadb.org binary distribution

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> SELECT CHAR_LENGTH('あいう'), LENGTH('あいう');
+-----------------------+------------------+
| CHAR_LENGTH('あいう') | LENGTH('あいう') |
+-----------------------+------------------+
|                     6 |                6 |
+-----------------------+------------------+
1 row in set (0.00 sec)

SQL を実行すると「6」と「6」が表示されてしまいました。

いろいろネットで調べてみると、SQL を実行しているWindwosコマンドプロンプトと データベース側の文字セットが合っていないのではと思い調べてみました。
先ずは現在の文字セットがどうなっているのかを以下の SQL コマンドで調べます。

SHOW VARIABLES LIKE '%char%';

このコマンドの実行結果は以下の様になります。

MariaDB [(none)]> SHOW VARIABLES LIKE '%char%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8                           |
| character_set_connection | utf8                           |
| character_set_database   | utf8                           |
| character_set_filesystem | binary                         |
| character_set_results    | utf8                           |
| character_set_server     | utf8                           |
| character_set_system     | utf8                           |
| character_sets_dir       | C:\xampp\mysql\share\charsets\ |
+--------------------------+--------------------------------+
8 rows in set (0.02 sec)

クライアント側の文字セット( character_set_client )が utf8 ではまずいのではないかと思い、 Windowsなので Shift-JIS の識別子である cp932 にしてみることにしました。

■クライアント側の文字セットの変更[SET NAMES]の例

この設定に便利なコマンドがあるのですが、以下のものです。

SET NAMES charset_name [COLLATE collation_name];
-- charset_name   :クライアントのセッションの文字セット
-- collation_name :照合順序

早速、このコマンドを使って cp932 にしてみることにしました。

MariaDB [(none)]> SET NAMES cp932;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> SHOW VARIABLES LIKE '%char%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | cp932                          |
| character_set_connection | cp932                          |
| character_set_database   | utf8                           |
| character_set_filesystem | binary                         |
| character_set_results    | cp932                          |
| character_set_server     | utf8                           |
| character_set_system     | utf8                           |
| character_sets_dir       | C:\xampp\mysql\share\charsets\ |
+--------------------------+--------------------------------+
8 rows in set (0.00 sec)


クライアント側の文字セット( character_set_client )が cp932 になりましたので CHAR_LENGTH のテストを行います。 期待通りに「3」の文字数が返されました。

MariaDB [(none)]> SELECT CHAR_LENGTH('あいう'), LENGTH('あいう');
+-----------------------+------------------+
| CHAR_LENGTH('あいう') | LENGTH('あいう') |
+-----------------------+------------------+
|                     3 |                6 |
+-----------------------+------------------+
1 row in set (0.00 sec)



なお phpMyAdmin で文字セットの確認と、上記の SQL を実行してみましたが、以下の様な表示となりました。

character_set_clientutf8mb4 となっているので 'あいう' のそれぞれのコードは内部的に3バイトのため、 LENGTH の結果は「9」が返ってきます。












PR

コメント

コメントを書く