MySQL數據庫——常用函數

1 字符串函數

字符串函數是最常用的一種函數了,如果大家編寫過程序的話,不妨回過頭去看看自己使用 過的函數,可能會驚訝地發現字符串處理的相關函數佔已使用過的函數很大一部分。MySQL 中字符串函數也是最豐富的一類函數,表 1 中列出了這些函數以供參考。

表 1 MySQL 中的常用字符串函數

函數 功能
CANCAT(S1,S2,…Sn) 連接 S1,S2,…Sn 爲一個字符串
INSERT(str,x,y,instr) 將字符串 str 從第 x 位置開始,y 個字符長的子串替換爲字符串 instr
LOWER(str) 將字符串 str 中所有字符變爲小寫
UPPER(str) 將字符串 str 中所有字符變爲大寫
LEFT(str ,x) 返回字符串 str 最左邊的 x 個字符
RIGHT(str,x) 返回字符串 str 最右邊的 x 個字符
LPAD(str,n ,pad) 用字符串 pad 對 str 最左邊進行填充,直到長度爲 n 個字符長度
RPAD(str,n,pad) 用字符串 pad 對 str 最右邊進行填充,直到長度爲 n 個字符長度
LTRIM(str) 去掉字符串 str 左側的空格
RTRIM(str) 去掉字符串 str 行尾的空格
REPEAT(str,x) 返回 str 重複 x 次的結果
REPLACE(str,a,b) 用字符串 b 替換字符串 str 中所有出現的字符串 a
STRCMP(s1,s2) 比較字符串 s1 和 s2
TRIM(str) 去掉字符串行尾和行頭的空格
SUBSTRING(str,x,y) 返回從字符串 str x 位置起 y 個字符長度的字串

下面通過具體的實例來逐個地研究每個函數的用法,需要注意的是這裏的例子僅僅在於說明各個函數的使用方法,所以函數都是單個出現的,但是在一個具體的應用中通常可能需要綜合幾個甚至幾類函數才能實現相應的應用。
CANCAT(S1,S2,…Sn)函數:把傳入的參數連接成爲一個字符串。
下面的例子把“aaa”、“bbb”、“ccc”3個字符串連接成了一個字符串“aaabbbccc”。另外,任何字符串與 NULL 進行連接的結果都將是 NULL。

mysql> select concat('aaa','bbb','ccc') ,concat('aaa',null);
+---------------------------+--------------------+
| concat('aaa','bbb','ccc') | concat('aaa',null) |
+---------------------------+--------------------+
| aaabbbccc | NULL |
+---------------------------+--------------------+
1 row in set (0.05 sec)

INSERT(str ,x,y,instr)函數:將字符串 str 從第 x 位置開始,y 個字符長的子串替換爲字符串 instr。
下面的例子把字符串“beijing2008you”中的從第 12 個字符開始以後的 3 個字符替換成“me”。

mysql> select INSERT('beijing2008you',12,3, 'me') ;
+-------------------------------------+
| INSERT('beijing2008you',12,3, 'me') |
+-------------------------------------+
| beijing2008me |
+-------------------------------------+
1 row in set (0.00 sec)

LOWER(str)和 UPPER(str)函數:把字符串轉換成小寫或大寫。
在字符串比較中,通常要將比較的字符串全部轉換爲大寫或者小寫,如下例所示:

mysql> select LOWER('BEIJING2008'), UPPER('beijing2008');
+----------------------+----------------------+
| LOWER('BEIJING2008') | UPPER('beijing2008') |
+----------------------+----------------------+
| beijing2008 | BEIJING2008 |
+----------------------+----------------------+
1 row in set (0.00 sec)

LEFT(str,x)和 RIGHT(str,x)函數:分別返回字符串最左邊的 x 個字符和最右邊的 x 個字符。
如果第二個參數是 NULL,那麼將不返回任何字符串。 下例中顯示了對字符串“beijing2008”應用函數後的結果。

mysql> SELECT LEFT('beijing2008',7),LEFT('beijing',null),RIGHT('beijing2008',4);
+-----------------------+----------------------+------------------------+
| LEFT('beijing2008',7) | LEFT('beijing',null) | RIGHT('beijing2008',4) |
+-----------------------+----------------------+------------------------+
| beijing | | 2008 |
+-----------------------+----------------------+------------------------+
1 row in set (0.00 sec)

