mysql其他函數(shù)

1.?位函數(shù)

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

|

Bitwise OR:

mysql>?SELECT 29 | 15;

-> 31

其結(jié)果為一個(gè)64比特?zé)o符號(hào)整數(shù)。

&

Bitwise AND:

mysql>?SELECT 29 & 15;

-> 13

其結(jié)果為一個(gè)64比特?zé)o符號(hào)整數(shù)。

^

Bitwise XOR:

mysql>?SELECT 1 ^ 1;

-> 0

mysql>?SELECT 1 ^ 0;

-> 1

mysql>?SELECT 11 ^ 3;

-> 8

結(jié)果為一個(gè)64比特?zé)o符號(hào)整數(shù)。

把一個(gè)longlong (BIGINT)數(shù)左移兩位。

mysql>?SELECT 1

-> 4

其結(jié)果為一個(gè)64比特?zé)o符號(hào)整數(shù)。

>>

把一個(gè)longlong (BIGINT)數(shù)右移兩位。

mysql>?SELECT 4 >> 2;

-> 1

其結(jié)果為一個(gè)64比特?zé)o符號(hào)整數(shù)。

~

反轉(zhuǎn)所有比特。

mysql>?SELECT 5 & ~1;

-> 4

其結(jié)果為一個(gè)64比特?zé)o符號(hào)整數(shù)。

BIT_COUNT(N)

返回參數(shù)N?中所設(shè)置的比特?cái)?shù)

mysql>?SELECT BIT_COUNT(29);

-> 4

2.?加密函數(shù)

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

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

這些函數(shù)允許使用官方AES進(jìn)行加密和數(shù)據(jù)加密?(高級(jí)加密標(biāo)準(zhǔn)?)?算法,?即以前人們所熟知的 “Rijndael”。?保密關(guān)鍵字的長(zhǎng)度為128比特,不過(guò)你可以通過(guò)改變?cè)炊鴮⑵溲娱L(zhǎng)到?256?比特。我們選擇了?128比特的原因是它的速度要快得多,且對(duì)于大多數(shù)用途而言這個(gè)保密程度已經(jīng)夠用。

輸入?yún)?shù)可以為任何長(zhǎng)度。若任何一個(gè)參數(shù)為NULL,則函數(shù)的結(jié)果也是NULL。

因?yàn)?AES?是塊級(jí)算法,使用填充將不均衡長(zhǎng)度字符串編碼,這樣結(jié)果字符串的長(zhǎng)度的算法為?16 * (trunc(string_length?/ 16) + 1)。

若?AES_DECRYPT()檢測(cè)到無(wú)效數(shù)據(jù)或不正確填充,它會(huì)返回?NULL。然而,若輸入的資料或密碼無(wú)效時(shí),AES_DECRYPT()有可能返回一個(gè)非?NULL?值?(可能為無(wú)用信息?)。

你可以通過(guò)修改你的問(wèn)詢,從而使用AES函數(shù)以加密形式來(lái)存儲(chǔ)數(shù)據(jù):

INSERT INTO t VALUES (1,AES_ENCRYPT(‘text’,’password’));

AES_ENCRYPT()和AES_DECRYPT()?可以被看作MySQL中普遍通用的密碼最安全的加密函數(shù)。

DECODE(crypt_str,pass_str)

使用?pass_str?作為密碼,解密加密字符串?crypt_str,?crypt_str?應(yīng)該是由ENCODE()返回的字符串。

ENCODE(str,pass_str)

使用pass_str?作為密碼,解密?str?。 使用DECODE()解密結(jié)果。

結(jié)果是一個(gè)和str長(zhǎng)度相同的二進(jìn)制字符串。若你想要將其保留在一個(gè)列中,可使用?BLOB?列類型。

DES_DECRYPT(crypt_str[,key_str])

使用DES_ENCRYPT()加密一個(gè)字符串。若出現(xiàn)錯(cuò)誤,這個(gè)函數(shù)會(huì)返回?NULL。

