>  기사  >  데이터 베이스  >  MySQL의 다른 기능

MySQL의 다른 기능

伊谢尔伦
伊谢尔伦원래의
2016-11-23 11:47:531152검색

1. 비트 함수

비트 연산의 경우 MySQL은 BIGINT(64비트) 알고리즘을 사용하므로 이러한 연산자의 최대 범위는 64비트입니다.

|

비트별 OR:

mysql> SELECT 29 | 15;

-> 비트 부호 없는 정수입니다.

&

비트별 AND:

mysql> SELECT 29 & 15;

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

^

비트별 XOR:

mysql> 1 ^ 0;

-> 11 ^ 3;

-> 8

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

c0f3a8b25f230c81746bad7c4ede04e6 SELECT 1 3d5e0670228ac920faaf338a654b3b49 4

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

>>

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

mysql> SELECT 4 >> 2;

-> 1

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

~

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

mysql> SELECT 5 & ~1;

-> 4

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

BIT_COUNT(N)

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

mysql> SELECT BIT_COUNT(29);

-> 🎜>

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)

암호화된 문자열 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 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)입니다.

Plus 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('credit_card_number');

ENCRYPT(str[,salt])

Unix crypt() 시스템 호출을 사용하여 str을 암호화합니다. salt 매개변수는 최소 2자를 포함하는 문자열이어야 합니다. salt 매개변수가 제공되지 않으면 임의의 값이 사용됩니다.

mysql> SELECT ENCRYPT('hello');

-> 'VxuFAJXVARROc'

적어도 일부 시스템에서는 str의 처음 8자를 제외하고 다른 모든 것은 무시됩니다. 이 동작은 밑줄 친 crypt() 시스템 호출의 실행에 의해 결정됩니다.

Windows에서와 마찬가지로 시스템에서 crypt()를 사용할 수 없는 경우 ENCRYPT()는 항상 NULL을 반환합니다. 이러한 이유로 MD5() 또는 SHA1()을 대신 사용하는 것이 좋습니다. 이 두 기능은 모든 플랫폼에 적합하기 때문입니다.

MD5(str)

문자열에 대한 MD5 128비트 체크섬을 계산합니다. 값은 16진수 32자리의 이진 문자열로 반환됩니다. 매개 변수가 NULL이면 NULL이 반환됩니다. 예를 들어 반환 값을 해시 키로 사용할 수 있습니다.

mysql> SELECT MD5('testing');

-> 'ae2b1fca515949e5d54fb22b8ed95575'

"RSA Data Security, Inc. MD5 메시지-다이제스트 알고리즘"입니다.

이 값을 대문자로 변환하려면 "캐스트 함수 및 연산자"의 BINARY 연산자 항목에 제공된 이진 문자열 변환을 참조하세요.

OLD_PASSWORD(str)

보안 강화를 위해 PASSWORD() 구현이 변경되면 OLD_PASSWORD()가 MySQL에 추가됩니다. OLD_PASSWORD()는 이전 PASSWORD() 구현(4.1 이전)의 값을 반환하는 동시에 5.1 MySQL 서버에 연결해야 하는 4.1 이전 클라이언트에 대해 암호를 끊지 않고 설정할 수 있도록 허용합니다.

PASSWORD(str)

원래 비밀번호 str에서 비밀번호 문자열을 계산하여 반환합니다. 매개변수가 NULL이면 NULL이 반환됩니다. 이 함수는 사용자 인증 테이블의 비밀번호 열에 암호화된 MySQL 비밀번호를 저장하는 데 사용됩니다.

mysql> SELECT PASSWORD('badpwd'); 암호화는 단방향(되돌릴 수 없음)입니다.

PASSWORD()는 Unix 비밀번호가 암호화되는 방식과 다르게 비밀번호 암호화를 수행합니다. 암호화()를 참조하세요.