LPAD(str,n ,pad)和 RPAD(str,n ,pad)函數:用字符串 pad 對 str 最左邊和最右邊進行填充, 直到長度爲 n 個字符長度。
下例中顯示了對字符串“2008”和“beijing”分別填充後的結果。

mysql> select lpad('2008',20,'beijing'),rpad('beijing',20,'2008');
+---------------------------+---------------------------+
| lpad('2008',20,'beijing') | rpad('beijing',20,'2008') |
+---------------------------+---------------------------+
| beijingbeijingbe2008 | beijing2008200820082 |
+---------------------------+---------------------------+ 
1 row in set (0.00 sec) 

LTRIM(str)和 RTRIM(str)函數:去掉字符串 str 左側和右側空格。
下例中顯示了字符串“beijing”加空格進行過濾後的結果。

mysql> select ltrim(' |beijing'),rtrim('beijing| ');
+---------------------+------------------------+
| ltrim(' |beijing') | rtrim('beijing| ') |
+---------------------+------------------------+
| |beijing | beijing| |
+---------------------+------------------------+
1 row in set (0.00 sec) 

REPEAT(str,x)函數:返回 str 重複 x 次的結果。
下例中對字符串“mysql”重複顯示了 3 次。

mysql> select repeat('mysql ',3);
+--------------------+
| repeat('mysql ',3) |
+--------------------+
| mysql mysql mysql |
+--------------------+
1 row in set (0.00 sec) 

REPLACE(str,a,b)函數:用字符串 b 替換字符串 str 中所有出現的字符串 a。
下例中用字符串“2008”代替了字符串“beijing_2010”中的“_2010”。

mysql> select replace('beijing_2010','_2010','2008');
+----------------------------------------+
| replace('beijing_2010','_2010','2008') |
+----------------------------------------+
| beijing2008 |
+----------------------------------------+
1 row in set (0.00 sec) 

STRCMP(s1,s2)函數:比較字符串 s1 和 s2 的 ASCII 碼值的大小。如果 s1 比 s2 小,那麼返回-1; 如果 s1 與 s2 相等,那麼返回 0;如果 s1 比 s2 大,那麼返回 1。如下例:

mysql> select strcmp('a','b'),strcmp('b','b'),strcmp('c','b');
+-----------------+-----------------+-----------------+
| strcmp('a','b') | strcmp('b','b') | strcmp('c','b') |
+-----------------+-----------------+-----------------+
| -1 | 0 | 1 |
+-----------------+-----------------+-----------------+
1 row in set (0.00 sec) 

TRIM(str)函數:去掉目標字符串的開頭和結尾的空格。
下例中對字符串“$ beijing2008 $ ”進行了前後空格的過濾。

mysql> select trim(' $ beijing2008 $ ');
+-----------------------------+
| trim(' $ beijing2008 $ ') |
+-----------------------------+
| $ beijing2008 $ |
+-----------------------------+
1 row in set (0.00 sec)

SUBSTRING(str,x,y)函數:返回從字符串 str 中的第 x 位置起 y 個字符長度的字串。
此函數經常用來對給定字符串進行字串的提取,如下例所示。

mysql> select substring('beijing2008',8,4),substring('beijing2008',1,7);
+------------------------------+------------------------------+
| substring('beijing2008',8,4) | substring('beijing2008',1,7) |
+------------------------------+------------------------------+
| 2008 | beijing |
+------------------------------+------------------------------+

2 數值函數

MySQL 中另外一類很重要的函數就是數值函數,這些函數能處理很多數值方面的運算。可以想象,如果沒有這些函數的支持,用戶在編寫有關數值運算方面的代碼時將會困難重重,舉個例子,如果沒有 ABS 函數的話,如果要取一個數值的絕對值,就需要進行好多次判斷 才能返回這個值,而數字函數能夠大大提高用戶的工作效率。表 2 中列出了在 MySQL 中 會經常使用的數值函數。

表 2 MySQL 中的常用數值函數

