[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
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_client が utf8mb4 となっているので 'あいう' のそれぞれのコードは内部的に3バイトのため、 LENGTH の結果は「9」が返ってきます。
コメント