참고: PASSWORD() 함수는 MySQL 서버의 인증 시스템에서 사용되며 자체 애플리케이션에서는 사용하면 안 됩니다. 동일한 목적을 달성하려면 MD5() 또는 SHA1()을 대신 사용할 수 있습니다. 애플리케이션에서 비밀번호 및 인증 처리에 대한 자세한 내용은 RFC 3174(보안 해시 알고리즘)에 설명된 대로 RFC 2195를 참조하세요. 값은 40자리 16진수로 반환되며, 인수가 NULL인 경우에는 NULL이 반환됩니다. 이 함수의 가능한 용도 중 하나는 해시 키로 사용하는 것입니다. 비밀번호를 저장하기 위한 비밀번호 안전 기능으로 사용할 수도 있습니다.

mysql> SELECT SHA1('abc'); SHA()와 SHA1()은 같은 의미를 갖습니다.

3. 정보 기능

BENCHMARK(count,expr)

BENCHMARK() 함수는 표현식 expr을 실행하기 위해 count 횟수를 반복합니다. MySQL이 표현식을 처리하는 속도를 계산하는 데 사용할 수 있습니다. 결과 값은 일반적으로 0입니다. 또 다른 용도는 쿼리 실행 횟수를 보고할 수 있는 mysql 클라이언트 내에서 발생합니다.

mysql> SELECT BENCHMARK(1000000,ENCODE('hello','goodbye'));
+----------------------------------------------+
| BENCHMARK(1000000,ENCODE('hello','goodbye')) |
+----------------------------------------------+
|                                            0 |
+----------------------------------------------+
1 row in set (4.74 sec)

여기에 보고된 시간은 서버의 CPU 시간이 아니라 클라이언트의 공유 시간입니다. . BENCHMARK()를 여러 번 실행하여 서버 시스템의 부하와 관련하여 결과를 해석하는 것이 좋습니다.

·    CHARSET(str)

문자열 인수의 문자 집합을 반환합니다.

mysql> SELECT CHARSET('abc');        -> 'latin1'
mysql> SELECT CHARSET(CONVERT('abc' USING utf8));        -> 'utf8'
mysql> SELECT CHARSET(USER());        -> 'utf8'

· COERCIBILITY(str)

문자열 인수의 정수 압축 값을 반환합니다.

mysql> SELECT COERCIBILITY('abc' COLLATE latin1_swedish_ci);        -> 0
mysql> SELECT COERCIBILITY(USER());        -> 3
mysql> SELECT COERCIBILITY('abc');        -> 4

반환 값의 의미는 다음과 같습니다.

압축성 의미 예

0 COLLATE 절을 사용한 명시적 정렬 값

1 없음 정렬 문자열 연결 다른 정렬

2 명시적 정렬 열 값

3 시스템 상수 USER() 반환 값

4 압축 가능한 리터럴 문자열

5 무시 가능 NULL 또는 NULL에서 파생된 표현식

아래 값이 우선순위가 더 높습니다.

COLLATION(str)

문자열 매개변수의 정렬 방법을 반환합니다.

mysql> SELECT COLLATION('abc');

-> 'latin1_swedish_ci'

mysql> utf8_general_ci'

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();

-> 'davida@localhost'

mysql> SELECT * FROM mysql.user;

오류 1044 : ''@'localhost' 사용자의

'mysql'

mysql> SELECT CURRENT_USER();

->에 대한 액세스가 거부되었습니다. >

이 예에서는 클라이언트가 davida 사용자 이름(USER() 함수의 값으로 표시됨)을 지정했지만 서버는 익명 사용자 계정을 사용하여 클라이언트를 인증했음을 설명합니다(NULL USER 이름의 CURRENT_USER() 값 참조) 부분). 이런 일이 발생하는 한 가지 이유는 One의 승인 목록에 davida에 대한 계정이 충분하지 않기 때문입니다.

CURRENT_USER()가 반환한 문자열은 utf8 문자 집합을 사용합니다.

DATABASE()

utf8 문자 집합을 사용하여 기본(현재) 데이터베이스 이름을 반환합니다. 저장 프로시저에서 기본 데이터베이스는 프로시저와 연결된 데이터베이스이지만 호출 컨텍스트의 기본 데이터베이스와 반드시 동일할 필요는 없습니다.

mysql> SELECT DATABASE();

-> 'test'

기본 데이터베이스가 없으면 DATABASE()는 NULL을 반환합니다.

FOUND_ROWS()

SELECT 문에는 서버가 클라이언트에 반환하는 행 수를 제한하는 LIMIT 절이 포함될 수 있습니다. 어떤 경우에는 명령문을 다시 실행하지 않고 LIMIT 없이 명령문이 반환한 행 수를 알아야 합니다. 이 행 수를 확인하려면 SELECT 문에서 SQL_CALC_FOUND_ROWS를 선택한 다음 FOUND_ROWS()를 호출합니다.

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name

-> ;

mysql> SELECT FOUND_ROWS();

두 번째 SELECT는 LIMIT 절 없이 첫 번째 SELECT가 반환한 행 수를 나타내는 숫자를 반환합니다(위 SELECT 문에 SQL_CALC_FOUND_ROWS가 포함되지 않은 경우). 옵션이므로 FOUND_ROWS()는 LIMIT를 사용할 때와 사용하지 않을 때 다른 결과를 반환할 수 있습니다.

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, 'Bob');
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, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa');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();

-> localhost '

이 값은 서버에 연결할 때 지정한 사용자 이름과 연결된 클라이언트 호스트를 나타냅니다. 이 값은 CURRENT_USER()의 값과 다를 수 있습니다.

다음과 같이 사용자 이름 부분을 추출할 수 있습니다:

mysql> SELECT SUBSTRING_INDEX(USER(),'@',1);

-> 🎜 >

USER()는 utf8 문자 집합의 값을 반환하므로 '@' 문자열 리터럴이 해당 문자 집합으로 해석되는지 확인해야 합니다.

mysql> SELECT SUBSTRING_INDEX(USER(), _utf8' @',1);

-> 'davida'

VERSION()

MySQL 서버 버전을 나타내는 문자열을 반환합니다. 이 문자열은 utf8 문자 세트를 사용합니다.

mysql> SELECT VERSION();

-> '5.1.2-alpha-standard'

버전 문자열이 -log로 끝나는 경우 로그인이 활성화되었습니다.

4. 기타 함수

DEFAULT(col_name)

테이블 열의 기본값을 반환합니다. 해당 열에 기본값이 없으면 오류가 발생합니다.

mysql> UPDATE t SET i = DEFAULT(i)+1 WHERE id 482d473bb04bc6118f15ee4f8b784b09 SELECT FORMAT(12332.123456, 4);

-> '12,332.1235'

mysql> ; SELECT FORMAT(12332.2,0);

-> '12,332'

GET_LOCK(str,timeout)

문자열로 지정된 이름을 사용하여 잠금을 가져옵니다. 시간 초과 초의 시간 초과가 있는 str입니다. 잠금이 성공적으로 획득되면 1을 반환하고 작업 시간이 초과되면(예: 다른 클라이언트가 미리 이름을 차단했기 때문에) 0을 반환하며 오류가 발생하면(예: 메모리 부족 또는 mysqladmin kill 스레드 연결이 끊어짐) NULL을 반환합니다. . GET_LOCK()으로 잠금을 획득한 경우 RELEASE_LOCK()을 실행하거나 연결이 끊어지면(정상 또는 비정상적으로) 잠금이 해제됩니다.

이 기능을 사용하여 애플리케이션 잠금을 수행하거나 기록 잠금을 시뮬레이션할 수 있습니다. 이름은 서버 전체에서 잠겨 있습니다. 클라이언트가 이름을 이미 차단한 경우 GET_LOCK()은 동일한 이름을 차단하려는 다른 클라이언트의 요청을 차단합니다. 이를 통해 잠금 이름에 동의한 클라이언트가 해당 이름을 사용하여 권고 잠금을 수행하는 데 협력할 수 있습니다. 그러나 협력 클라이언트 그룹에 속하지 않은 클라이언트가 서비스 중이거나 의도치 않게 이름을 차단할 수도 있으므로 협력 클라이언트가 이름을 차단하는 것을 방지할 수도 있습니다. 이러한 상황의 발생을 줄이는 한 가지 방법은 데이터베이스별 또는 응용 프로그램별 차단 이름을 사용하는 것입니다. 예를 들어 db_name.str 또는 app_name.str 형식의 블록 이름을 사용합니다.

mysql> SELECT GET_LOCK('lock1',10);

-> 1

mysql> SELECT IS_FREE_LOCK('lock2');

-> >

mysql> SELECT GET_LOCK('lock2',10);
-> 1

mysql> SELECT RELEASE_LOCK('lock2');
-> 🎜>mysql> SELECT RELEASE_LOCK('lock1');

-> NULL


'lock1' 잠금이 두 번째 GET_LOCK() 호출에 의해 차단되었기 때문에 두 번째 RELEASE_LOCK() 호출은 NULL을 반환합니다. 풀다.

INET_ATON(expr)

네트워크 주소의 도트 주소 표현이 문자열로 주어지면 주소 값을 나타내는 정수를 반환합니다. 주소는 4비트 또는 8비트 주소일 수 있습니다.

mysql> SELECT INET_ATON('209.207.224.40');

-> 3520061480

생성된 숫자는 항상 네트워크 바이트 순서입니다. 위의 예와 같이 개수는 209×2563 + 207×2562 + 224×256 + 40으로 계산됩니다.

INET_ATON()은 짧은 형식의 IP 주소도 이해합니다:

mysql> SELECT INET_ATON('127.0.0.1'), INET_ATON('127.1');
-> 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);
-> '209.207.224.40'

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보다 커야 합니다. 0 또는 음수 시간 초과는 슈퍼마켓 시간이 없음을 나타냅니다.

NAME_CONST(이름,값)

주어진 값을 반환합니다. 결과 집합 열을 생성하는 데 사용되는 경우 NAME_CONST()는 열이 지정된 이름을 사용하도록 합니다.

mysql> SELECT NAME_CONST('내 이름', 14);

+---------+
| 내 이름 |
+------ --+
| 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을 반환합니다. 기간은 마이크로초 단위의 주어진 분수 부분을 포함하거나 포함할 수 있습니다.

UUID()

"DCE 1.1: Remote Procedure Call"(부록 A) CAE(Common Application Environment)를 기반으로 생성된 UUID(Universally Unique Identifier)를 반환합니다. 작업은 1997년 10월 The Open Group에서 출판되었습니다(문서 번호 C706, http://www.opengroup.org/public/pubs/catalog/c706.htm).

UUID는 다음과 같이 설계되었습니다. 시간과 공간 모두에서 독특합니다. UUID()에 대한 두 번의 호출은 서로 연결되지 않은 두 개의 별도 컴퓨터에서 호출이 실행되는 경우에도 두 개의 서로 다른 값을 생성해야 합니다.

UUID는 aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee 형식의 5자리 16진수 문자열로 표시되는 128비트 숫자입니다.

처음 3자리는 A 타임스탬프에서 생성됩니다. .

타임스탬프 값이 고유성을 잃을 경우(예: 경제 상황으로 인해) 4번째 숫자는 일시적으로 고유한 상태로 유지됩니다.

다섯 번째 숫자는 공간적 고유성을 제공하는 IEEE 802 노드 번호입니다. 후자를 사용할 수 없는 경우 임의의 숫자로 대체됩니다. (예를 들어, 호스트 시스템에 이더넷 카드가 없거나 운영 체제에서 인터페이스의 시스템 주소를 찾는 방법을 모르기 때문입니다). 이 경우 공간적 고유성을 보장할 수 없습니다. 그럼에도 불구하고 갈등이 발생할 가능성은 매우 낮습니다.

현재 FreeBSD와 Linux에서는 인터페이스의 MAC 주소를 고려합니다. 다른 운영 체제에서 MySQL은 무작위로 생성된 48비트 숫자를 사용합니다.

mysql> SELECT UUID();

-> '6ccd780c-baba-1026-9564-0040f4311e29'

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 테이블(a,b,c) VALUES(1,2,3),(4,5,6)

-> ON 중복 키 업데이트 c=VALUES (a)+값(b);


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.