函數 功能
ABS(x) 返回 x 的絕對值
CEIL(x) 返回大於 x 的最大整數值
FLOOR(x) 返回小於 x 的最大整數值
MOD(x,y) 返回 x/y 的模
RAND() 返回 0 到 1 內的隨機值
ROUND(x,y) 返回參數 x 的四捨五入的有 y 位小數的值
TRUNCATE(x,y) 返回數字 x 截斷爲 y 位小數的結果

下面將結合實例對這些函數進行介紹。
ABS(x)函數:返回 x 的絕對值。
下例中顯示了對正數和負數分別取絕對值之後的結果。

mysql> select ABS(-0.8) ,ABS(0.8);
+-----------+----------+
| ABS(-0.8) | ABS(0.8) |
+-----------+----------+
| 0.8 | 0.8 |
+-----------+----------+
1 row in set (0.09 sec)

CEIL(x)函數:返回大於 x 的最大整數。
下例中顯示了對 0.8 和-0.8 分別 CEIL 後的結果。

mysql> select CEIL(-0.8),CEIL(0.8);
+------------+-----------+
| CEIL(-0.8) | CEIL(0.8) |
+------------+-----------+
| 0 | 1 |
+------------+-----------+
1 row in set (0.03 sec)

FLOOR(x)函數:返回小於 x 的最大整數,和 CEIL 的用法剛好相反。
下例中顯示了對 0.8 和-0.8 分別 FLOOR 後的結果。

mysql> select FLOOR(-0.8), FLOOR(0.8);
+-------------+------------+
| FLOOR(-0.8) | FLOOR(0.8) |
+-------------+------------+
| -1 | 0 |
+-------------+------------+
1 row in set (0.00 sec) 

MOD(x,y)函數:返回 x/y 的模。
和 x%y 的結果相同,模數和被模數任何一個爲 NULL 結果都爲 NULL。如下例所示:

mysql> select MOD(15,10),MOD(1,11),MOD(NULL,10);
+------------+-----------+--------------+
| MOD(15,10) | MOD(1,11) | MOD(NULL,10) |
+------------+-----------+--------------+
| 5 | 1 | NULL |
+------------+-----------+--------------+
1 row in set (0.00 sec)

RAND()函數:返回 0 到 1 內的隨機值。
每次執行結果都不一樣,如下例所示:

mysql> select RAND(),RAND();
+------------------+------------------+
| RAND() | RAND() |
+------------------+------------------+
| 0.12090325459922 | 0.83369727882901 |
+------------------+------------------+
1 row in set (0.00 sec)

利用此函數可以取任意指定範圍內的隨機數,比如需要產生 0~100 內的任意隨機整數,可以操作如下:

mysql> select ceil(100*rand()),ceil(100*rand());
+------------------+------------------+
| ceil(100*rand()) | ceil(100*rand()) |
+------------------+------------------+
| 91 | 15 |
+------------------+------------------+
1 row in set (0.00 sec)

ROUND(x,y)函數:返回參數 x 的四捨五入的有 y 位小數的值。
如果是整數,將會保留 y 位數量的 0;如果不寫 y,則默認 y 爲 0,即將 x 四捨五入後取整。 適合於將所有數字保留同樣小數位的情況。如下例所示。

mysql> select ROUND(1.1),ROUND(1.1,2),ROUND(1,2);
+------------+--------------+------------+
| ROUND(1.1) | ROUND(1.1,2) | ROUND(1,2) |
+------------+--------------+------------+
| 1 | 1.10 | 1.00 |
+------------+--------------+------------+
1 row in set (0.00 sec)

TRUNCATE(x,y)函數:返回數字 x 截斷爲 y 位小數的結果。
注意 TRUNCATE 和 ROUND 的區別在於 TRUNCATE 僅僅是截斷,而不進行四捨五入。下例中 描述了二者的區別:

mysql> select ROUND(1.235,2),TRUNCATE(1.235,2);
+----------------+-------------------+
| ROUND(1.235,2) | TRUNCATE(1.235,2) |
+----------------+-------------------+
| 1.24 | 1.23 |
+----------------+-------------------+
1 row in set (0.00 sec)

3 日期和時間函數

有時我們可能會遇到這樣的需求:當前時間是多少、下個月的今天是星期幾、統計截止到當 前日期前 3 天的收入總和等。這些需求就需要日期和時間函數來實現,表 3 列出了 MySQL 中支持的一些常用日期和時間函數。

