このページは機械翻訳したものです。
表 12.20 「情報関数」
| 名前 | 説明 |
|---|---|
BENCHMARK() |
式を繰り返し実行します |
CHARSET() |
引数の文字セットを返します |
COERCIBILITY() |
文字列引数の照合順序強制性値を返します |
COLLATION() |
文字列引数の照合順序を返します |
CONNECTION_ID() |
接続のための接続 ID (スレッド ID) を返します |
CURRENT_ROLE() |
現在アクティブなロールを返します |
CURRENT_USER(), CURRENT_USER |
認証済みユーザー名とホスト名 |
DATABASE() |
デフォルト (現在) のデータベース名を返します |
FOUND_ROWS() |
LIMIT 句付き SELECT で、LIMIT 句がない場合に戻される可能性がある行の数です |
ICU_VERSION() |
ICU ライブラリバージョン |
LAST_INSERT_ID() |
前回の INSERT での AUTOINCREMENT カラムの値です |
ROLES_GRAPHML() |
メモリーロールのサブグラフを表す GraphML ドキュメントを返します |
ROW_COUNT() |
更新された行数 |
SCHEMA() |
DATABASE() のシノニムです |
SESSION_USER() |
USER() のシノニムです |
SYSTEM_USER() |
USER() のシノニムです |
USER() |
ユーザー名と、クライアントによって提供されるホスト名です |
VERSION() |
MySQL サーバーのバージョンを示す文字列を返します |
-
BENCHMARK(count,expr)BENCHMARK()関数は、式exprをcountの回数だけ繰り返し実行します。 MySQL による式の処理速度を計測する際に使用される場合もあります。NULLや負の繰返し回数などの不適切な引数の場合、結果値は0またはNULLです。この使用目的は、mysql クライアント内から、クエリーの実行時間をレポートすることです。
mysql> SELECT BENCHMARK(1000000,AES_ENCRYPT('hello','goodbye')); +---------------------------------------------------+ | BENCHMARK(1000000,AES_ENCRYPT('hello','goodbye')) | +---------------------------------------------------+ | 0 | +---------------------------------------------------+ 1 row in set (4.74 sec)レポートされる時間は、クライアント側での経過時間であり、サーバー側での CPU 時間ではありません。
BENCHMARK()を複数回実行し、サーバーマシン上の負荷量について結果を解釈することをお勧めします。BENCHMARK()の目的は、スカラー式の実行時パフォーマンスを測定することです。これにより、その使用方法や結果の解釈方法について、重要ないくつかの推測が提供されます。スカラー式しか使用できません。 式をサブクエリーにすることはできますが、単一のカラムおよび最大でも単一の行が返される必要があります。 たとえば、テーブル
tに複数のカラムまたは複数の行がある場合、BENCHMARK(10, (SELECT * FROM t))は失敗します。SELECTステートメントをexprN回実行する場合と、SELECT BENCHMARK(を実行する場合とでは、発生するオーバーヘッドの量が異なります。 この 2 つは非常に異なる実行プロファイルを持つため、両者の所要時間は同一になりません。 前者では、パーサー、オプティマイザ、テーブルロック、および実行時評価がそれぞれN,expr)N回ずつ発生します。 後者では、実行時評価のみがN回発生し、その他のすべてのコンポーネントは 1 回だけ発生します。 割り当て済みのメモリー構造体は再使用され、集約関数で評価済みの結果をローカルキャッシュに入れるなどの実行時最適化によって、結果が変わる可能性もあります。 したがって、BENCHMARK()を使用して、実行時コンポーネントに高い重みを付加し、ネットワーク、パーサー、オプティマイザなどで導入された「ノイズ」を削除することで、そのコンポーネントのパフォーマンスが測定されます。
-
CHARSET(str)文字列引数の文字セットを返します。
mysql> SELECT CHARSET('abc'); -> 'utf8' mysql> SELECT CHARSET(CONVERT('abc' USING latin1)); -> 'latin1' mysql> SELECT CHARSET(USER()); -> 'utf8' -
COERCIBILITY(str)文字列引数の照合順序強制性値を返します。
mysql> SELECT COERCIBILITY('abc' COLLATE utf8_swedish_ci); -> 0 mysql> SELECT COERCIBILITY(USER()); -> 3 mysql> SELECT COERCIBILITY('abc'); -> 4 mysql> SELECT COERCIBILITY(1000); -> 5戻り値の意味は、次の表に示すとおりです。 値が低いほど、優先順位は高くなります。
型変換属性 意味 例 0明示的な照合順序 COLLATE句の値1照合順序なし さまざまな照合順序との文字列の連結 2暗黙的な照合順序 カラム値、ストアドルーチンパラメータ、またはローカル変数 3系統定数 USER()の戻り値4型変換可能 リテラル文字列 5数値 数値または時間値 5無視可能 NULLまたはNULLから派生した式詳細は、セクション10.8.4「式での照合の強制性」を参照してください。
-
COLLATION(str)文字列引数の照合順序を返します。
mysql> SELECT COLLATION('abc'); -> 'utf8_general_ci' mysql> SELECT COLLATION(_utf8mb4'abc'); -> 'utf8mb4_0900_ai_ci' mysql> SELECT COLLATION(_latin1'abc'); -> 'latin1_swedish_ci' -
CONNECTION_ID()接続用の接続 ID (スレッド ID) を返します。 すべての接続は、現在接続されているクライアントのセット間で一意の ID を持っています。
CONNECTION_ID()で返される値の型は、INFORMATION_SCHEMA.PROCESSLISTテーブルのIDカラム、SHOW PROCESSLIST出力のIdカラム、およびパフォーマンススキーマthreadsテーブルのPROCESSLIST_IDカラムに表示される値と同じです。mysql> SELECT CONNECTION_ID(); -> 23786警告pseudo_thread_idシステム変数のセッション値を変更すると、CONNECTION_ID()関数によって返される値が変更されます。 -
CURRENT_ROLE()現在のセッションの現在アクティブなロールをカンマで区切って含む
utf8文字列を返します。存在しない場合はNONEを返します。 この値は、sql_quote_show_createシステム変数の設定を反映します。アカウントに次のようなロールが付与されているとします:
GRANT 'r1', 'r2' TO 'u1'@'localhost'; SET DEFAULT ROLE ALL TO 'u1'@'localhost';u1のセッションでは、CURRENT_ROLE()の初期値によってデフォルトのアカウントロールが指定されます。 次のようなSET ROLEの変更を使用:mysql> SELECT CURRENT_ROLE(); +-------------------+ | CURRENT_ROLE() | +-------------------+ | `r1`@`%`,`r2`@`%` | +-------------------+ mysql> SET ROLE 'r1'; SELECT CURRENT_ROLE(); +----------------+ | CURRENT_ROLE() | +----------------+ | `r1`@`%` | +----------------+ -
CURRENT_USER,CURRENT_USER()現在のクライアントを認証する際にサーバーで使用された MySQL アカウントを表すユーザー名とホスト名の組み合わせを返します。 このアカウントで、アクセス権限が決まります。 戻り値は、
utf8文字セット内の文字列です。CURRENT_USER()の値は、USER()の値とは異なる可能性があります。mysql> SELECT USER(); -> 'davida@localhost' mysql> SELECT * FROM mysql.user; ERROR 1044: Access denied for user ''@'localhost' to database 'mysql' mysql> SELECT CURRENT_USER(); -> '@localhost'この例は、クライアントが
davidaのユーザー名を指定 (USER()関数の値で指定されます) したが、サーバーは匿名のユーザーアカウント (CURRENT_USER()値の空のユーザー名部分に表示されます) を使用してクライアントを認証したことを示しています。 これが発生する原因として、davidaの付与テーブルにアカウントが一覧表示されていないことが考えられます。ストアドプログラムまたはビューでは、
SQL SECURITY INVOKER特性で定義されていなければ、CURRENT_USER()はオブジェクトを定義したユーザー (そのDEFINER値で指定されます) のアカウントを返します。 後者の場合、CURRENT_USER()はオブジェクトを呼び出したユーザーを返します。トリガーおよびイベントには、
SQL SECURITY特性を定義するためのオプションがありません。したがって、このようなオブジェクトの場合、CURRENT_USER()はオブジェクトを定義したユーザーのアカウントを返します。 呼び出したユーザーを返すには、USER()またはSESSION_USER()を使用します。次のステートメントでは、影響を受けるユーザーや定義したユーザーの名前 (ホストの可能性もあります) の代わりに、
CURRENT_USER()関数を使用することがサポートされています。このような場合、必要に応じてCURRENT_USER()が拡張されます。DROP USERRENAME USERGRANTREVOKECREATE FUNCTIONCREATE PROCEDURECREATE TRIGGERCREATE EVENTCREATE VIEWALTER EVENTALTER VIEWSET PASSWORD
CURRENT_USER()のこの拡張によるレプリケーションへの影響については、セクション17.5.1.8「CURRENT_USER() のレプリケーション」 を参照してください。 -
DATABASE()デフォルト (現在) のデータベース名を
utf8文字セット内の文字列として返します。 デフォルトのデータベースがない場合は、DATABASE()はNULLを返します。 ストアドルーチン内では、デフォルトのデータベースはルーチンが関連付けられたデータベースですが、これは呼び出し元のコンテキストでのデフォルトのデータベースと同じであるとはかぎりません。mysql> SELECT DATABASE(); -> 'test'デフォルトのデータベースがない場合は、
DATABASE()はNULLを返します。 -
FOUND_ROWS()注記SQL_CALC_FOUND_ROWSクエリー修飾子および付随するFOUND_ROWS()関数は、MySQL 8.0.17 で非推奨になりました。これらは、MySQL の将来のバージョンで削除される予定です。 かわりに、LIMITを使用してクエリーを実行してから、追加の行があるかどうかを判断するためにCOUNT(*)およびLIMITを使用しない別のクエリーを検討してください。 たとえば、次のクエリーのかわりに:SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10; SELECT FOUND_ROWS();かわりに次のクエリーを使用します:
SELECT * FROM tbl_name WHERE id > 100 LIMIT 10; SELECT COUNT(*) FROM tbl_name WHERE id > 100;COUNT(*)は、特定の最適化の対象となります。SQL_CALC_FOUND_ROWSでは、一部の最適化が無効になります。サーバーからクライアントに返される行の数を制限するために、
SELECTステートメントにLIMIT句が含まれている場合があります。 場合によっては、ステートメントを再度実行せずに、LIMITを付けなかった場合にステートメントで返されるはずの行数を知っておくことが望ましいことがあります。 この行数を取得するには、SELECTステートメントにSQL_CALC_FOUND_ROWSオプションを含めてから、FOUND_ROWS()を起動します:mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name -> WHERE id > 100 LIMIT 10; mysql> SELECT FOUND_ROWS();2 番目の
SELECTは、1 番目のSELECTをLIMIT句なしで記述した場合に返される行数を示す数字を返します。最近成功した
SELECTステートメントにSQL_CALC_FOUND_ROWSオプションを付けなければ、FOUND_ROWS()は、そのステートメントで返された結果セットの行数を返します。 ステートメントにLIMIT句が含まれている場合、FOUND_ROWS()はその制限値以下の行数を返します。 たとえば、ステートメントにLIMIT 10またはLIMIT 50, 10が含まれている場合、FOUND_ROWS()はそれぞれ 10 と 60 を返します。FOUND_ROWS()から取得できる行数は一時的なもので、SELECT SQL_CALC_FOUND_ROWSステートメントのあとに、このステートメントを発行しても取得できるようには設計されていません。 あとで値を参照する必要がある場合は、保存してください。mysql> SELECT SQL_CALC_FOUND_ROWS * FROM ... ; mysql> SET @rows = FOUND_ROWS();SELECT SQL_CALC_FOUND_ROWSを使用している場合は、MySQL では完全な結果セット内の行数を計算する必要があります。 ただし、結果セットはクライアントに送信される必要がないため、LIMITなしでクエリーを再度実行するよりも速くなります。SQL_CALC_FOUND_ROWSおよびFOUND_ROWS()は、クエリーで返される行数を制限するが、クエリーを再度実行しないで完全な結果セット内の行数を確認する必要がある状況でも役立ちます。 例として、検索結果のほかのセクションを表示するページへのリンクを含むページが表示される Web スクリプトがあります。FOUND_ROWS()を使用すると、残りの結果を表示するために必要なその他のページ数を確認できます。SQL_CALC_FOUND_ROWSおよびFOUND_ROWS()を使用すると、UNIONの複数箇所でLIMITが発生する可能性があるため、単純なSELECTステートメントよりも、UNIONステートメントで使用した方が複雑になります。 これは、UNION内の個々のSELECTステートメントに適用される場合と、UNIONの結果全体にグローバルに適用される場合があります。UNIONでSQL_CALC_FOUND_ROWSを使用する目的は、グローバルなLIMITなしで返される行数を返すことです。UNIONでSQL_CALC_FOUND_ROWSを使用する条件は、次のとおりです。UNIONの 1 番目のSELECTに、SQL_CALC_FOUND_ROWSキーワードが表示される必要があります。FOUND_ROWS()の値は、UNION ALLが使用されている場合にのみ正確です。ALLなしでUNIONが使用される場合は、重複の削除が発生し、FOUND_ROWS()の値が単なる近似値になります。UNIONでLIMITが表示されない場合は、SQL_CALC_FOUND_ROWSが無視され、UNIONを処理するために作成された一時テーブル内の行数が返されます。
ここで説明した以外のケースでは、
FOUND_ROWS()の動作 (エラーが発生してSELECTステートメントに失敗したあとの値など) が定義されません。重要ステートメントベースのレプリケーションでは、確実に
FOUND_ROWS()をレプリケートすることはできません。 行ベースのレプリケーションを使用すると、この関数は自動的にレプリケートされます。 -
ICU_VERSION()正規表現操作のサポートに使用される International Components for Unicode (ICU) ライブラリのバージョン (セクション12.8.2「正規表現」 を参照)。 この関数は、主にテストケースでの使用を目的としています。
-
LAST_INSERT_ID(),LAST_INSERT_ID(expr)引数を指定しない場合、
LAST_INSERT_ID()は、最後に実行されたINSERTステートメントの結果としてAUTO_INCREMENTカラムに正常に挿入された最初の自動生成値を表すBIGINT UNSIGNED(64-bit) 値を返します。 正常に挿入された行がない場合は、LAST_INSERT_ID()の値は未変更のままです。引数を指定すると、
LAST_INSERT_ID()は符号なし整数を戻します。たとえば、
AUTO_INCREMENT値を生成する行を挿入したあとは、次のようにして値を取得できます。mysql> SELECT LAST_INSERT_ID(); -> 195現在実行中のステートメントによって、
LAST_INSERT_ID()の値は影響を受けません。 1 つのステートメントでAUTO_INCREMENT値を生成してから、独自のAUTO_INCREMENTカラムを含むテーブルに行を挿入する複数行のINSERTステートメントでLAST_INSERT_ID()を参照すると仮定します。 2 番目のステートメントでは、LAST_INSERT_ID()の値は安定したままです。2 番目以降の行の値は、前の行の挿入の影響を受けません。 (LAST_INSERT_ID()とLAST_INSERT_ID(への参照を混在させる場合、影響は定義されていないことに注意してください。)expr)以前のステートメントでエラーが返された場合は、
LAST_INSERT_ID()の値が定義されません。 トランザクションテーブルでは、エラーによってステートメントがロールバックされる場合、LAST_INSERT_ID()の値は未定義のままです。 手動のROLLBACKでは、LAST_INSERT_ID()の値はトランザクション前の値にリストアされず、ROLLBACK時点と同じままです。ストアドルーチン (プロシージャーや関数) またはトリガーの本文内では、
LAST_INSERT_ID()の値は、このような種類のオブジェクトの本文外で実行されたステートメントと同様に変更されます。 あとに続くステートメントで参照されるLAST_INSERT_ID()の値でのストアドルーチンまたはトリガーの効果は、ルーチンの種類によって異なります。ストアドプロシージャーで
LAST_INSERT_ID()の値を変更するステートメントが実行される場合は、プロシージャー呼び出しが続くステートメントで変更された値が参照されます。値を変更するストアドファンクションおよびトリガーの場合、関数またはトリガーの終了時に値がリストアされるため、後に続くステートメントには変更された値が表示されません。
生成された ID は、接続ごとにサーバー内に保持されます。 つまり、関数によって指定されたクライアントに返された値は、そのクライアントによって
AUTO_INCREMENTカラムに影響を与える最近のステートメント用に最初に生成されたAUTO_INCREMENT値です。 この値は、ほかのクライアントが独自のAUTO_INCREMENT値を生成した場合でも影響を受ける可能性はありません。 この動作によって、各クライアントはほかのクライアントのアクティビティーを気にすることなく、ロックやトランザクションを実行しないで独自の ID を取得できます。行の
AUTO_INCREMENTカラムを非「マジック」値 (つまり、NULLでも0でもない値) に設定する場合は、LAST_INSERT_ID()の値が変更されません。重要単一の
INSERTステートメントを使用して複数の行を挿入する場合、LAST_INSERT_ID()は、最初に挿入された行のみに対して生成された値を返します。 この理由は、ほかの一部のサーバーに対して同じINSERTステートメントを簡単に再現できるようにするためです。例:
mysql> USE test; mysql> CREATE TABLE t ( id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, name VARCHAR(10) NOT NULL ); mysql> INSERT INTO t VALUES (NULL, 'Bob'); mysql> SELECT * FROM t; +----+------+ | id | name | +----+------+ | 1 | Bob | +----+------+ mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 1 | +------------------+ mysql> INSERT INTO t VALUES (NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa'); mysql> SELECT * FROM t; +----+------+ | id | name | +----+------+ | 1 | Bob | | 2 | Mary | | 3 | Jane | | 4 | Lisa | +----+------+ mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 2 | +------------------+2 番目の
INSERTステートメントで 3 つの新しい行がtに挿入されましたが、これらの行の 1 番目に生成された ID は2であり、あとに続くSELECTステートメントでも、この値がLAST_INSERT_ID()によって返されます。INSERT IGNOREを使用し、その行が無視された場合、LAST_INSERT_ID()は現在の値から未変更のままです (接続で正常なINSERTが実行されていない場合は、0 が返されます)。トランザクショナル以外のテーブルでは、AUTO_INCREMENTカウンタが増分されません。InnoDBテーブルでは、innodb_autoinc_lock_modeが1または2に設定されている場合は、次の例で示すようにAUTO_INCREMENTが増分されます。mysql> USE test; mysql> SELECT @@innodb_autoinc_lock_mode; +----------------------------+ | @@innodb_autoinc_lock_mode | +----------------------------+ | 1 | +----------------------------+ mysql> CREATE TABLE `t` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `val` INT(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `i1` (`val`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; # Insert two rows mysql> INSERT INTO t (val) VALUES (1),(2); # With auto_increment_offset=1, the inserted rows # result in an AUTO_INCREMENT value of 3 mysql> SHOW CREATE TABLE t\G *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `val` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `i1` (`val`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 # LAST_INSERT_ID() returns the first automatically generated # value that is successfully inserted for the AUTO_INCREMENT column mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 1 | +------------------+ # The attempted insertion of duplicate rows fail but errors are ignored mysql> INSERT IGNORE INTO t (val) VALUES (1),(2); Query OK, 0 rows affected (0.00 sec) Records: 2 Duplicates: 2 Warnings: 0 # With innodb_autoinc_lock_mode=1, the AUTO_INCREMENT counter # is incremented for the ignored rows mysql> SHOW CREATE TABLE t\G *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `val` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `i1` (`val`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 # The LAST_INSERT_ID is unchanged because the previous insert was unsuccessful mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 1 | +------------------+詳細は、セクション15.6.1.6「InnoDB での AUTO_INCREMENT 処理」を参照してください。
exprがLAST_INSERT_ID()の引数として指定されている場合、引数の値は関数によって返され、LAST_INSERT_ID()によって返される次の値として記憶されます。 これを使用すると、シーケンスのシミュレーションを行うことができます。-
シーケンスカウンタを保持するテーブルを作成し、それを初期化します。
mysql> CREATE TABLE sequence (id INT NOT NULL); mysql> INSERT INTO sequence VALUES (0); -
そのテーブルを使用して、次のようにシーケンス番号を生成します。
mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1); mysql> SELECT LAST_INSERT_ID();UPDATEステートメントは、シーケンスカウンタを増分し、LAST_INSERT_ID()への次の呼び出しで更新された値が返されるようにします。SELECTステートメントは、その値を取得します。mysql_insert_id()C API 関数を使用して、値を取得することもできます。 mysql_insert_id()を参照してください。
LAST_INSERT_ID()を呼び出さずに、シーケンスを生成できます。このように関数を使用する有用性は、ID 値が最後に自動的に生成された値として保持されることです。 独自のシーケンス値を生成するほかのクライアントと互いに影響しあうことなく、複数のクライアントがUPDATEステートメントを発行し、SELECTステートメント (またはmysql_insert_id()) で独自のシーケンス値を取得できるため、マルチユーザーでも安全です。mysql_insert_id()はINSERTおよびUPDATEステートメントの後にのみ更新されるため、SELECTやSETなどの他の SQL ステートメントを実行した後は、C API 関数を使用してLAST_INSERT_ID(の値を取得できません。expr) -
ROLES_GRAPHML()メモリーロールサブグラフを表す GraphML 文書を含む
utf8文字列を返します。<graphml>要素のコンテンツを表示するには、ROLE_ADMIN権限 (または非推奨のSUPER権限) が必要です。 それ以外の場合、結果には空の要素のみが表示されます:mysql> SELECT ROLES_GRAPHML(); +---------------------------------------------------+ | ROLES_GRAPHML() | +---------------------------------------------------+ | <?xml version="1.0" encoding="UTF-8"?><graphml /> | +---------------------------------------------------+ -
ROW_COUNT()ROW_COUNT()は、次のように値を返します:DDL ステートメント: 0。 これは、
CREATE TABLEやDROP TABLEなどのステートメントに適用されます。SELECT以外の DML ステートメント: 影響を受ける行数です。 これは、UPDATE、INSERTまたはDELETE(以前と同様) などのステートメントに適用されますが、ALTER TABLEやLOAD DATAなどのステートメントにも適用されるようになりました。SELECT: ステートメントで結果セットが返される場合は -1、そうでない場合は「影響を受ける」行数。 たとえば、SELECT * FROM t1の場合、ROW_COUNT()は -1 を返します。SELECT * FROM t1 INTO OUTFILE 'の場合、file_name'ROW_COUNT()はファイルに書き込まれた行の数を返します。SIGNALステートメント: 0。
UPDATEステートメントの場合、デフォルトで影響を受けた行の値は実際に変更された行の数です。 mysqld への接続時にCLIENT_FOUND_ROWSフラグをmysql_real_connect()に指定した場合、影響を受けた行の値は「見つかった」、つまりWHERE句に一致した行数です。REPLACEステートメントの場合、影響を受けた行の値は、新しい行が古い行に置き換わった場合 2 です。この場合、重複が削除されたあとに行が挿入されたためです。INSERT ... ON DUPLICATE KEY UPDATEステートメントの場合、行ごとの影響を受けた行の値は、その行が新しい行として挿入された場合は 1、既存の行が更新された場合は 2、既存の行がその現在の値に設定された場合は 0 です。CLIENT_FOUND_ROWSフラグを指定した場合、影響を受けた行の値は、既存の行がその現在の値に設定された場合は (0 ではなく) 1 になります。ROW_COUNT()は、mysql_affected_rows()C API 関数から取得される値と同様で、ステートメントの実行後に mysql クライアントに表示される行数です。mysql> INSERT INTO t VALUES(1),(2),(3); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT ROW_COUNT(); +-------------+ | ROW_COUNT() | +-------------+ | 3 | +-------------+ 1 row in set (0.00 sec) mysql> DELETE FROM t WHERE i IN(1,2); Query OK, 2 rows affected (0.00 sec) mysql> SELECT ROW_COUNT(); +-------------+ | ROW_COUNT() | +-------------+ | 2 | +-------------+ 1 row in set (0.00 sec)重要ステートメントベースのレプリケーションでは、確実に
ROW_COUNT()をレプリケートすることはできません。 行ベースのレプリケーションを使用すると、この関数は自動的にレプリケートされます。 -
SCHEMA()この関数は
DATABASE()のシノニムです。 -
SESSION_USER()SESSION_USER()はUSER()のシノニムです。 -
SYSTEM_USER()SYSTEM_USER()はUSER()のシノニムです。注記SYSTEM_USER()関数は、SYSTEM_USER権限とは異なります。 前者は、現在の MySQL アカウント名を返します。 後者は、システムユーザーと通常のユーザーアカウントカテゴリを区別します (セクション6.2.11「アカウントカテゴリ」 を参照)。 -
USER()現在の MySQL ユーザー名とホスト名を
utf8文字セット内の文字列として返します。mysql> SELECT USER(); -> 'davida@localhost'この値は、サーバーへの接続時に指定したユーザー名および接続元のクライアントホストを示します。
CURRENT_USER()の値とは異なる可能性があります。 -
VERSION()MySQL サーバーのバージョンを示す文字列を返します。 この文字列では、
utf8文字セットが使用されます。 値にはバージョン番号に加えて、サフィクスが付いている場合もあります。 セクション5.1.8「サーバーシステム変数」内のversionシステム変数の説明を参照してください。この関数は、ステートメントベースのレプリケーションでは安全に使用できません。
binlog_formatがSTATEMENTに設定されているときに、この関数を使用すると、警告のログが記録されます。mysql> SELECT VERSION(); -> '8.0.29-standard'