注意,這個(gè)函數(shù)只有當(dāng)MySQL在SSL?的支持下配置完畢時(shí)才會(huì)運(yùn)作。

假如沒(méi)有給定?key_str?參數(shù),? DES_DECRYPT()?會(huì)首先檢查加密字符串的第一個(gè)字節(jié), 從而確定用來(lái)加密原始字符串的DES密碼關(guān)鍵字?jǐn)?shù)字,之后從DES關(guān)鍵字文件中讀取關(guān)鍵字從而解密信息。為使其運(yùn)行,用戶必須享有?SUPER?特權(quán)。可以選擇–des-key-file服務(wù)器指定關(guān)鍵字文件。

假如你向這個(gè)函數(shù)傳遞一個(gè)key_str?參數(shù),該字符串被用作解密信息的關(guān)鍵字。

若?crypt_str?參數(shù)看起來(lái)不是一個(gè)加密字符串,?MySQL?會(huì)返回給定的?crypt_str。

DES_ENCRYPT(str[,(key_num|key_str)])

用Triple-DES?算法給出的關(guān)鍵字加密字符串。若出現(xiàn)錯(cuò)誤,這個(gè)函數(shù)會(huì)返回NULL。

注意,這個(gè)函數(shù)只有當(dāng)MySQL?在SSL的支持下配置完畢后才會(huì)運(yùn)行。

使用的加密關(guān)鍵字的選擇基于第二個(gè)到?DES_ENCRYPT()的參數(shù),假如給定:

參數(shù) ? ?說(shuō)明 ? ?

無(wú)參數(shù) ? ?使用來(lái)自DES關(guān)鍵字文件的第一個(gè)關(guān)鍵字。 ? ?

key_num ? ?使用DES?關(guān)鍵字文件給出的關(guān)鍵字?jǐn)?shù)字(0-9)。 ? ?

key_str ? ?使用給出的關(guān)鍵字字符串為?str?加密。 ? ?

選擇–des-key-file服務(wù)器指定關(guān)鍵字文件。

返回字符串是一個(gè)二進(jìn)制字符串,其中第一個(gè)字符為?CHAR(128 | key_num)。

加上?128使得識(shí)別加密關(guān)鍵字更加容易。若你使用一個(gè)字符串關(guān)鍵字,則?key_num?為127。

結(jié)果的字符串長(zhǎng)度為??new_len?=?orig_len?+ (8-(orig_len?% 8))+1。

DES關(guān)鍵字文件中的每一行都具有如下格式:

key_num?des_key_str

每個(gè)key_num?必須是一個(gè)從0到0范圍內(nèi)的數(shù)字。文件中行的排列順序是任意的。?des_key_str?是用來(lái)加密信息的字符串。在數(shù)字和關(guān)鍵字之間應(yīng)該至少有一個(gè)空格。若你未指定任何到DES_ENCRYPT()的關(guān)鍵字參數(shù),則第一個(gè)關(guān)鍵字為默認(rèn)的使用關(guān)鍵字。

使用FLUSH DES_KEY_FILE語(yǔ)句,你可以讓?MySQL從關(guān)鍵字文件讀取新的關(guān)鍵字值。這要求你享有?RELOAD特權(quán)。

擁有一套默認(rèn)關(guān)鍵字的一個(gè)好處就是它向應(yīng)用程序提供了一個(gè)檢驗(yàn)加密列值的方式,而無(wú)須向最終用戶提供解密這些值的權(quán)力。

mysql>?SELECT customer_address FROM customer_table

> WHERE crypted_credit_card = DES_ENCRYPT(‘credit_card_number’);

ENCRYPT(str[,salt])

使用Unix crypt()?系統(tǒng)調(diào)用加密?str。?salt?參數(shù)應(yīng)為一個(gè)至少包含2個(gè)字符的字符串。若沒(méi)有給出?salt?參數(shù),則使用任意值。

mysql>?SELECT ENCRYPT(‘hello’);

-> ‘VxuFAJXVARROc’