表 3 MySQL 中的常用日期時間函數

函數 功能
CURDATE() 返回當前日期
CURTIME() 返回當前時間
NOW() 返回當前的日期和時間
UNIX_TIMESTAMP(date) 返回日期 date 的 UNIX 時間戳
FROM_UNIXTIME 返回 UNIX 時間戳的日期值
WEEK(date) 返回日期 date 爲一年中的第幾周
YEAR(date) 返回日期 date 的年份
HOUR(time) 返回 time 的小時值
MINUTE(time) 返回 time 的分鐘值
MONTHNAME(date) 返回 date 的月份名
DATE_FORMAT(date,fmt) 返回按字符串 fmt 格式化日期 date 值
DATE_ADD(date,INTERVAL expr type) 返回一個日期或時間值加上一個時間間隔的時間值
DATEDIFF(expr,expr2) 返回起始時間 expr 和結束時間 expr2 之間的天數

下面結合一些實例來逐個講解每個函數的使用方法。
CURDATE()函數:返回當前日期,只包含年月日。

mysql> select CURDATE(); 
+------------+
| CURDATE() |
+------------+
| 2007-07-11 |
+------------+
1 row in set (0.03 sec)

CURTIME()函數:返回當前時間,只包含時分秒。

mysql> select CURTIME();
+-----------+
| CURTIME() |
+-----------+
| 14:13:46 |
+-----------+
1 row in set (0.00 sec)

NOW()函數:返回當前的日期和時間,年月日時分秒全都包含。

mysql> select NOW();
+---------------------+
| NOW() |
+---------------------+
| 2007-07-11 14:14:06 |
+---------------------+
1 row in set (0.00 sec)

UNIX_TIMESTAMP(date)函數:返回日期 date 的 UNIX 時間戳。

mysql> select UNIX_TIMESTAMP(now());
+-----------------------+
| UNIX_TIMESTAMP(now()) |
+-----------------------+
| 1184134516 |
+-----------------------+
1 row in set (0.02 sec)

FROM_UNIXTIME ( unixtime ) 函 數 : 返 回 UNIXTIME時間戳的日期值 ,和UNIX_TIMESTAMP(date)互爲逆操作。

mysql> select FROM_UNIXTIME(1184134516) ;
+---------------------------+
| FROM_UNIXTIME(1184134516) |
+---------------------------+
| 2007-07-11 14:15:16 |
+---------------------------+
1 row in set (0.00 sec)

WEEK(DATE)和 YEAR(DATE)函數:前者返回所給的日期是一年中的第幾周,後者返回所給的日期是哪一年。

mysql> select WEEK(now()),YEAR(now());
+-------------+-------------+
| WEEK(now()) | YEAR(now()) |
+-------------+-------------+
| 27 | 2007 |
+-------------+-------------+
1 row in set (0.02 sec)

HOUR(time)和 MINUTE(time)函數:前者返回所給時間的小時,後者返回所給時間的分鐘。

mysql> select HOUR(CURTIME()),MINUTE(CURTIME());
+-----------------+-------------------+
| HOUR(CURTIME()) | MINUTE(CURTIME()) |
+-----------------+-------------------+
| 14 | 18 |
+-----------------+-------------------+
1 row in set (0.00 sec)

MONTHNAME(date)函數:返回 date 的英文月份名稱。

mysql> select MONTHNAME(now());
+------------------+
| MONTHNAME(now()) |
+------------------+
| July |
+------------------+
1 row in set (0.00 sec)

DATE_FORMAT(date,fmt)函數:按字符串 fmt 格式化日期 date 值,此函數能夠按指定的格式顯示日期,可以用到的格式符如表 4 所示。

表 4 MySQL 中的日期時間格式

