MySQL 5.6 Developer試験対策 9 MySQL アプリケーションの開発 -- のこり
MySQL 5.6 Developer試験 公式「試験内容 チェックリスト」
https://education.oracle.com/ja/mysql-56-developer/pexam_1Z0-882education.oracle.com
MySQL 5.6 リファレンスマニュアル
MySQLの標準的なドライバを使用するPHP、Java、および.NET開発の主要な特徴、機能およびオプションを識別する
PHP
- 2つ(古いもの含め3つ)ある
- PHPにはコネクションプールはない
- 単に持続的に接続しているだけ
- 【所感】2020/06/06現在、業務で普段遣いしているのはPDO
- LaravelのConnectionの内部で使われている
Java
- たぶんこれ
.NET
- たぶんこれ
MySQlのエラー・メッセージを解釈する
- エラーメッセージ言語を設定できる
mysqld --lc_messages_dir=/usr/share/mysql --lc_messages=fr_FR
- 上記起動オプションで起動したならば:
- fr_FRが
french
にマッピングされる /usr/share/mysql/french
でエラーメッセージが検索される
- fr_FRが
サーバーのエラーコードおよびメッセージ
エラー: 1045 SQLSTATE: 28000 (ER_ACCESS_DENIED_ERROR) メッセージ: ユーザー '%s'@'%s' のアクセスは拒否されました (使用パスワード: %s)
こういうやつ
クライアントのエラーコードおよびメッセージ
エラー: 2001 (CR_SOCKET_CREATE_ERROR) メッセージ: UNIX のソケット (%d) を作成できません
こういうやつ
使用可能な診断情報を収集する
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)