至少在一些系統(tǒng)中,ENCRYPT()除了str的前八位字符之外會(huì)忽略所有內(nèi)容。這個(gè)行為由下劃線的crypt()?系統(tǒng)調(diào)用的執(zhí)行所決定。

假如crypt()在你的系統(tǒng)中不可用(正如在?Windows系統(tǒng)), ENCRYPT()?則會(huì)始終返回NULL。鑒于這個(gè)原因,我們向你推薦使用?MD5()?或SHA1()?來(lái)代替,因?yàn)檫@兩個(gè)函數(shù)適合所有的平臺(tái)。

MD5(str)

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

mysql>?SELECT MD5(‘testing’);

-> ‘ae2b1fca515949e5d54fb22b8ed95575’

這是”RSA Data Security, Inc. MD5 Message-Digest Algorithm.”

假如你想要將這個(gè)值轉(zhuǎn)化為大寫字母,參見“Cast函數(shù)和操作符”中BINARY操作符項(xiàng)中給出的二進(jìn)制字符串轉(zhuǎn)換。

OLD_PASSWORD(str)

當(dāng)PASSWORD()的執(zhí)行變?yōu)楦纳瓢踩詴r(shí),OLD_PASSWORD()會(huì)被添加到?MySQL。OLD_PASSWORD()返回從前的PASSWORD()執(zhí)行值( 4.1之前),同時(shí)允許你為任何4.1?之前的需要連接到你的5.1?版本MySQL服務(wù)器前客戶端設(shè)置密碼,從而不至于將它們切斷。

PASSWORD(str)

從原文密碼str?計(jì)算并返回密碼字符串,當(dāng)參數(shù)為?NULL?時(shí)返回?NULL。這個(gè)函數(shù)用于用戶授權(quán)表的Password列中的加密MySQL密碼存儲(chǔ)

mysql>?SELECT PASSWORD(‘badpwd’);

-> ‘7f84554057dd964b’

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

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

注釋: PASSWORD()函數(shù)在MySQL服務(wù)器中的鑒定系統(tǒng)使用;你不應(yīng)將它用在你個(gè)人的應(yīng)用程序中。為達(dá)到同樣目的,可使用?MD5()或SHA1()?代替。????更多關(guān)于在您的應(yīng)用程序中處理密碼及安全鑒定的信息見RFC 2195

SHA1(str) SHA(str)

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

mysql>?SELECT SHA1(‘abc’);

-> ‘a9993e364706816aba3e25717850c26c9cd0d89d’

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

3.?信息函數(shù)

BENCHMARK(count,expr)

BENCHMARK()?函數(shù)重復(fù)count?次執(zhí)行表達(dá)式?expr?。 它可以被用于計(jì)算? MySQL?處理表達(dá)式的速度。結(jié)果值通常為?0。另一種用處來(lái)自?mysql客戶端內(nèi)部,能夠報(bào)告問(wèn)詢執(zhí)行的次數(shù):

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

此處報(bào)告的時(shí)間是客戶端上的共用時(shí)間,而不是服務(wù)器端上的CPU時(shí)間。建議執(zhí)行多遍BENCHMARK(),并解釋與服務(wù)器機(jī)器負(fù)荷程度有關(guān)的結(jié)果。

·?????????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 ? ?無(wú)排序 ? ?不同排序的字符串連接 ? ?

2 ? ?明確排序 ? ?列值 ? ?

3 ? ?系統(tǒng)常量 ? ?USER()返回值 ? ?

4 ? ?可壓縮 ? ?文字字符串 ? ?

5 ? ?可忽略 ? ?NULL得來(lái)的NULL或一個(gè)表達(dá)式 ? ?

下方值得優(yōu)先級(jí)較高。

COLLATION(str)

返回惠字符串參數(shù)的排序方式。

mysql>?SELECT COLLATION(‘abc’);

-> ‘latin1_swedish_ci’

mysql>?SELECT COLLATION(_utf8’abc’);

-> ‘utf8_general_ci’

CONNECTION_ID()

返回對(duì)于連接的連接ID (線程ID)。每個(gè)連接都有各自的唯一?ID。

mysql>?SELECT CONNECTION_ID();