格式符 格式說明 格式符 格式說明
|–|--|–|--|
%S,%s 兩位數字形式的秒(00,01,…,59) %i 兩位數字形式的分(00,01,…,59)
%h,%I 兩位數字形式的小時,12 小時(01,02,…,12) %H 兩位數字形式的小時,24 小時(00,01,…,23)
%k 數字形式的小時,24 小時(0,1,…,23) %j 以 3 位數字表示年中的天數(001,002,…,366)
%l 數字形式的小時,12 小時(1,2,…,12) %p AM 或 PM
%T 24 小時的時間形式(hh:mm:ss) %b 縮寫的月名(January,February,…,December)
%r 12 小時的時間形式(hh:mm:ssAM 或 hh:mm:ssPM) %c 數字表示的月份(1,2,…,12)
%u 周(0,1,52),其中 Monday 爲週中的第一天 %U 周(0,1,52),其中 Sunday 爲週中的第一天
%d 兩位數字表示月中的天數(00,01,…,31) %D 英文後綴表示月中的天數(1st,2nd,3rd,…)
%e 數字形式表示月中的天數(1,2,…,31) %% 直接值“%”
%y 兩位數字表示的年份 %Y 4 位數字表示的年份
%m 兩位數字表示的月份(01,02,…,12) %M 月名(January,February,…,December)
%w 以數字形式表示週中的天數(0=Sunday,1=Monday,…,6=Saturday) %W 一週中每一天的名稱(Sunday,Monday,…,Saturday)
%a 一週中每一天名稱的縮寫(Sun,Mon,…,Sat)
下面的例子將當前時間顯示爲“月,日,年”格式:

mysql> select DATE_FORMAT(now(),'%M,%D,%Y');
+-------------------------------+
| DATE_FORMAT(now(),'%M,%D,%Y') |
+-------------------------------+
| July,11th,2007 |
+-------------------------------+
1 row in set (0.00 sec)

DATE_ADD(date,INTERVAL expr type)函數:返回與所給日期 date 相差 INTERVAL 時間段的日期。
其中 INTERVAL 是間隔類型關鍵字,expr 是一個表達式,這個表達式對應後面的類型,type 是間隔類型,MySQL 提供了 13 種間隔類型,如表 5 所示。

表 5 MySQL 中的日期間隔類型

表達式類型 描述 格式
HOUR 小時 hh
MINUTE mm
SECOND ss
YEAR YY
MONTH MM
DAY DD
YEAR_MONTH 年和月 YY-MM
DAY_HOUR 日和小時 DD hh
DAY_MINUTE 日和分鐘 DD hh:mm
DAY_ SECOND 日和秒 DD hh:mm:ss
HOUR_MINUTE 小時和分 hh:mm
HOUR_SECOND 小時和秒 hh:ss
MINUTE_SECOND 分鐘和秒 mm:ss

來看一個具體的例子,在這個例子中第 1 列返回了當前日期時間,第 2 列返回距離當前日期31 天后的日期時間,第 3 列返回距離當前日期一年兩個月後的日期時間。

mysql> select now() current,date_add(now(),INTERVAL 31 day) after31days,
date_add(now(),INTERVAL '1_2' year_month) after_oneyear_twomonth;
+---------------------+---------------------+------------------------+
| current | after31days | after_oneyear_twomonth |
+---------------------+---------------------+------------------------+
| 2007-09-03 11:30:48 | 2007-10-04 11:30:48 | 2008-11-03 11:30:48 |
+---------------------+---------------------+------------------------+
1 row in set (0.01 sec)

同樣也可以用負數讓它返回之前的某個日期時間,如下第 1 列返回了當前日期時間,第 2列返回距離當前日期 31 天前的日期時間,第 3 列返回距離當前日期一年兩個月前的日期時間。

mysql> select now() current,date_add(now(),INTERVAL -31 day) after31days,date_a
dd(now(),INTERVAL '-1_-2' year_month) after_oneyear_twomonth;
+---------------------+---------------------+------------------------+
| current | after31days | after_oneyear_twomonth |
+---------------------+---------------------+------------------------+
| 2007-09-03 11:36:35 | 2007-08-03 11:36:35 | 2006-07-03 11:36:35 |
+---------------------+---------------------+------------------------+
1 row in set (0.00 sec)

DATEDIFF(date1,date2)函數:用來計算兩個日期之間相差的天數。
下面的例子計算出當前距離 2008 年 8 月 8 日的奧運會開幕式還有多少天:

mysql> select DATEDIFF('2008-08-08',now());
+------------------------------+
| DATEDIFF('2008-08-08',now()) |
+------------------------------+
| 328 |
+------------------------------+
1 row in set (0.01 sec)

4 流程函數

