MySQL 基本チュートリアル 12 — 関数とその他の関数

黄舟
リリース: 2017-02-24 11:50:13
オリジナル
1420 人が閲覧しました


1. ビット関数

ビット演算の場合、MySQL は BIGINT (64 ビット) アルゴリズムを使用するため、これらの演算子の最大範囲は 64 ビットです。

  • |

ビットごとの OR:

mysql> SELECT 29 | 15;
-> 31
ログイン後にコピー

結果は 64 ビットの符号なし整数です。

  • &

ビットごとの AND:

mysql> SELECT 29 & 15;
-> 13
ログイン後にコピー

結果は 64 ビットの符号なし整数です。

  • ^

ビットごとの XOR:

mysql> SELECT 1 ^ 1;
-> 0
mysql> SELECT 1 ^ 0;
-> 1
mysql> SELECT 11 ^ 3;
-> 8
ログイン後にコピー

結果は 64 ビットの符号なし整数です。

  • <<

longlong (BIGINT) 数値を左に 2 桁シフトします。

mysql> SELECT 1 << 2;
-> 4
ログイン後にコピー

結果は 64 ビットの符号なし整数です。

  • >>

longlong (BIGINT) 数値を右に 2 桁シフトします。

mysql> SELECT 4 >> 2;
-> 1
ログイン後にコピー

結果は 64 ビットの符号なし整数です。

  • ~

すべてのビットを反転します。

mysql> SELECT 5 & ~1;
-> 4
ログイン後にコピー

結果は 64 ビットの符号なし整数です。

  • BIT_COUNT(N)

パラメータN

mysql> SELECT BIT_COUNT(29);
-> 4
ログイン後にコピー

に設定されたビット数を返します

このセクションでは、暗号化と暗号化された値について説明します。任意のバイト値を含む可能性のある暗号化関数によって返された一部の結果を保存する場合は、CHAR 列または VARCHAR 列の代わりに BLOB 列を使用して、末尾のスペースの削除により一部のデータ値が変更されるという潜在的な問題を回避します。 Raes_encrypt 「ラインダール」として知られています。秘密鍵の長さは 128 ビットですが、ソースを変更することで 256 ビットまで拡張できます。 128 ビットを選択したのは、その方がはるかに高速であり、ほとんどの目的にはこのレベルの機密性で十分であるためです。

    入力パラメータは任意の長さにすることができます。いずれかのパラメータが NULL の場合、関数の結果も NULL になります。
  • AES はブロックレベルのアルゴリズムであるため、不均衡な長さの文字列をエンコードするためにパディングが使用されるため、結果の文字列の長さは 16 * (trunc(string_length / 16) + 1) になります。 AES_DECRYPT() が無効なデータまたは不正なパディングを検出した場合、NULL を返します。ただし、入力された情報またはパスワードが無効な場合、AES_DECRYPT() は NULL 以外の値 (役に立たない情報である可能性があります) を返す場合があります。 クエリを変更することで、AES 関数を使用して暗号化された形式でデータを保存できます: INSERT INTO t VALUES (1,AES_ENCRYPT('text','password'));

  • AES_ENCRYPT() および AES_DECRYPT () MySQL のユニバーサル パスワードの最も安全な暗号化関数とみなされます。

DECODE(

crypt_str

,pass_str)

暗号化された文字列

crypt_str

を復号化するパスワードとして

pass_str

を使用します。

crypt_str
    はENCODE()によって返される文字列である必要があります。
  • ENCODE(str,

    pass_str
  • )

strを復号化するためのパスワードとしてpass_strを使用します。 DECODE() を使用して結果を復号化します。

    結果は、
  • str

    と同じ長さのバイナリ文字列です。列に保持したい場合は、BLOB 列タイプを使用します。 DES_DECRYPT(

    crypt_str
  • [,
key_str

])文字列を暗号化するには DES_ENCRYPT() を使用します。エラーが発生した場合、この関数は NULL を返します。

この関数は、MySQL が SSL サポートで構成されている場合にのみ機能することに注意してください。