-> 23786

CURRENT_USER, CURRENT_USER()

返回當(dāng)前話路被驗(yàn)證的用戶名和主機(jī)名組合。這個(gè)值符合確定你的存取權(quán)限的MySQL?賬戶。在被指定SQL SECURITY DEFINER特征的存儲(chǔ)程序內(nèi),?CURRENT_USER()?返回程序的創(chuàng)建者。

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’

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

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

DATABASE()

返回使用?utf8?字符集的默認(rèn)(當(dāng)前)數(shù)據(jù)庫(kù)名。在存儲(chǔ)程序里,默認(rèn)數(shù)據(jù)庫(kù)是同該程序向關(guān)聯(lián)的數(shù)據(jù)庫(kù),但并不一定與調(diào)用語(yǔ)境的默認(rèn)數(shù)據(jù)庫(kù)相同。

mysql>?SELECT DATABASE();

-> ‘test’

若沒(méi)有默認(rèn)數(shù)據(jù)庫(kù), DATABASE()返回?NULL。

FOUND_ROWS()

A SELECT語(yǔ)句可能包括一個(gè)?LIMIT?子句,用來(lái)限制服務(wù)器返回客戶端的行數(shù)。在有些情況下,需要不用再次運(yùn)行該語(yǔ)句而得知在沒(méi)有LIMIT?時(shí)到底該語(yǔ)句返回了多少行。為了知道這個(gè)行數(shù),?包括在SELECT?語(yǔ)句中選擇? SQL_CALC_FOUND_ROWS?,隨后調(diào)用?FOUND_ROWS()?:

mysql>?SELECT SQL_CALC_FOUND_ROWS * FROM?tbl_name

->?WHERE id > 100 LIMIT 10;

mysql>?SELECT FOUND_ROWS();

第二個(gè)?SELECT返回一個(gè)數(shù)字,指示了在沒(méi)有LIMIT子句的情況下,第一個(gè)SELECT返回了多少行?(若上述的?SELECT語(yǔ)句不包括?SQL_CALC_FOUND_ROWS?選項(xiàng),則使用LIMIT?和不使用時(shí),F(xiàn)OUND_ROWS()?可能會(huì)返回不同的結(jié)果)。

通過(guò)?FOUND_ROWS()的有效行數(shù)是瞬時(shí)的,并且不用于越過(guò)SELECT SQL_CALC_FOUND_ROWS語(yǔ)句后面的語(yǔ)句。若你需要稍候參閱這個(gè)值,那么將其保存:

mysql>?SELECT SQL_CALC_FOUND_ROWS * FROM … ;

mysql>?SET @rows = FOUND_ROWS();

假如你正在使用?SELECT SQL_CALC_FOUND_ROWS, MySQL?必須計(jì)算出在全部結(jié)果集合中有所少行。然而, 這比不用LIMIT而再次運(yùn)行問(wèn)詢要快,原因是結(jié)果集合不需要被送至客戶端。

SQL_CALC_FOUND_ROWS?和?FOUND_ROWS()?在當(dāng)你希望限制一個(gè)問(wèn)詢返回的行數(shù)時(shí)很有用,同時(shí)還能不需要再次運(yùn)行問(wèn)詢而確定全部結(jié)果集合中的行數(shù)。一個(gè)例子就是提供頁(yè)式顯示的Web腳本,該顯示包含顯示搜索結(jié)果其它部分的頁(yè)的連接。使用FOUND_ROWS()?使你確定剩下的結(jié)果需要多少其它的頁(yè)。

SQL_CALC_FOUND_ROWS?和?FOUND_ROWS()?的應(yīng)用對(duì)于UNION?問(wèn)詢比對(duì)于簡(jiǎn)單SELECT?語(yǔ)句更為復(fù)雜,原因是在UNION?中,LIMIT?可能會(huì)出現(xiàn)在多個(gè)位置。它可能適用于UNION中的個(gè)人?SELECT語(yǔ)句,或是總體上??到UNION?結(jié)果的全程。

