MySQL 5.6 Developer試験対策 9 MySQL アプリケーションの開発 -- のこり

MySQL勉強メモ

MySQL 5.6 Developer試験 公式「試験内容 チェックリスト」

[https://education.oracle.com/ja/mysql-56-developer/pexam_1Z0-882:embed:cite]

MySQL 5.6 リファレンスマニュアル

[https://dev.mysql.com/doc/refman/5.6/ja/:embed:cite]


MySQLの標準的なドライバを使用するPHP、Java、および.NET開発の主要な特徴、機能およびオプションを識別する

PHP

[https://www.php.net/manual/ja/mysqlinfo.api.choosing.php:emebed:cite]

  • 2つ(古いもの含め3つ)ある

    • ext/mysqli
    • MySQL専用
    • PDO
    • MySQL以外にも使えるやつ
    • ext/mysql
    • mysqliの前身

      • といいつつ互換はないとかなんとか
    • 古い

      • 5.x時点で非推奨。PHP7.xで削除
  • PHPにはコネクションプールはない

  • 【所感】2020/06/06現在、業務で普段遣いしているのはPDO

    • LaravelのConnectionの内部で使われている

Java

JDBC

[https://docs.oracle.com/javase/jp/8/docs/technotes/guides/jdbc/index.html:embed:cite]

  • たぶんこれ

.NET

ADO.NET

[https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/ado-net-code-examples:embed:cite]

  • たぶんこれ

MySQlのエラー・メッセージを解釈する

[https://dev.mysql.com/doc/refman/5.6/ja/error-message-language.html:embed:cite]

  • エラーメッセージ言語を設定できる
mysqld --lc_messages_dir=/usr/share/mysql --lc_messages=fr_FR
  • 上記起動オプションで起動したならば:

    1. fr_FRがfrenchにマッピングされる
    2. /usr/share/mysql/frenchでエラーメッセージが検索される

サーバーのエラーコードおよびメッセージ

[https://dev.mysql.com/doc/refman/5.6/ja/error-messages-server.html:embed:cite]

エラー: 1045 SQLSTATE: 28000 (ER_ACCESS_DENIED_ERROR)

メッセージ: ユーザー '%s'@'%s' のアクセスは拒否されました (使用パスワード: %s)

こういうやつ

クライアントのエラーコードおよびメッセージ

[https://dev.mysql.com/doc/refman/5.6/ja/error-messages-client.html:embed:cite]

エラー: 2001 (CR_SOCKET_CREATE_ERROR)

メッセージ: UNIX のソケット (%d) を作成できません

こういうやつ

使用可能な診断情報を収集する

[https://dev.mysql.com/doc/refman/5.6/ja/diagnostics-area.html:embed:cite]

mysql> DROP TABLE test.no_such_table;
ERROR 1051 (42S02): Unknown table 'test.no_such_table'
  • テーブルを使用するため診断領域クリア
  • 条件が発生したので移入する
mysql> SHOW WARNINGS;
+-------+------+------------------------------------+
| Level | Code | Message                            |
+-------+------+------------------------------------+
| Error | 1051 | Unknown table 'test.no_such_table' |
+-------+------+------------------------------------+
1 row in set (0.00 sec)
  • 診断情報抽出
GET DIAGNOSTICS CONDITION 1
  @p1 = MYSQL_ERRNO,@p2 = RETURNED_SQLSTATE, @p3 = MESSAGE_TEXT;
  
SELECT @p1 AS MYSQL_ERRNO
     , @p2 AS RETURNED_SQLSTATE
     , @p3 AS MESSAGE_TEXT
  FROM DUAL;
+-------------+-------------------+------------------------------------+
| MYSQL_ERRNO | RETURNED_SQLSTATE | MESSAGE_TEXT                       |
+-------------+-------------------+------------------------------------+
|        1051 | 42S02             | Unknown table 'test.no_such_table' |
+-------------+-------------------+------------------------------------+
1 row in set (0.00 sec)
  • テーブル不使用、警告も生成しない場合、診断領域はそのまま
mysql> SET @x = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW WARNINGS;
+-------+------+------------------------------------+
| Level | Code | Message                            |
+-------+------+------------------------------------+
| Error | 1051 | Unknown table 'test.no_such_table' |
+-------+------+------------------------------------+
1 row in set (0.00 sec)
  • テーブルを使用せず、エラー生成する場合

    • 診断領域をクリアして移入
mysql> SET @x = @@x;
ERROR 1193 (HY000): Unknown system variable 'x'

mysql> SHOW WARNINGS;
+-------+------+-----------------------------+
| Level | Code | Message                     |
+-------+------+-----------------------------+
| Error | 1193 | Unknown system variable 'x' |
+-------+------+-----------------------------+
1 row in set (0.00 sec)
  • 条件番号が1までしかないのに2の抽出を試みてみる

    • テーブルを触らず、警告発生
    • 診断領域はクリアされず、条件が移入される
mysql> GET DIAGNOSTICS CONDITION 2 @p = MESSAGE_TEXT;
Query OK, 0 rows affected, 1 warning (0.00 sec)

SHOW WARNINGS;
+-------+------+-----------------------------+
| Level | Code | Message                     |
+-------+------+-----------------------------+
| Error | 1193 | Unknown system variable 'x' |
| Error | 1758 | Invalid condition number    |
+-------+------+-----------------------------+
2 rows in set (0.00 sec)
  • 2つめが入ったので今度はちゃんと動く
mysql> GET DIAGNOSTICS CONDITION 2 @p = MESSAGE_TEXT;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @p;
+--------------------------+
| @p                       |
+--------------------------+
| Invalid condition number |
+--------------------------+
1 row in set (0.00 sec)
  • 警告の場合でも、テーブルを触ると診断領域はクリアされる
mysql> DROP TABLE no_such_table;
ERROR 1051 (42S02): Unknown table 'sample.no_such_table'

mysql> SHOW WARNINGS;
+-------+------+--------------------------------------+
| Level | Code | Message                              |
+-------+------+--------------------------------------+
| Error | 1051 | Unknown table 'sample.no_such_table' |
+-------+------+--------------------------------------+
1 row in set (0.00 sec)

mysql> CREATE TABLE tbl (d timestamp);
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO tbl VALUES ('2039-01-01 00:00:00');
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> SHOW WARNINGS;
+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1264 | Out of range value for column 'd' at row 1 |
+---------+------+--------------------------------------------+
1 row in set (0.00 sec)

診断領域をクリアするか否か

テーブル触る テーブル触らない
警告 クリア
エラー クリア クリア
  • CONDITIONの数はNUMBERで取れる
mysql> DROP TABLE no_such_table;
ERROR 1051 (42S02): Unknown table 'sample.no_such_table'

mysql> GET DIAGNOSTICS CONDITION 3 @p = MESSAGE_TEXT;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> GET DIAGNOSTICS CONDITION 3 @p = MESSAGE_TEXT;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> GET DIAGNOSTICS CONDITION 3 @p = MESSAGE_TEXT;
Query OK, 0 rows affected (0.00 sec)

mysql> GET DIAGNOSTICS @n = NUMBER;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @n;
+------+
| @n   |
+------+
|    3 |
+------+
1 row in set (0.00 sec)
  • 関連するシステム変数
mysql> SELECT @@max_error_count,@@warning_count,@@error_count,@@sql_notes;
+-------------------+-----------------+---------------+-------------+
| @@max_error_count | @@warning_count | @@error_count | @@sql_notes |
+-------------------+-----------------+---------------+-------------+
|                64 |               3 |             3 |           1 |
+-------------------+-----------------+---------------+-------------+
1 row in set (0.00 sec)
  • max_error_countを超えて追加しようとした分は暗黙理に捨てられる

    • RESIGNALによって追加された場合はつねに診断領域に追加され、ところてん式に古いものが捨てられる
  • warning_count,error_countは捨てられた分も数える
  • 例:max_error_count を2にしてみる
mysql> SET @@max_error_count = 2;
Query OK, 0 rows affected (0.01 sec)
  • 警告を4つ発生させる
mysql> DROP TABLE no_such_table;
ERROR 1051 (42S02): Unknown table 'sample.no_such_table'

mysql> GET DIAGNOSTICS CONDITION 3 @p = MESSAGE_TEXT;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> GET DIAGNOSTICS CONDITION 3 @p = MESSAGE_TEXT;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> GET DIAGNOSTICS CONDITION 3 @p = MESSAGE_TEXT;
Query OK, 0 rows affected, 1 warning (0.00 sec)
  • NUMBER (診断領域に実際に格納されている件数)は2

    • 上限にかかった
mysql> GET DIAGNOSTICS @n = NUMBER;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @n;
+------+
| @n   |
+------+
|    2 |
+------+
1 row in set (0.00 sec)
  • いちばん古いUnknown table 'sample.no_such_table'が残っている = 新しいものが捨てられている
mysql> SHOW WARNINGS;
+-------+------+--------------------------------------+
| Level | Code | Message                              |
+-------+------+--------------------------------------+
| Error | 1051 | Unknown table 'sample.no_such_table' |
| Error | 1758 | Invalid condition number             |
+-------+------+--------------------------------------+
2 rows in set (0.00 sec)
  • システム変数確認
mysql> SELECT @@max_error_count,@@warning_count,@@error_count,@@sql_notes;
+-------------------+-----------------+---------------+-------------+
| @@max_error_count | @@warning_count | @@error_count | @@sql_notes |
+-------------------+-----------------+---------------+-------------+
|                 2 |               4 |             4 |           1 |
+-------------------+-----------------+---------------+-------------+
1 row in set (0.00 sec)