カテゴリー
SugiBlog Webデザイナー・プログラマーのためのお役立ちTips

指定した文字列が最初に出現する位置を調べるLOCATE関数

LOCATE関数を使うと指定した文字列が最初に出現する位置を調べることができます。

【書式】
LOCATE(substr, str)
LOCATE(substr, str, pos)

【引数】
substr:検索文字列
str:検索対象文字列
pos:オフセット

posは何文字目以降を検索するかを数値で指定します。

例)

mysql> SELECT LOCATE('bar', 'foobarbar');
        -> 4
mysql> SELECT LOCATE('xbar', 'foobar');
        -> 0
mysql> SELECT LOCATE('bar', 'foobarbar', 5);
        -> 7

INSTR関数も同様の動作をしますが、引数の順序が逆なのと、第3引数がないのでご注意ください。

mysql> SELECT INSTR('foobarbar', 'bar');
        -> 4
mysql> SELECT INSTR('xbar', 'foobar');
        -> 0
859 views

MySQL Safe Updatesモード

MySQLのSafe UpdatesモードがONのとき、UPDATEやDELETEを実行しようとすると以下のような警告が出てエラーになることがあります。

Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.

これはUPDATEやDELETEでWHERE句を付けなかったり、WHERE句でキーとなるカラムに条件指定をしなかったときに、間違って大量のデータを更新・削除してしまうことを防ぐための機能が働いているためです。

この機能は非常に有り難いものではあるんですが、開発をしているとどうしてもそういった処理をしたい場合があると思います。
そんなときは一時的にSafe UpdatesモードをOFFにして作業しましょう。

Safe UpdatesモードをOFFにするには以下のコードを実行します。

SET SQL_SAFE_UPDATES = 0;

処理が終わったら、必ず元に戻しましょう。

SET SQL_SAFE_UPDATES = 1;
907 views

MySQLのチューニング(クエリ実行速度の改善)

MySQLのクエリ実行速度が遅いので調査・改善する機会がありましたので、それについて書いておきたいと思います。

チェックポイントは以下の通りです。

  • 適切なインデックスが貼られているか確認
  • EXPLAINで実際に使用されたインデックスの確認

適切なインデックスが貼られているか確認

まずは適切なインデックスが貼られているかを確認します。
ここをチェックしないと始まらないのでしっかりと確認します。
適切なインデックスが貼られていない場合は追加します。

EXPLAINで実際に使用されたインデックスの確認

インデックスを追加して、それでも実行速度に改善が見られない場合は、そのインデックスが実際に使われているかを調べます。
SQL文の前にEXPLAINを付加して実行します。

EXPLAINは、クエリー実行計画(MySQLがクエリーをどのように実行するかの説明)を取得するために使用されます。

EXPLAIN SELECT ...

表示された結果の内容を抜粋してご説明します。

possible_keys

利用可能なインデックスの一覧(候補)
続きを読む…»

852 views

MySQLのNULL安全等価演算子(宇宙船演算子)

今回はMySQLでのNULL安全等価演算子についてご紹介します。
NULL安全等価演算子とは<=>のことで、見た目が宇宙船に似ていることからSpaceship Operator(宇宙船演算子)とも言われます。
※他言語でもあるんですが、返り値が違ったりするのでご注意ください。

まず、値の比較について見ていきます。

11を等価演算子で比較します。

MySQL> SELECT 1 = 1;
+-------+
| 1 = 1 |
+-------+
|     1 |
+-------+

結果は真の1となりました。

次は10を比較してみましょう。

MySQL> SELECT 1 = 0;
+-------+
| 1 = 0 |
+-------+
|     0 |
+-------+

結果は偽の0となりました。

今後は1NULLを比較してみます。

MySQL> SELECT 1 = NULL;
+----------+
| 1 = NULL |
+----------+
|     NULL |
+----------+

結果は偽の0となるかと思いきや、NULLとなりました。

NULL同士を比較するとどうでしょうか。

MySQL> SELECT NULL = NULL;
+-------------+
| NULL = NULL |
+-------------+
|        NULL |
+-------------+

結果はNULLとなりました。

1NULLの場合は0NULL同士の場合は1になって欲しいですよね。
そこで登場するのが、今回のNULL安全等価演算子(宇宙船演算子)です。
それを使うと次のようになります。

1NULLの場合

SELECT 1 <=> NULL;
+------------+
| 1 <=> NULL |
+------------+
|          0 |
+------------+

NULL同士の場合

SELECT NULL <=> NULL;
+---------------+
| NULL <=> NULL |
+---------------+
|             1 |
+---------------+

ということで、まさに欲しい結果が返ってきてくれます。

続いてサンプルデータを用いて、実際の事例をご紹介します。
続きを読む…»

1,539 views

PHPで10進数を2・8・16進数に変換

PHPで10進数から2・8・16進数へと、基数変換を行う方法をご紹介します。

まずは10進数で変換する値を宣言しておきます。

$dec = 500;

2進数に変換

書式:decbin(int $num): string

$bin = decbin($dec);
echo $bin;

出力結果は111110100となります。

8進数に変換

書式:decoct(int $num): string

$oct = decoct($dec);
echo $oct;

出力結果は764となります。

16進数に変換

書式:dechex(int $num): string

$hex = dechex($dec);
echo $hex;

出力結果は1f4となります。


今度は逆に変換してみましょう。

2進数から10進数に変換

書式:bindec(string $binary_string): int|float

$dec = bindec('111110100');
echo $dec; //500

続きを読む…»

410 views