SQL_CALC_FOUND_ROWS對(duì)于?UNION的意向是它應(yīng)該不需要全程LIMIT而返回應(yīng)返回的行數(shù)。SQL_CALC_FOUND_ROWS?和UNION?一同使用的條件是:

?SQL_CALC_FOUND_ROWS?關(guān)鍵詞必須出現(xiàn)在UNION的第一個(gè)?SELECT中。

?FOUND_ROWS()的值只有在使用?UNION ALL時(shí)才是精確的。若使用不帶ALL的UNION,則會(huì)發(fā)生兩次刪除, 而? FOUND_ROWS()?的指只需近似的。

假若UNION?中沒(méi)有出現(xiàn)? LIMIT?,則SQL_CALC_FOUND_ROWS?被忽略,返回臨時(shí)表中的創(chuàng)建的用來(lái)處理UNION的行數(shù)。

LAST_INSERT_ID() LAST_INSERT_ID(expr)

自動(dòng)返回最后一個(gè)INSERT或?UPDATE?問(wèn)詢?yōu)?AUTO_INCREMENT列設(shè)置的第一個(gè)?發(fā)生的值。

mysql>?SELECT LAST_INSERT_ID();

-> 195

產(chǎn)生的ID?每次連接后保存在服務(wù)器中。這意味著函數(shù)向一個(gè)給定客戶端返回的值是該客戶端產(chǎn)生對(duì)影響AUTO_INCREMENT列的最新語(yǔ)句第一個(gè)?AUTO_INCREMENT值的。這個(gè)值不能被其它客戶端影響,即使它們產(chǎn)生它們自己的?AUTO_INCREMENT值。這個(gè)行為保證了你能夠找回自己的?ID?而不用擔(dān)心其它客戶端的活動(dòng),而且不需要加鎖或處理。

假如你使用一個(gè)非“magic”值來(lái)更新某一行的AUTO_INCREMENT?列,則LAST_INSERT_ID()?的值不會(huì)變化(換言之,?一個(gè)不是?NULL也不是?0的值)。

重點(diǎn):?假如你使用單INSERT語(yǔ)句插入多個(gè)行,? LAST_INSERT_ID()?只返回插入的第一行產(chǎn)生的值。其原因是這使依靠其它服務(wù)器復(fù)制同樣的?INSERT語(yǔ)句變得簡(jiǎn)單。

例如:

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)

雖然第二個(gè)問(wèn)詢將3?個(gè)新行插入?t,?對(duì)這些行的第一行產(chǎn)生的?ID?為?2,?這也是?LAST_INSERT_ID()返回的值。

假如你使用?INSERT IGNORE而記錄被忽略,則AUTO_INCREMENT?計(jì)數(shù)器不會(huì)增量,而?LAST_INSERT_ID()?返回0,這反映出沒(méi)有插入任何記錄。

若給出作為到LAST_INSERT_ID()的參數(shù)expr?,則參數(shù)的值被函數(shù)返回,并作為被LAST_INSERT_ID()返回的下一個(gè)值而被記憶。這可用于模擬序列:

創(chuàng)建一個(gè)表,用來(lái)控制順序計(jì)數(shù)器并使其初始化:

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

o?????????????????????mysql>?INSERT INTO sequence VALUES (0);

使用該表產(chǎn)生這樣的序列數(shù) :

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

o?????????????????????mysql>?SELECT LAST_INSERT_ID();

UPDATE?語(yǔ)句會(huì)增加順序計(jì)數(shù)器并引發(fā)向LAST_INSERT_ID()??的下一次調(diào)用,用來(lái)返回升級(jí)后的值。?SELECT?語(yǔ)句會(huì)檢索這個(gè)值。? mysql_insert_id() C API函數(shù)也可用于獲取這個(gè)值。

你可以不用調(diào)用LAST_INSERT_ID()而產(chǎn)生序列,但這樣使用這個(gè)函數(shù)的效用在于?ID值被保存在服務(wù)器中,作為自動(dòng)產(chǎn)生的值。它適用于多個(gè)用戶,原因是多個(gè)用戶均可使用?UPDATE語(yǔ)句并用SELECT語(yǔ)句(或mysql_insert_id()),得到他們自己的序列值,而不會(huì)影響其它產(chǎn)生他們自己的序列值的客戶端或被其它產(chǎn)生他們自己的序列值的客戶端所影響。

注意,?mysql_insert_id()?僅會(huì)在INSERT?和UPDATE語(yǔ)句后面被升級(jí), 因此你不能在執(zhí)行了其它諸如SELECT或?SET?這樣的SQL語(yǔ)句后使用?C API?函數(shù)來(lái)找回?LAST_INSERT_ID(expr)?對(duì)應(yīng)的值。

ROW_COUNT()

ROW_COUNT()返回被前面語(yǔ)句升級(jí)的、插入的或刪除的行數(shù)。 這個(gè)行數(shù)和?mysql?客戶端顯示的行數(shù)及mysql_affected_rows() C API?函數(shù)返回的值相同。

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

問(wèn)詢完成,?表中有3?行?(0.00秒)

記錄: 3?重復(fù): 0?警告: 0

?

mysql>?SELECT ROW_COUNT();
+————-+
| ROW_COUNT() |
+————-+
|?????????? 3 |
+————-+

表中有1行?(0.00?秒)

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

問(wèn)詢完成,?找到2?行?(0.00?秒)

mysql>?SELECT ROW_COUNT();

+————-+
| ROW_COUNT() |
+————-+
|?????????? 2 |
+————-+

表中有1行?(0.00?秒)

SCHEMA()

這個(gè)函數(shù)和?DATABASE()具有相同的意義。

SESSION_USER()

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

SYSTEM_USER()

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

USER()

返回當(dāng)前?MySQL用戶名和機(jī)主名/

mysql>?SELECT USER();

->?‘davida@localhost’

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

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

mysql>?SELECT SUBSTRING_INDEX(USER(),’@’,1);

-> ‘davida’

由于?USER()?返回一個(gè)utf8?字符集中的值,你也應(yīng)確保’@’?字符串文字在該字符集中得到解釋:

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

-> ‘davida’

VERSION()

返回指示?MySQL?服務(wù)器版本的字符串。這個(gè)字符串使用?utf8?字符集。

mysql>?SELECT VERSION();

-> ‘5.1.2-alpha-standard’

注意,假如你的版本字符串以-log結(jié)尾,這說(shuō)明登錄已被激活。

4.?其他函數(shù)

DEFAULT(col_name)

返回一個(gè)表列的默認(rèn)值。若該列沒(méi)有默認(rèn)值則會(huì)產(chǎn)生錯(cuò)誤。

mysql>?UPDATE t SET i = DEFAULT(i)+1 WHERE id

FORMAT(X,D)

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

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)

設(shè)法使用字符串str?給定的名字得到一個(gè)鎖, 超時(shí)為timeout?秒。若成功得到鎖,則返回?1,若操作超時(shí)則返回0? (例如,由于另一個(gè)客戶端已提前封鎖了這個(gè)名字?),若發(fā)生錯(cuò)誤則返回NULL (諸如缺乏記憶或線程mysqladmin kill?被斷開?)。假如你有一個(gè)用GET_LOCK()得到的鎖,當(dāng)你執(zhí)行RELEASE_LOCK()或你的連接斷開(正常或非正常)時(shí),這個(gè)鎖就會(huì)解除。

這個(gè)函數(shù)可用于執(zhí)行應(yīng)用程序鎖或模擬記錄鎖定。名稱被鎖定在服務(wù)器范圍內(nèi)。假如一個(gè)名字已經(jīng)被一個(gè)客戶端封鎖,GET_LOCK()?會(huì)封鎖來(lái)自另一個(gè)客戶端申請(qǐng)封鎖同一個(gè)名字的任何請(qǐng)求。這使對(duì)一個(gè)封鎖名達(dá)成協(xié)議的客戶端使用這個(gè)名字合作執(zhí)行建議鎖。然而要知道它也允許不在一組合作客戶端中的一個(gè)客戶端封鎖名字,不論是服役的還是非故意的,這樣阻止任何合作中的客戶端封鎖這個(gè)名字。一個(gè)減少這種情況發(fā)生的辦法就是使用數(shù)據(jù)庫(kù)特定的或應(yīng)用程序特定的封鎖名。例如,??使用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

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