流程函數也是很常用的一類函數,用戶可以使用這類函數在一個 SQL 語句中實現條件選擇, 這樣做能夠提高語句的效率。表 6 列出了 MySQL 中跟條件選擇有關的流程函數,下面將 通過具體的實例來講解每個函數的用法。
表6 MySQL 中的流程函數

函數 功能
IF(value,t f) 如果 value 是真,返回 t;否則返回 f
IFNULL(value1,value2) 如果 value1 不爲空返回 value1,否則返回 value2
CASE WHEN [value1]
THEN[result1]…ELSE[default]END 如果 value1 是真,返回 result1,否則返回 default
CASE [expr] WHEN [value1] THEN[result1]…ELSE[default]END 如果 expr 等於 value1,返回 result1,否則返回 default

下面的例子中模擬了對職員薪水進行分類,這裏首先創建並初始化一個職員薪水錶:

mysql> create table salary (userid int,salary decimal(9,2));
Query OK, 0 rows affected (0.06 sec)

插入一些測試數據:

mysql> insert into salary values(1,1000),(2,2000), (3,3000),(4,4000),(5,5000), (1,null);
Query OK, 6 rows affected (0.00 sec)
mysql> select * from salary;
+--------+---------+
| userid | salary |
+--------+---------+
| 1 | 1000.00 |
| 2 | 2000.00 |
| 3 | 3000.00 |
| 4 | 4000.00 |
| 5 | 5000.00 |
| 1 | NULL |
+--------+---------+
6 rows in set (0.00 sec)

接下來,通過這個表來介紹各個函數的應用。
IF(value,t,f)函數:我們認爲月薪在 2000 元以上的職員屬於高薪,用“high”表示;而2000 元以下的職員屬於低薪,用“low”表示。

mysql> select if(salary>2000,'high','low') from salary;
+------------------------------+
| if(salary>2000,'high','low') |
+------------------------------+
| low |
| low |
| high |
| high |
| high |
+------------------------------+
5 rows in set (0.01 sec)

IFNULL(value1,value2)函數:這個函數一般用來替換 NULL 值的,我們知道 NULL 值是不能參與數值運算的,下面這個語句就是把 NULL 值用 0 來替換。

mysql> select ifnull(salary,0) from salary;
+------------------+
| ifnull(salary,0) |
+------------------+
| 1000.00 |
| 2000.00 |
| 3000.00 |
| 4000.00 |
| 5000.00 |
| 0.00 |
+------------------+
6 rows in set (0.00 sec)

CASE WHEN [value1] THEN[result1]…ELSE[default]END 函數 :我們也可以用 case when…then 函數實現上面例子中高薪低薪的問題。

mysql> select case when salary<=2000 then 'low' else 'high' end from salary; 
+---------------------------------------------------+
| case when salary<=2000 then 'low' else 'high' end |
+---------------------------------------------------+
| low |
| low |
| high |
| high |
| high |
| high |
+---------------------------------------------------+
6 rows in set (0.00 sec)

CASE [expr] WHEN [value1] THEN[result1]…ELSE[default]END 函數:這裏還可以分多種情況把職員的薪水分多個檔次,比如下面的例子分成高、中、低 3 種情況。同樣還可以分成更多種情 況,這裏就不再舉例了,有興趣的讀者可以自己測試一下。

mysql> select case salary when 1000 then 'low' when 2000 then 'mid' else 'high' end from
salary;
+-----------------------------------------------------------------------+
| case salary when 1000 then 'low' when 2000 then 'mid' else 'high' end |
+-----------------------------------------------------------------------+
| low |
| mid |
| high |
| high |
| high |
| high |
+-----------------------------------------------------------------------+
6 rows in set (0.00 sec)

5 其他常用函數

MySQL 提供的函數很豐富,除了前面介紹的字符串函數、數字函數、日期函數、流程函數 以外還有很多其他函數,在此不再一一列舉,有興趣的讀者可以參考 MySQL 官方手冊。表7 列舉了一些其他常用的函數。

表7 MySQL 中的其他常用函數

函數 功能
DATABASE() 返回當前數據庫名
VERSION() 返回當前數據庫版本
USER() 返回當前登錄用戶名
INET_ATON(IP) 返回 IP 地址的數字表示
INET_NTOA(num) 返回數字代表的 IP 地址
PASSWORD(str) 返回字符串 str 的加密版本
MD5() 返回字符串 str 的 MD5 值

下面結合實例簡單介紹一下這些函數的用法。
DATABASE()函數:返回當前數據庫名。

mysql> select DATABASE();
+------------+
| DATABASE() |
+------------+
| test |
+------------+
1 row in set (0.00 sec)

VERSION()函數:返回當前數據庫版本。

mysql> select VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.0.18-nt |
+-----------+
1 row in set (0.00 sec)

USER()函數:返回當前登錄用戶名。

mysql> select USER();
+----------------+
| USER() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.03 sec)

INET_ATON(IP)函數:返回 IP 地址的網絡字節序表示。

mysql> select INET_ATON('192.168.1.1');
+--------------------------+
| INET_ATON('192.168.1.1') |
+--------------------------+
| 3232235777 |
+--------------------------+
1 row in set (0.00 sec)

INET_NTOA(num)函數:返回網絡字節序代表的 IP 地址。

mysql> select INET_NTOA(3232235777);
+-----------------------+
| INET_NTOA(3232235777) |
+-----------------------+
| 192.168.1.1 |
+-----------------------+
1 row in set (0.00 sec)

INET_ATON(IP)和 INET_NTOA(num)函數主要的用途是將字符串的 IP 地址轉換爲數字表示的網絡字節序,這樣可以更方便地進行 IP 或者網段的比較。比如在下面的表 t 中,要想知道在“192.168.1.3”和“192.168.1.20”之間一共有多少 IP 地址:

mysql> select * from t;
+--------------+
| ip |
+--------------+
| 192.168.1.1 |
| 192.168.1.3 |
| 192.168.1.6 |
| 192.168.1.10 |
| 192.168.1.20 |
| 192.168.1.30 |
+--------------+
6 rows in set (0.00 sec)

按照正常的思維,應該用字符串來進行比較,下面是字符串的比較結果:

mysql> select * from t where ip>='192.168.1.3' and ip<='192.168.1.20';
Empty set (0.01 sec)

結果沒有如我們所願,竟然是個空集。其實原因就在於字符串的比較是一個字符一個字符的
比較,當對應字符相同時候,就比較下一個,直到遇到能區分出大小的字符,才停止比較, 後面的字符也將忽略。顯然,在此例中,“192.168.1.3”其實比“192.168.1.20”要“大”, 因爲“ 3” 比“ 2 ” 大, 而不能用我們日常的思維 3<20 , 所以“ ip>=‘192.168.1.3’ and ip<=‘192.168.1.20’”必然是個空集。
在這裏,如果要想實現上面的功能,就可用函數 INET_ATON 來實現,將 IP 轉換爲字節序後 再比較,如下所示:

mysql> select * from t where inet_aton(ip)>=inet_aton('192.168.1.3') and
inet_aton(ip)<=inet_aton('192.168.1.20');
+--------------+
| ip |
+--------------+
| 192.168.1.3 |
| 192.168.1.6 |
| 192.168.1.10 |
| 192.168.1.20 |
+--------------+
4 rows in set (0.00 sec)

結果完全符合我們的要求。
PASSWORD(str)函數:返回字符串 str 的加密版本,一個 41 位長的字符串。 此函數只用來設置系統用戶的密碼,但是不能用來對應用的數據加密。如果應用方面有加密 的需求,可以使用 MD5 等加密函數來實現。
下例中顯示了字符串“123456”的 PASSWORD 加密後的值:

mysql> select PASSWORD('123456');
+-------------------------------------------+
| PASSWORD('123456') |
+-------------------------------------------+
| *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-------------------------------------------+
1 row in set (0.08 sec)

MD5(str)函數:返回字符串 str 的 MD5 值,常用來對應用中的數據進行加密。
下例中顯示了字符串“123456”的 MD5 值:

mysql> select MD5('123456');
+----------------------------------+
| MD5('123456') |
+----------------------------------+
| e10adc3949ba59abbe56e057f20f883e |
+----------------------------------+
1 row in set (0.06 sec)

超全面的測試IT技術課程,0元立即加入學習!有需要的朋友戳:


騰訊課堂測試技術學習地址

歡迎轉載,但未經作者同意請保留此段聲明,並在文章頁面明顯位置給出原文鏈接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章