key_str
    パラメータが指定されていない場合、DES_DECRYPT() は最初に暗号化された文字列の最初のバイトをチェックして、元の文字列の暗号化に使用された DES 暗号鍵番号を決定し、次に DES 鍵ファイルからそれを読み取ります。情報を解読するためのキーワード。これを実行するには、ユーザーは SUPER 権限を持っている必要があります。 --des-key-file サーバーを選択してキー ファイルを指定できます。
  • この関数に key_str パラメータを渡すと、その文字列がメッセージを復号化するためのキーとして使用されます。

    crypt_str
  • パラメータが暗号化された文字列ではないと思われる場合、MySQLは指定された
crypt_str

を返します。

DES_ENCRYPT(str[,(

key_num

|key_str)])

Triple-DES アルゴリズムによって指定されたキーワードを使用して文字列を暗号化します。エラーが発生した場合、この関数は NULL を返します。 この関数は、MySQL が SSL サポートで構成された後にのみ実行されることに注意してください。

    使用する暗号化キーワードの選択は、次の DES_ENCRYPT() の 2 番目の引数に基づいて行われます。
    パラメータ 説明
    パラメータなし DES キーワード ファイルの最初のキーワードを使用します。
    key_numDES キーワード ファイルで指定されたキー番号 (0 ~ 9) を使用します。
    key_str指定されたキー文字列を使用してstrを暗号化します。

    选择--des-key-file服务器指定关键字文件。

    返回字符串是一个二进制字符串,其中第一个字符为 CHAR(128 | key_num)。

    加上 128使得识别加密关键字更加容易。若你使用一个字符串关键字,则 key_num 为127。

    结果的字符串长度为 new_len = orig_len + (8-(orig_len % 8))+1。

    DES关键字文件中的每一行都具有如下格式:

    key_num des_key_str

    每个key_num 必须是一个从0到0范围内的数字。文件中行的排列顺序是任意的。 des_key_str 是用来加密信息的字符串。在数字和关键字之间应该至少有一个空格。若你未指定任何到DES_ENCRYPT()的关键字参数,则第一个关键字为默认的使用关键字。

    使用FLUSH DES_KEY_FILE语句,你可以让 MySQL从关键字文件读取新的关键字值。这要求你享有 RELOAD特权。

    拥有一套默认关键字的一个好处就是它向应用程序提供了一个检验加密列值的方式,而无须向最终用户提供解密这些值的权力。

    mysql> SELECT customer_address FROM customer_table
    > WHERE crypted_credit_card = DES_ENCRYPT(&#39;credit_card_number&#39;);
    ログイン後にコピー
    • ENCRYPT(str[,salt])

    使用Unix crypt() 系统调用加密 strsalt 参数应为一个至少包含2个字符的字符串。若没有给出 salt 参数,则使用任意值。

    mysql> SELECT ENCRYPT(&#39;hello&#39;);
    -> &#39;VxuFAJXVARROc&#39;
    ログイン後にコピー

    至少在一些系统中,ENCRYPT()除了str的前八位字符之外会忽略所有内容。这个行为由下划线的crypt() 系统调用的执行所决定。

    假如crypt()在你的系统中不可用(正如在 Windows系统), ENCRYPT() 则会始终返回NULL。鉴于这个原因,我们向你推荐使用 MD5() 或SHA1() 来代替,因为这两个函数适合所有的平台。

    • MD5(str)

    为字符串算出一个 MD5 128比特检查和。该值以32位十六进制数字的二进制字符串的形式返回, 若参数为 NULL 则会返回NULL。例如,返回值可被用作散列关键字。

    mysql> SELECT MD5(&#39;testing&#39;);
    -> &#39;ae2b1fca515949e5d54fb22b8ed95575&#39;
    ログイン後にコピー

    这是"RSA Data Security, Inc. MD5 Message-Digest Algorithm."

    假如你想要将这个值转化为大写字母,参见“Cast函数和操作符”中BINARY操作符项中给出的二进制字符串转换。

    • OLD_PASSWORD(str)

    当PASSWORD()的执行变为改善安全性时,OLD_PASSWORD()会被添加到 MySQL。OLD_PASSWORD()返回从前的PASSWORD()执行值( 4.1之前),同时允许你为任何4.1 之前的需要连接到你的5.1 版本MySQL服务器前客户端设置密码,从而不至于将它们切断。

    • PASSWORD(str)

    从原文密码str 计算并返回密码字符串,当参数为 NULL 时返回 NULL。这个函数用于用户授权表的Password列中的加密MySQL密码存储

    mysql> SELECT PASSWORD(&#39;badpwd&#39;);
    -> &#39;7f84554057dd964b&#39;
    ログイン後にコピー

    PASSWORD() 加密是单向的 (不可逆 )。

    PASSWORD() 执行密码加密与Unix 密码被加密的方式不同。请参见ENCRYPT()。

    注释: PASSWORD()函数在MySQL服务器中的鉴定系统使用;你应将它用在你个人的应用程序中。为达到同样目的,可使用 MD5()或SHA1() 代替。 更多关于在您的应用程序中处理密码及安全鉴定的信息见RFC 2195

    • SHA1(str) SHA(str)

    为字符串算出一个 SHA1 160比特检查和,如RFC 3174 (安全散列算法 )中所述。该值被作为40位十六进制数字返回,而当参数为NULL 时则返回 NULL。这个函数的一个可能的用处就在于其作为散列关键字。你也可以将其作为存储密码的密码安全函数使用。

    mysql> SELECT SHA1(&#39;abc&#39;);
    -> &#39;a9993e364706816aba3e25717850c26c9cd0d89d&#39;
    ログイン後にコピー

    SHA1()可以被视为一个密码更加安全的函数,相当于 MD5()。 SHA() 和SHA1()具有相同的意义。

    3. 信息函数

    • BENCHMARK(count,expr)

    BENCHMARK() 函数重复count 次执行表达式 expr 。 它可以被用于计算 MySQL 处理表达式的速度。结果值通常为 0。另一种用处来自 mysql客户端内部,能够报告问询执行的次数:

    mysql> SELECT BENCHMARK(1000000,ENCODE(&#39;hello&#39;,&#39;goodbye&#39;));
    ログイン後にコピー
    +----------------------------------------------+
    | BENCHMARK(1000000,ENCODE(&#39;hello&#39;,&#39;goodbye&#39;)) |
    +----------------------------------------------+
    |                                            0 |
    +----------------------------------------------+
    1 row in set (4.74 sec)
    ログイン後にコピー

    此处报告的时间是客户端上的共用时间,而不是服务器端上的CPU时间。建议执行多遍BENCHMARK(),并解释与服务器机器负荷程度有关的结果。

    · CHARSET(str)

    返回字符串自变量的字符集。

    mysql> SELECT CHARSET(&#39;abc&#39;);        -> &#39;latin1&#39;
    mysql> SELECT CHARSET(CONVERT(&#39;abc&#39; USING utf8));        -> &#39;utf8&#39;
    mysql> SELECT CHARSET(USER());        -> &#39;utf8&#39;
    ログイン後にコピー

    · COERCIBILITY(str)

    返回字符串自变量的整序可压缩性值。

    mysql> SELECT COERCIBILITY(&#39;abc&#39; COLLATE latin1_swedish_ci);        -> 0
    mysql> SELECT COERCIBILITY(USER());        -> 3
    mysql> SELECT COERCIBILITY(&#39;abc&#39;);        -> 4
    ログイン後にコピー

    返回值具有如下意义:

    可压缩性意义举例
    0明确排序带有COLLATE 子句的值
    1无排序不同排序的字符串连接
    2明确排序列值
    3系统常量USER()返回值
    4可压缩文字字符串
    5可忽略NULL得来的NULL或一个表达式

    下方值得优先级较高。

    • COLLATION(str)

    返回惠字符串参数的排序方式。

    mysql> SELECT COLLATION(&#39;abc&#39;);
    -> &#39;latin1_swedish_ci&#39;
    mysql> SELECT COLLATION(_utf8&#39;abc&#39;);
    -> &#39;utf8_general_ci&#39;
    ログイン後にコピー
    • CONNECTION_ID()

    返回对于连接的连接ID (线程ID)。每个连接都有各自的唯一 ID。

    mysql> SELECT CONNECTION_ID();
    -> 23786
    ログイン後にコピー
    • CURRENT_USER, CURRENT_USER()

    返回当前话路被验证的用户名和主机名组合。这个值符合确定你的存取权限的MySQL 账户。在被指定SQL SECURITY DEFINER特征的存储程序内, CURRENT_USER() 返回程序的创建者。

    CURRENT_USER()的值可以和USER()的值有所不同。

    mysql> SELECT USER();
    -> &#39;davida@localhost&#39;
    mysql> SELECT * FROM mysql.user;
    ERROR 1044: Access denied for user &#39;&#39;@&#39;localhost&#39; to
    database &#39;mysql&#39;
    mysql> SELECT CURRENT_USER();
    -> &#39;@localhost&#39;
    ログイン後にコピー

    这个例子解释了虽然客户端指定了一个 davida用户名 (正如USER()函数的值所指示的), 服务器却使用一个匿名的用户账户确认该客户端 (见CURRENT_USER()值得空用户名部分 )。这种情况发生的一个原因是 One 在向 davida的授权列表中没有足够的账户。

    CURRENT_USER() 返回的字符串使用 utf8字符集。

    • DATABASE()

    返回使用 utf8 字符集的默认(当前)数据库名。在存储程序里,默认数据库是同该程序向关联的数据库,但并不一定与调用语境的默认数据库相同。

    mysql> SELECT DATABASE();
    -> &#39;test&#39;
    ログイン後にコピー

    若没有默认数据库, DATABASE()返回 NULL。

    • FOUND_ROWS()

    A 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();
    ログイン後にコピー


    第二个 SELECT返回一个数字,指示了在没有LIMIT子句的情况下,第一个SELECT返回了多少行 (若上述的 SELECT语句不包括 SQL_CALC_FOUND_ROWS 选项,则使用LIMIT 和不使用时,FOUND_ROWS() 可能会返回不同的结果)。

    通过 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 问询比对于简单SELECT 语句更为复杂,原因是在UNION 中,LIMIT 可能会出现在多个位置。它可能适用于UNION中的个人 SELECT语句,或是总体上 到UNION 结果的全程。

    SQL_CALC_FOUND_ROWS对于 UNION的意向是它应该不需要全程LIMIT而返回应返回的行数。SQL_CALC_FOUND_ROWS 和UNION 一同使用的条件是:

      • SQL_CALC_FOUND_ROWS 关键词必须出现在UNION的第一个 SELECT中。

      • FOUND_ROWS()的值只有在使用 UNION ALL时才是精确的。若使用不带ALL的UNION,则会发生两次删除, 而 FOUND_ROWS() 的指只需近似的。

      • 假若UNION 中没有出现 LIMIT ,则SQL_CALC_FOUND_ROWS 被忽略,返回临时表中的创建的用来处理UNION的行数。

    • LAST_INSERT_ID() LAST_INSERT_ID(expr)

    自动返回最后一个INSERT或 UPDATE 问询为 AUTO_INCREMENT列设置的第一个 发生的值。

    mysql> SELECT LAST_INSERT_ID();

    -> 195

    产生的ID 每次连接后保存在服务器中。这意味着函数向一个给定客户端返回的值是该客户端产生对影响AUTO_INCREMENT列的最新语句第一个 AUTO_INCREMENT值的。这个值不能被其它客户端影响,即使它们产生它们自己的 AUTO_INCREMENT值。这个行为保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁或处理。

    假如你使用一个非“magic”值来更新某一行的AUTO_INCREMENT 列,则LAST_INSERT_ID() 的值不会变化(换言之, 一个不是 NULL也不是 0的值)。

    重点: 假如你使用单INSERT语句插入多个行, LAST_INSERT_ID() 返回插入的第一行产生的值。其原因是这使依靠其它服务器复制同样的 INSERT语句变得简单。

    例如:

    mysql> USE test;
    ログイン後にコピー
    Database changed
    mysql> CREATE TABLE t (    
    ->   id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,    
    ->   name VARCHAR(10) NOT NULL    
    -> );Query OK, 0 rows affected (0.09 sec)
    
    mysql> INSERT INTO t VALUES (NULL, &#39;Bob&#39;);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> SELECT * FROM t;+----+------+
    | id | name |
    +----+------+
    |  1 | Bob  |
    +----+------+
    1 row in set (0.01 sec)
    
    mysql> SELECT LAST_INSERT_ID();+------------------+
    | LAST_INSERT_ID() |
    +------------------+
    |                1 |
    +------------------+
    1 row in set (0.00 sec)
    
    mysql> INSERT INTO t VALUES    
    -> (NULL, &#39;Mary&#39;), (NULL, &#39;Jane&#39;), (NULL, &#39;Lisa&#39;);Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> SELECT * FROM t;
    +----+------+
    | id | name |
    +----+------+
    |  1 | Bob  |
    |  2 | Mary |
    |  3 | Jane |
    |  4 | Lisa |
    +----+------+
    4 rows in set (0.01 sec)
    
    mysql> SELECT LAST_INSERT_ID();+------------------+
    | LAST_INSERT_ID() |
    +------------------+
    |                2 |
    +------------------+
    1 row in set (0.00 sec)
    ログイン後にコピー

    虽然第二个问询将3 个新行插入 t, 对这些行的第一行产生的 ID 为 2, 这也是 LAST_INSERT_ID()返回的值。

    假如你使用 INSERT IGNORE而记录被忽略,则AUTO_INCREMENT 计数器不会增量,而 LAST_INSERT_ID() 返回0,这反映出没有插入任何记录。

    若给出作为到LAST_INSERT_ID()的参数expr ,则参数的值被函数返回,并作为被LAST_INSERT_ID()返回的下一个值而被记忆。这可用于模拟序列:

      • 创建一个表,用来控制顺序计数器并使其初始化:

    o mysql> CREATE TABLE sequence (id INT NOT NULL);

    o mysql> INSERT INTO sequence VALUES (0);

      • 使用该表产生这样的序列数 :

    o mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);

    o mysql> SELECT LAST_INSERT_ID();

    UPDATE 语句会增加顺序计数器并引发向LAST_INSERT_ID() 的下一次调用,用来返回升级后的值。 SELECT 语句会检索这个值。 mysql_insert_id() C API函数也可用于获取这个值。

    你可以不用调用LAST_INSERT_ID()而产生序列,但这样使用这个函数的效用在于 ID值被保存在服务器中,作为自动产生的值。它适用于多个用户,原因是多个用户均可使用 UPDATE语句并用SELECT语句(或mysql_insert_id()),得到他们自己的序列值,而不会影响其它产生他们自己的序列值的客户端或被其它产生他们自己的序列值的客户端所影响。

    注意, mysql_insert_id() 仅会在INSERT 和UPDATE语句后面被升级, 因此你不能在执行了其它诸如SELECT或 SET 这样的SQL语句后使用 C API 函数来找回 LAST_INSERT_ID(expr) 对应的值。

    • ROW_COUNT()

    ROW_COUNT()返回被前面语句升级的、插入的或删除的行数。 这个行数和 mysql 客户端显示的行数及mysql_affected_rows() C API 函数返回的值相同。

    mysql> INSERT INTO t VALUES(1),(2),(3);

    问询完成, 表中有3 行 (0.00秒)

    记录: 3 重复: 0 警告: 0

    mysql> 
    SELECT ROW_COUNT();
    +-------------+
    | ROW_COUNT() |
    +-------------+
    |           3 |
    +-------------+
    ログイン後にコピー

    表中有1行 (0.00 秒)

    mysql> DELETE FROM t WHERE i IN(1,2);

    问询完成, 找到2 行 (0.00 秒)

    mysql> SELECT ROW_COUNT();
    +-------------+| ROW_COUNT() |+-------------+|           2 |+-------------+
    ログイン後にコピー

    表中有1行 (0.00 秒)

    • SCHEMA()

    这个函数和 DATABASE()具有相同的意义。

    • SESSION_USER()

    SESSION_USER()和 USER()具有相同的意义。

    • SYSTEM_USER()

    SYSTEM_USER()合 USER()具有相同的意义。

    • USER()

    返回当前 MySQL用户名和机主名/

    mysql> SELECT USER();
    -> &#39;davida@localhost&#39;
    ログイン後にコピー

    这个值指示了你指定的连接服务器时的用户名,及你所连接的客户主机。这个值可以和CURRENT_USER() 的值不同。

    你可以这样提取用户名部分:

    mysql> SELECT SUBSTRING_INDEX(USER(),&#39;@&#39;,1);
    -> &#39;davida&#39;
    ログイン後にコピー

    由于 USER() 返回一个utf8 字符集中的值,你也应确保'@' 字符串文字在该字符集中得到解释:

    mysql> SELECT SUBSTRING_INDEX(USER(),_utf8&#39;@&#39;,1);
    -> &#39;davida&#39;
    ログイン後にコピー
    • VERSION()

    返回指示 MySQL 服务器版本的字符串。这个字符串使用 utf8 字符集。

    mysql> SELECT VERSION();
    -> &#39;5.1.2-alpha-standard&#39;
    ログイン後にコピー

    注意,假如你的版本字符串以-log结尾,这说明登录已被激活。

    4. 其他函数

    • DEFAULT(col_name)

    返回一个表列的默认值。若该列没有默认值则会产生错误。

    mysql> UPDATE t SET i = DEFAULT(i)+1 WHERE id < 100;

    • FORMAT(X,D)

    将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若 D 为 0, 则返回结果不带有小数点,或不含小数部分。

    mysql> SELECT FORMAT(12332.123456, 4);
    -> &#39;12,332.1235&#39;
    mysql> SELECT FORMAT(12332.1,4);
    -> &#39;12,332.1000&#39;
    mysql> SELECT FORMAT(12332.2,0);
    -> &#39;12,332&#39;
    ログイン後にコピー
    • GET_LOCK(str,timeout)

    设法使用字符串str 给定的名字得到一个锁, 超时为timeout 秒。若成功得到锁,则返回 1,若操作超时则返回0 (例如,由于另一个客户端已提前封锁了这个名字 ),若发生错误则返回NULL (诸如缺乏记忆或线程mysqladmin kill 被断开 )。假如你有一个用GET_LOCK()得到的锁,当你执行RELEASE_LOCK()或你的连接断开(正常或非正常)时,这个锁就会解除。

    这个函数可用于执行应用程序锁或模拟记录锁定。名称被锁定在服务器范围内。假如一个名字已经被一个客户端封锁,GET_LOCK() 会封锁来自另一个客户端申请封锁同一个名字的任何请求。这使对一个封锁名达成协议的客户端使用这个名字合作执行建议锁。然而要知道它也允许不在一组合作客户端中的一个客户端封锁名字,不论是服役的还是非故意的,这样阻止任何合作中的客户端封锁这个名字。一个减少这种情况发生的办法就是使用数据库特定的或应用程序特定的封锁名。例如, 使用db_name.strapp_name.str 形式的封锁名。

    mysql> SELECT GET_LOCK(&#39;lock1&#39;,10);-> 1
    mysql> SELECT IS_FREE_LOCK(&#39;lock2&#39;);-> 1
    mysql> SELECT GET_LOCK(&#39;lock2&#39;,10);-> 1
    mysql> SELECT RELEASE_LOCK(&#39;lock2&#39;);-> 1
    mysql> SELECT RELEASE_LOCK(&#39;lock1&#39;);-> NULL
    ログイン後にコピー

    注意,第二个 RELEASE_LOCK()调用返回 NULL ,原因是锁'lock1' 杯第二个GET_LOCK()调用解开。

    • INET_ATON(expr)

    给出一个作为字符串的网络地址的点地址表示,返回一个代表该地址数值的整数。地址可以是4或8比特地址。

    mysql> SELECT INET_ATON(&#39;209.207.224.40&#39;);
    -> 3520061480
    ログイン後にコピー

    产生的数字总是按照网络字节顺序。如上面的例子,数字按照 209×2563 + 207×2562 + 224×256 + 40 进行计算。

    INET_ATON() 也能理解短格式 IP 地址:

    mysql> 
    SELECT INET_ATON(&#39;127.0.0.1&#39;), INET_ATON(&#39;127.1&#39;);
    -> 2130706433, 2130706433
    ログイン後にコピー

    注释: 在存储由INET_ATON() 产生的值时,推荐你使用 INT UNSIGNED 列。假如你使用 (带符号) INT列, 则相应的第一个八位组大于127的IP 地址值会被截至 2147483647 (即, INET_ATON('127.255.255.255') 所返回的值)。

    • INET_NTOA(expr)

    给定一个数字网络地址 (4 或 8 比特),返回作为字符串的该地址的电地址表示。

    mysql> 
    SELECT INET_NTOA(3520061480);
    -> &#39;209.207.224.40&#39;
    ログイン後にコピー
    • IS_FREE_LOCK(str)

    检查名为str的锁是否可以使用 (换言之,没有被封锁)。若锁可以使用,则返回 1 (没有人在用这个锁), 若这个锁正在被使用,则返回0 ,出现错误则返回 NULL (诸如不正确的参数 )。

    • IS_USED_LOCK(str)

    检查名为str的锁是否正在被使用(换言之,被封锁)。若被封锁,则返回使用该锁的客户端的连接标识符。否则返回 NULL。

    • MASTER_POS_WAIT(log_name,log_pos[,timeout])

    该函数对于控制主从同步很有用处。它会持续封锁,直到从设备阅读和应用主机记录中所有补充资料到指定的位置。返回值是其为到达指定位置而必须等待的记录事件的数目。若从设备SQL线程没有被启动、从设备主机信息尚未初始化、参数不正确或出现任何错误,则该函数返回 NULL。若超时时间被超过,则返回-1。若在MASTER_POS_WAIT() 等待期间,从设备SQL线程中止,则该函数返回 NULL。若从设备由指定位置通过,则函数会立即返回结果。

    假如已经指定了一个超时时间值,当 超时时间 秒数经过后MASTER_POS_WAIT()会停止等待。超时时间 必须大于 0;一个为零或为负值的 超时时间 表示没有超市时间。

    • NAME_CONST(name,value)

    返回给定值。 当用来产生一个结果集合列时, NAME_CONST()促使该列使用给定名称。

    mysql> SELECT NAME_CONST(&#39;myname&#39;, 14);
    +--------+| myname |+--------+|     14 |+--------+
    ログイン後にコピー

    这个函数被添加进 MySQL 5.0.12。它只做内部使用。你可能会在mysqlbinlog 的书橱中看到这个函数。

    • RELEASE_LOCK(str)

    解开被GET_LOCK()获取的,用字符串str 所命名的锁。若锁被解开,则返回 1,若改线程尚未创建锁,则返回0 (此时锁没有被解开 ), 若命名的锁不存在,则返回 NULL。若该锁从未被对GET_LOCK()的调用获取,或锁已经被提前解开,则该锁不存在。

    DO 语句和RELEASE_LOCK()同时使用很方便。

    • SLEEP(duration)

    睡眠(暂停) 时间为duration 参数给定的秒数,然后返回 0。若 SLEEP() 被中断,它会返回 1。 duration 或许或包括一个给定的以微秒为单位的分数部分。

    • UUID()

    返回一个通用唯一标识符(UUID) ,其产生的根据是《DCE 1.1: 远程过程调用》 (附录A) CAE (公共应用软件环境) 的说明,该作品于1997年10月由 The Open Group 出版 (文件编号 C706,http://www.php.cn/).

    UUID被设计成一个在时间和空间上都独一无二的数字。2个对UUID() 的调用应产生2个不同的值,即使这些调用的执行是在两个互不相连的单独电脑上进行。

    UUID 是一个由5位十六进制数的字符串表示的128比特数字 ,其格式为 aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee :

      • 前3个数字从一个时间戳产生。

      • 第4 个数字保持暂时唯一性,以防时间戳值失去单一性 (例如, 由于经济时)。

      • 第5个数字是一个 IEEE 802 节点号,它提供空间唯一性。若后者不可用,则用一个随机数字替换。 (例如, 由于主机没有以太网卡,或我们不知道怎样在你的操作系统上找到界面的机器地址 )。假若这样,空间唯一性就不能得到保证。尽管如此,一个冲突的发生机率还是非常低的。

    目前,一个界面的 MAC 地址尽被FreeBSD 和 Linux考虑到。在其它操作系统中, MySQL使用随机产生的 48比特数字。

    mysql> SELECT UUID();
    -> &#39;6ccd780c-baba-1026-9564-0040f4311e29&#39;
    ログイン後にコピー

    注意, UUID() 不支持复制功能。

    • VALUES(col_name)

    在一个INSERT … ON DUPLICATE KEY UPDATE …语句中,你可以在UPDATE 子句中使用 VALUES(col_name)函数,用来访问来自该语句的INSERT 部分的列值。换言之,UPDATE 子句中的 VALUES(col_name) 访问需要被插入的col_name 的值,并不会发生重复键冲突。这个函数在多行插入中特别有用。 VALUES()函数只在INSERT ... UPDATE 语句中有意义,而在其它情况下只会返回 NULL。

    mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
    -> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
    ログイン後にコピー



     以上就是MySQL基础教程12 —— 函数之其他函数的内容,更多相关内容请关注PHP中文网(www.php.cn)!


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート