MySQL基礎教程12 — 函數之其他函數

1.?位函數

對于比特運算,mysql?使用?bigint (64比特)?算法,因此這些操作符的最大范圍是?64?比特。

  • |

Bitwise OR:

mysql>?SELECT?29?|?15;  ->?31

其結果為一個64比特無符號整數。

  • &

Bitwise AND:

mysql>?SELECT?29?&?15;  ->?13

其結果為一個64比特無符號整數。

  • ^

Bitwise XOR:

mysql>?SELECT?1?^?1;  ->?0  mysql>?SELECT?1?^?0;  ->?1  mysql>?SELECT?11?^?3;  ->?8

結果為一個64比特無符號整數。

把一個longlong (BIGINT)數左移兩位。

mysql>?SELECT?1??4

其結果為一個64比特無符號整數。

  • >>

把一個longlong (BIGINT)數右移兩位。

mysql>?SELECT?4?>>?2;  ->?1

其結果為一個64比特無符號整數。

  • ~

反轉所有比特。

mysql>?SELECT?5?&?~1;  ->?4

其結果為一個64比特無符號整數。

  • BIT_COUNT(N)

返回參數N?中所設置的比特數

mysql>?SELECT?BIT_COUNT(29);  ->?4

2.?加密函數

本節介紹了加密和加密值。若你想要儲存一些由可能包含任意字節值的加密函數返回的結果,使用BLOB列而不是?CHAR或VARCHAR?列,從而避免由于結尾空格的刪除而改變一些數據值的潛在問題。

  • AES_ENCRYPT(str,key_str) , AES_DECRYPT(crypt_str,key_str)

這些函數允許使用官方AES進行加密和數據加密?(高級加密標準?)?算法,?即以前人們所熟知的 “Rijndael”。?保密關鍵字的長度為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服務器指定關鍵字文件。

假如你向這個函數傳遞一個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('credit_card_number');
  • ENCRYPT(str[,salt])

使用Unix crypt()?系統調用加密?str。?salt?參數應為一個至少包含2個字符的字符串。若沒有給出?salt?參數,則使用任意值。

mysql>?SELECT?ENCRYPT('hello');  ->?'VxuFAJXVARROc'

至少在一些系統中,ENCRYPT()除了str的前八位字符之外會忽略所有內容。這個行為由下劃線的crypt()?系統調用的執行所決定。

假如crypt()在你的系統中不可用(正如在?Windows系統), ENCRYPT()?則會始終返回NULL。鑒于這個原因,我們向你推薦使用?MD5()?或SHA1()?來代替,因為這兩個函數適合所有的平臺。

  • MD5(str)

為字符串算出一個?MD5 128比特檢查和。該值以32位十六進制數字的二進制字符串的形式返回,?若參數為?NULL?則會返回NULL。例如,返回值可被用作散列關鍵字。

mysql>?SELECT?MD5('testing');  ->?'ae2b1fca515949e5d54fb22b8ed95575'

這是”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('badpwd');  ->?'7f84554057dd964b'

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

PASSWORD()?執行密碼加密與Unix?密碼被加密的方式不同。請參見ENCRYPT()。

注釋: PASSWORD()函數在MySQL服務器中的鑒定系統使用;你應將它用在你個人的應用程序中。為達到同樣目的,可使用?MD5()或SHA1()?代替。????更多關于在您的應用程序中處理密碼及安全鑒定的信息見RFC 2195

  • SHA1(str) SHA(str)

為字符串算出一個?SHA1 160比特檢查和,如RFC 3174 (安全散列算法?)中所述。該值被作為40位十六進制數字返回,而當參數為NULL?時則返回?NULL。這個函數的一個可能的用處就在于其作為散列關鍵字。你也可以將其作為存儲密碼的密碼安全函數使用。

mysql>?SELECT?SHA1('abc');  ->?'a9993e364706816aba3e25717850c26c9cd0d89d'

SHA1()可以被視為一個密碼更加安全的函數,相當于? MD5()。?SHA()?和SHA1()具有相同的意義。

3.?信息函數

  • BENCHMARK(count,expr)

BENCHMARK()?函數重復count?次執行表達式?expr?。 它可以被用于計算? 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>?SELECT?COLLATION(_utf8'abc');  ->?'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;  ERROR?1044:?Access?denied?for?user?''@'localhost'?to  database?'mysql'  mysql>?SELECT?CURRENT_USER();  ->?'@localhost'

這個例子解釋了雖然客戶端指定了一個?davida用戶名?(正如USER()函數的值所指示的),?服務器卻使用一個匿名的用戶賬戶確認該客戶端?(見CURRENT_USER()值得空用戶名部分?)。這種情況發生的一個原因是?One?在向?davida的授權列表中沒有足夠的賬戶。

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

  • DATABASE()

返回使用?utf8?字符集的默認(當前)數據庫名。在存儲程序里,默認數據庫是同該程序向關聯的數據庫,但并不一定與調用語境的默認數據庫相同。

mysql>?SELECT?DATABASE();  ->?'test'

若沒有默認數據庫, 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,?'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();  ->?'davida@localhost'

這個值指示了你指定的連接服務器時的用戶名,及你所連接的客戶主機。這個值可以和CURRENT_USER()?的值不同。

你可以這樣提取用戶名部分:

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

由于?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

  • FORMAT(X,D)

將數字X?的格式寫為’#,###,###.##’,以四舍五入的方式保留小數點后?D?位, 并將結果以字符串的形式返回。若??D?為?0,?則返回結果不帶有小數點,或不含小數部分。

mysql>?SELECT?FORMAT(12332.123456,?4);  ->?'12,332.1235'  mysql>?SELECT?FORMAT(12332.1,4);  ->?'12,332.1000'  mysql>?SELECT?FORMAT(12332.2,0);  ->?'12,332'
  • GET_LOCK(str,timeout)

設法使用字符串str?給定的名字得到一個鎖, 超時為timeout?秒。若成功得到鎖,則返回?1,若操作超時則返回0? (例如,由于另一個客戶端已提前封鎖了這個名字?),若發生錯誤則返回NULL (諸如缺乏記憶或線程mysqladmin kill?被斷開?)。假如你有一個用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');->?1  mysql>?SELECT?GET_LOCK('lock2',10);->?1  mysql>?SELECT?RELEASE_LOCK('lock2');->?1  mysql>?SELECT?RELEASE_LOCK('lock1');->?NULL

注意,第二個?RELEASE_LOCK()調用返回?NULL?,原因是鎖’lock1′?杯第二個GET_LOCK()調用解開。

  • 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,?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;一個為零或為負值的?超時時間?表示沒有超市時間。

  • NAME_CONST(name,value)

返回給定值。 當用來產生一個結果集合列時, NAME_CONST()促使該列使用給定名稱。

mysql>?SELECT?NAME_CONST('myname',?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();  ->?'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?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)!

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享