INET_ATON(expr)

給出一個(gè)作為字符串的網(wǎng)絡(luò)地址的點(diǎn)地址表示,返回一個(gè)代表該地址數(shù)值的整數(shù)。地址可以是4或8比特地址。

mysql>?SELECT INET_ATON(‘209.207.224.40’);

-> 3520061480

產(chǎn)生的數(shù)字總是按照網(wǎng)絡(luò)字節(jié)順序。如上面的例子,數(shù)字按照?209×2563?+ 207×2562?+ 224×256 + 40?進(jìn)行計(jì)算。

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

mysql>?SELECT INET_ATON(‘127.0.0.1’), INET_ATON(‘127.1’);
-> 2130706433, 2130706433

注釋:?在存儲(chǔ)由INET_ATON()?產(chǎn)生的值時(shí),推薦你使用?INT UNSIGNED?列。假如你使用?(帶符號(hào)) INT列,?則相應(yīng)的第一個(gè)八位組大于127的IP?地址值會(huì)被截至? 2147483647 (即, INET_ATON(‘127.255.255.255’)?所返回的值)。

INET_NTOA(expr)

給定一個(gè)數(shù)字網(wǎng)絡(luò)地址?(4?或?8?比特),返回作為字符串的該地址的電地址表示。

mysql>?SELECT INET_NTOA(3520061480);
-> ‘209.207.224.40’

IS_FREE_LOCK(str)

檢查名為str的鎖是否可以使用?(換言之,沒(méi)有被封鎖)。若鎖可以使用,則返回? 1? (沒(méi)有人在用這個(gè)鎖),?若這個(gè)鎖正在被使用,則返回0?,出現(xiàn)錯(cuò)誤則返回?NULL? (諸如不正確的參數(shù)?)。

IS_USED_LOCK(str)

檢查名為str的鎖是否正在被使用(換言之,被封鎖)。若被封鎖,則返回使用該鎖的客戶端的連接標(biāo)識(shí)符。否則返回?NULL。

MASTER_POS_WAIT(log_name,log_pos[,timeout])

該函數(shù)對(duì)于控制主從同步很有用處。它會(huì)持續(xù)封鎖,直到從設(shè)備閱讀和應(yīng)用主機(jī)記錄中所有補(bǔ)充資料到指定的位置。返回值是其為到達(dá)指定位置而必須等待的記錄事件的數(shù)目。若從設(shè)備SQL線程沒(méi)有被啟動(dòng)、從設(shè)備主機(jī)信息尚未初始化、參數(shù)不正確或出現(xiàn)任何錯(cuò)誤,則該函數(shù)返回?NULL。若超時(shí)時(shí)間被超過(guò),則返回-1。若在MASTER_POS_WAIT()?等待期間,從設(shè)備SQL線程中止,則該函數(shù)返回?NULL。若從設(shè)備由指定位置通過(guò),則函數(shù)會(huì)立即返回結(jié)果。

假如已經(jīng)指定了一個(gè)超時(shí)時(shí)間值,當(dāng)?超時(shí)時(shí)間?秒數(shù)經(jīng)過(guò)后MASTER_POS_WAIT()會(huì)停止等待。超時(shí)時(shí)間?必須大于?0;一個(gè)為零或?yàn)樨?fù)值的?超時(shí)時(shí)間?表示沒(méi)有超市時(shí)間。

NAME_CONST(name,value)

返回給定值。 當(dāng)用來(lái)產(chǎn)生一個(gè)結(jié)果集合列時(shí), NAME_CONST()促使該列使用給定名稱。

mysql>?SELECT NAME_CONST(‘myname’, 14);

+——–+
| myname |
+——–+
|???? 14 |
+——–+

