> 데이터 베이스 > MySQL 튜토리얼 > MySQL 기본 튜토리얼 12 — 함수 및 기타 함수

MySQL 기본 튜토리얼 12 — 함수 및 기타 함수

黄舟
풀어 주다: 2017-02-24 11:50:13
원래의
1471명이 탐색했습니다.


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비트 부호 없는 정수입니다.

  • <<

롱롱(BIGINT) 숫자를 왼쪽으로 두 자리 이동합니다.

mysql> SELECT 1 << 2;
-> 4
로그인 후 복사

결과는 64비트 부호 없는 정수입니다.

  • >>

longlong(BIGINT) 숫자를 두 자리 오른쪽으로 이동합니다.

mysql> SELECT 4 >> 2;
-> 1
로그인 후 복사

결과는 64비트 부호 없는 정수입니다.

  • ~

모든 비트를 반전시킵니다.

mysql> SELECT 5 & ~1;
-> 4
로그인 후 복사

결과는 64비트 부호 없는 정수입니다.

  • BIT_COUNT(N)

매개변수 N에 설정된 비트 수를 반환합니다. 🎜>rree

2. 암호화 기능

암호화 및 암호화된 값을 소개하는 섹션입니다. 임의의 바이트 값을 포함할 수 있는 암호화 함수에서 반환된 일부 결과를 저장하려면 CHAR 또는 VARCHAR 열 대신 BLOB 열을 사용하여 후행 공백 제거로 인해 일부 데이터 값이 변경되는 잠재적인 문제를 방지하세요.

  • AES_ENCRYPT(

    str,key_str) , AES_DECRYPT(crypt_str,key_str)

이 기능을 사용하면 이전에 "Rijndael"로 알려진 공식 AES(Advanced Encryption Standard) 알고리즘을 사용하여 암호화 및 데이터 암호화가 가능합니다. 비밀 키의 길이는 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)

pass_str 사용 비밀번호는 복호화된 암호화 문자열 crypt_str, crypt_str이 ENCODE()에서 반환된 문자열이어야 합니다.

  • ENCODE(

    str,pass_str)

pass_str 사용 비밀번호로 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 server를 선택하여 키 파일을 지정할 수 있습니다.

key_str 매개변수를 이 함수에 전달하면 해당 문자열이 메시지를 해독하는 키로 사용됩니다.

crypt_str 매개변수가 암호화된 문자열로 나타나지 않으면 MySQL은 지정된 crypt_str을 반환합니다.

  • DES_ENCRYPT(

    str[,(key_num|key_str)])

Triple-DES 알고리즘에서 제공하는 키워드를 사용하여 문자열을 암호화합니다. 오류가 발생하면 이 함수는 NULL을 반환합니다.

이 기능은 MySQL이 SSL 지원으로 구성된 후에만 실행됩니다.

사용할 암호화 키워드 선택은 DES_ENCRYPT()에 대한 두 번째 인수(제공된 경우)를 기반으로 합니다.

参数说明
无参数使用来自DES关键字文件的第一个关键字。
key_num使用DES 关键字文件给出的关键字数字(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으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