這個(gè)函數(shù)被添加進(jìn)?MySQL 5.0.12。它只做內(nèi)部使用。你可能會(huì)在mysqlbinlog?的書櫥中看到這個(gè)函數(shù)。

RELEASE_LOCK(str)

解開被GET_LOCK()獲取的,用字符串str?所命名的鎖。若鎖被解開,則返回? 1,若改線程尚未創(chuàng)建鎖,則返回0 (此時(shí)鎖沒(méi)有被解開?),?若命名的鎖不存在,則返回?NULL。若該鎖從未被對(duì)GET_LOCK()的調(diào)用獲取,或鎖已經(jīng)被提前解開,則該鎖不存在。

DO?語(yǔ)句和RELEASE_LOCK()同時(shí)使用很方便。

SLEEP(duration)

睡眠(暫停)?時(shí)間為duration?參數(shù)給定的秒數(shù),然后返回?0。若?SLEEP()?被中斷,它會(huì)返回?1。?duration?或許或包括一個(gè)給定的以微秒為單位的分?jǐn)?shù)部分。

UUID()

返回一個(gè)通用唯一標(biāo)識(shí)符(UUID)?,其產(chǎn)生的根據(jù)是《DCE 1.1:?遠(yuǎn)程過(guò)程調(diào)用》?(附錄A) CAE (公共應(yīng)用軟件環(huán)境)?的說(shuō)明,該作品于1997年10月由?The Open Group?出版?(文件編號(hào)?C706,http://www.opengroup.org/public/pubs/catalog/c706.htm).

UUID被設(shè)計(jì)成一個(gè)在時(shí)間和空間上都獨(dú)一無(wú)二的數(shù)字。2個(gè)對(duì)UUID()?的調(diào)用應(yīng)產(chǎn)生2個(gè)不同的值,即使這些調(diào)用的執(zhí)行是在兩個(gè)互不相連的單獨(dú)電腦上進(jìn)行。

UUID?是一個(gè)由5位十六進(jìn)制數(shù)的字符串表示的128比特?cái)?shù)字 ,其格式為? aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee?:

前3個(gè)數(shù)字從一個(gè)時(shí)間戳產(chǎn)生。

第4?個(gè)數(shù)字保持暫時(shí)唯一性,以防時(shí)間戳值失去單一性?(例如,?由于經(jīng)濟(jì)時(shí))。

第5個(gè)數(shù)字是一個(gè)?IEEE 802?節(jié)點(diǎn)號(hào),它提供空間唯一性。若后者不可用,則用一個(gè)隨機(jī)數(shù)字替換。?(例如,?由于主機(jī)沒(méi)有以太網(wǎng)卡,或我們不知道怎樣在你的操作系統(tǒng)上找到界面的機(jī)器地址?)。假若這樣,空間唯一性就不能得到保證。盡管如此,一個(gè)沖突的發(fā)生機(jī)率還是非常低的。

目前,一個(gè)界面的?MAC?地址盡被FreeBSD?和?Linux考慮到。在其它操作系統(tǒng)中, MySQL使用隨機(jī)產(chǎn)生的?48比特?cái)?shù)字。

mysql>?SELECT UUID();

-> ‘6ccd780c-baba-1026-9564-0040f4311e29’

注意,?UUID()?不支持復(fù)制功能。

VALUES(col_name)

在一個(gè)INSERT?…?ON DUPLICATE KEY UPDATE?…語(yǔ)句中,你可以在UPDATE?子句中使用?VALUES(col_name)函數(shù),用來(lái)訪問(wèn)來(lái)自該語(yǔ)句的INSERT?部分的列值。換言之,UPDATE?子句中的?VALUES(col_name)?訪問(wèn)需要被插入的col_name?的值,并不會(huì)發(fā)生重復(fù)鍵沖突。這個(gè)函數(shù)在多行插入中特別有用。? VALUES()函數(shù)只在INSERT … UPDATE?語(yǔ)句中有意義,而在其它情況下只會(huì)返回?NULL。

mysql>?INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)

->?ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊10 分享