- 論壇徽章:
- 0
|
mysql自動增長類型的問題... 1
mysql常用日期函數(shù)... 2
mysql的日期和時間函數(shù)... 11
使用distinct在mysql中查詢多條不重復(fù)記錄值的解決辦法... 19
數(shù)據(jù)庫連接過多的錯誤,可能的原因分析及解決辦法... 22
mysql的字符串函數(shù)... 23
Mysql字段長度... 30
MySQL中各種字段的取值范圍... 31
mysql自動增長類型的問題
id mediumint(8) UNSIGNED NOT NULL auto_increment,
這樣是從1開始我想從5000001開始
請問應(yīng)該怎么寫
CREATE TABLE test1
(
a INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (a)
)
TYPE=MyISAM AUTO_INCREMENT=5000001;
INSERT INTO test1 VALUES(null);
SELECT * FROM test1;
如果這個已經(jīng)建好了,里面也有數(shù)據(jù)了 那我怎樣修改呀
兩個方法:
A)
ALTER TABLE `test1` AUTO_INCREMENT=5000001;
B)
手動的插入一條ID = 5000000 的記錄,然后刪除它
mysql常用日期函數(shù)
1:mysql常用日期函數(shù)
這里是一個使用日期函數(shù)的例子。下面的查詢選擇了所有記錄,其date_col的值是在最后30天以內(nèi):
mysql> SELECT something FROM table
WHERE TO_DAYS(NOW()) - TO_DAYS(date_col)
DAYOFWEEK(date)
返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六)。這些索引值對應(yīng)于ODBC標(biāo)準(zhǔn)。
mysql> select DAYOFWEEK(’1998-02-03’);
-> 3
WEEKDAY(date)
返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。
mysql> select WEEKDAY(’1997-10-04 22:23:00’);
-> 5
mysql> select WEEKDAY(’1997-11-05’);
-> 2
DAYOFMONTH(date)
返回date的月份中日期,在1到31范圍內(nèi)。
mysql> select DAYOFMONTH(’1998-02-03’);
-> 3
DAYOFYEAR(date)
返回date在一年中的日數(shù), 在1到366范圍內(nèi)。
mysql> select DAYOFYEAR(’1998-02-03’);
-> 34
MONTH(date)
返回date的月份,范圍1到12。
mysql> select MONTH(’1998-02-03’);
-> 2
DAYNAME(date)
返回date的星期名字。
mysql> select DAYNAME("1998-02-05");
-> ’Thursday’
MONTHNAME(date)
返回date的月份名字。
mysql> select MONTHNAME("1998-02-05");
-> ’February’
QUARTER(date)
返回date一年中的季度,范圍1到4。
mysql> select QUARTER(’98-04-01’);
-> 2
WEEK(date)
WEEK(date,first)
對于星期天是一周的
第一天
的地方,有一個單個參數(shù),返回date的周數(shù),范圍在0到52。2個參數(shù)形式WEEK()允許
你指定星期是否開始于星期天或星期一。如果第二個參數(shù)是0,星期從星期天開始,如果第二個參數(shù)是1,
從星期一開始。
mysql> select WEEK(’1998-02-20’);
-> 7
mysql> select WEEK(’1998-02-20’,0);
-> 7
mysql> select WEEK(’1998-02-20’,1);
-> 8
YEAR(date)
返回date的年份,范圍在1000到9999。
mysql> select YEAR(’98-02-03’);
-> 1998
HOUR(time)
返回time的小時,范圍是0到23。
mysql> select HOUR(’10:05:03’);
-> 10
MINUTE(time)
返回time的分鐘,范圍是0到59。
mysql> select MINUTE(’98-02-03 10:05:03’);
-> 5
SECOND(time)
回來time的秒數(shù),范圍是0到59。
mysql> select SECOND(’10:05:03’);
-> 3
PERIOD_ADD(P,N)
增加N個月到階段P(以格式Y(jié)YMM或YYYYMM)。以格式Y(jié)YYYMM返回值。注意階段參數(shù)P不是日期值。
mysql> select PERIOD_ADD(9801,2);
-> 199803
PERIOD_DIFF(P1,P2)
返回在時期P1和P2之間月數(shù),P1和P2應(yīng)該以格式Y(jié)YMM或YYYYMM。注意,時期參數(shù)P1和P2不是日期值。
mysql> select PERIOD_DIFF(9802,199703);
-> 11
DATE_ADD(date,INTERVAL expr type)
DATE_SUB(date,INTERVAL expr type)
ADDDATE(date,INTERVAL expr type)
SUBDATE(date,INTERVAL expr type)
這些功能執(zhí)行日期運(yùn)算。對于MySQL 3.22,他們是新的。ADDDATE()和SUBDATE()是DATE_ADD()和DATE_SUB()的同義詞。
在MySQL 3.23中,你可以使用+和-而不是DATE_ADD()和DATE_SUB()。(見例子)date是一個指定開始日期的
DATETIME或DATE值,expr是指定加到開始日期或從開始日期減去的間隔值一個表達(dá)式,expr是一個字符串;它可以以
一個“-”開始表示負(fù)間隔。type是一個關(guān)鍵詞,指明表達(dá)式應(yīng)該如何被解釋。EXTRACT(type FROM date)函數(shù)從日期
中返回“type”間隔。下表顯示了type和expr參數(shù)怎樣被關(guān)聯(lián): type值 含義 期望的expr格式
SECOND 秒 SECONDS
MINUTE 分鐘 MINUTES
HOUR 時間 HOURS
DAY 天 DAYS
MONTH 月 MONTHS
YEAR 年 YEARS
MINUTE_SECOND 分鐘和秒 "MINUTES:SECONDS"
HOUR_MINUTE 小時和分鐘 "HOURS:MINUTES"
DAY_HOUR 天和小時 "DAYS HOURS"
YEAR_MONTH 年和月 "YEARS-MONTHS"
HOUR_SECOND 小時, 分鐘, "HOURS:MINUTES:SECONDS"
DAY_MINUTE 天, 小時, 分鐘 "DAYS HOURS:MINUTES"
DAY_SECOND 天, 小時, 分鐘, 秒 "DAYS HOURS:MINUTES:SECONDS"
MySQL在expr格式中允許任何標(biāo)點(diǎn)分隔符。表示顯示的是建議的分隔符。如果date參數(shù)是一個DATE值并且你的計算僅僅
包含YEAR、MONTH和DAY部分(即,沒有時間部分),結(jié)果是一個DATE值。否則結(jié)果是一個DATETIME值。
mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND;
-> 1998-01-01 00:00:00
mysql> SELECT INTERVAL 1 DAY + "1997-12-31";
-> 1998-01-01
mysql> SELECT "1998-01-01" - INTERVAL 1 SECOND;
-> 1997-12-31 23:59:59
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
INTERVAL 1 SECOND);
-> 1998-01-01 00:00:00
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
INTERVAL 1 DAY);
-> 1998-01-01 23:59:59
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
INTERVAL "1:1" MINUTE_SECOND);
-> 1998-01-01 00:01:00
mysql> SELECT DATE_SUB("1998-01-01 00:00:00",
INTERVAL "1 1:1:1" DAY_SECOND);
-> 1997-12-30 22:58:59
mysql> SELECT DATE_ADD("1998-01-01 00:00:00",
INTERVAL "-1 10" DAY_HOUR);
-> 1997-12-30 14:00:00
mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY);
-> 1997-12-02
mysql> SELECT EXTRACT(YEAR FROM "1999-07-02");
-> 1999
mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");
-> 199907
mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");
-> 20102
如果你指定太短的間隔值(不包括type關(guān)鍵詞期望的間隔部分),MySQL假設(shè)你省掉了間隔值的最左面部分。例如,
如果你指定一個type是DAY_SECOND,值expr被
希望
有天、小時、分鐘和秒部分。如果你象"1:10"這樣指定值,
MySQL假設(shè)日子和小時部分是丟失的并且值代表分鐘和秒。換句話說,"1:10" DAY_SECOND以它等價于"1:10" MINUTE_SECOND
的方式解釋,這對那MySQL解釋TIME值表示經(jīng)過的時間而非作為一天的時間的方式有二義性。如果你使用確實(shí)不正確的日期,
結(jié)果是NULL。如果你增加MONTH、YEAR_MONTH或YEAR并且結(jié)果日期大于新月份的最大值天數(shù),日子在新月用最大的天調(diào)整。
mysql> select DATE_ADD(’1998-01-30’, Interval 1 month);
-> 1998-02-28
注意,從前面的例子中詞INTERVAL和type關(guān)鍵詞不是區(qū)分大小寫的。
TO_DAYS(date)
給出一個日期date,返回一個天數(shù)(從0年的天數(shù))。
mysql> select TO_DAYS(950501);
-> 728779
mysql> select TO_DAYS(’1997-10-07’);
-> 729669
TO_DAYS()不打算用于使用格列高里歷(1582)出現(xiàn)前的值。
FROM_DAYS(N)
給出一個天數(shù)N,返回一個DATE值。
mysql> select FROM_DAYS(729669);
-> ’1997-10-07’
TO_DAYS()不打算用于使用格列高里歷(1582)出現(xiàn)前的值。
DATE_FORMAT(date,format)
根據(jù)format字符串格式化date值。下列修飾符可以被用在format字符串中: %M 月名字(January……December)
%W 星期名字(Sunday……Saturday)
%D 有英語前綴的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 數(shù)字, 4 位
%y 年, 數(shù)字, 2 位
%a 縮寫的星期名字(Sun……Sat)
%d 月份中的天數(shù), 數(shù)字(00……31)
%e 月份中的天數(shù), 數(shù)字(0……31)
%m 月, 數(shù)字(01……12)
%c 月, 數(shù)字(1……12)
%b 縮寫的月份名字(Jan……Dec)
%j 一年中的天數(shù)(001……366)
%H 小時(00……23)
%k 小時(0……23)
%h 小時(01……12)
%I 小時(01……12)
%l 小時(1……12)
%i 分鐘, 數(shù)字(00……59)
%r 時間,12 小時(hh:mm:ss [AP]M)
%T 時間,24 小時(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一個星期中的天數(shù)(0=Sunday ……6=Saturday )
%U 星期(0……52), 這里星期天是星期的
第一天
%u 星期(0……52), 這里星期一是星期的
第一天
%% 一個文字“%”。
所有的其他字符不做解釋被復(fù)制到結(jié)果中。
mysql> select DATE_FORMAT(’1997-10-04 22:23:00’, ’%W %M %Y’);
-> ’Saturday October 1997’
mysql> select DATE_FORMAT(’1997-10-04 22:23:00’, ’%H:%i:%s’);
-> ’22:23:00’
mysql> select DATE_FORMAT(’1997-10-04 22:23:00’,
’%D %y %a %d %m %b %j’);
-> ’4th 97 Sat 04 10 Oct 277’
mysql> select DATE_FORMAT(’1997-10-04 22:23:00’,
’%H %k %I %r %T %S %w’);
-> ’22 22 10 10:23:00 PM 22:23:00 00 6’
MySQL3.23中,在格式修飾符字符前需要%。在MySQL更早的版本中,%是可選的。
TIME_FORMAT(time,format)
這象上面的DATE_FORMAT()函數(shù)一樣使用,但是format字符串只能包含處理小時、分鐘和秒的那些格式修飾符。
其他修飾符產(chǎn)生一個NULL值或0。
CURDATE()
CURRENT_DATE
以’YYYY-MM-DD’或YYYYMMDD格式返回
今天
日期值,取決于函數(shù)是在一個字符串還是數(shù)字上下文被使用。
mysql> select CURDATE();
-> ’1997-12-15’
mysql> select CURDATE() + 0;
-> 19971215
CURTIME()
CURRENT_TIME
以’HH:MM:SS’或HHMMSS格式返回當(dāng)前時間值,取決于函數(shù)是在一個字符串還是在數(shù)字的上下文被使用。
mysql> select CURTIME();
-> ’23:50:26’
mysql> select CURTIME() + 0;
-> 235026
NOW()
SYSDATE()
CURRENT_TIMESTAMP
以’YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS格式返回當(dāng)前的日期和時間,取決于函數(shù)是在一個字符串還是在數(shù)字的
上下文被使用。
mysql> select NOW();
-> ’1997-12-15 23:50:26’
mysql> select NOW() + 0;
-> 19971215235026
UNIX_TIMESTAMP()
UNIX_TIMESTAMP(date)
如果沒有參數(shù)調(diào)用,返回一個Unix時間戳記(從’1970-01-01 00:00:00’GMT開始的秒數(shù))。如果UNIX_TIMESTAMP()用一
個date參數(shù)被調(diào)用,它返回從’1970-01-01 00:00:00’ GMT開始的秒數(shù)值。date可以是一個DATE字符串、一個DATETIME
字符串、一個TIMESTAMP或以YYMMDD或YYYYMMDD格式的本地時間的一個數(shù)字。
mysql> select UNIX_TIMESTAMP();
-> 882226357
mysql> select UNIX_TIMESTAMP(’1997-10-04 22:23:00’);
-> 875996580
當(dāng)UNIX_TIMESTAMP被用于一個TIMESTAMP列,函數(shù)將直接接受值,沒有隱含的“string-to-unix-timestamp”變換。
FROM_UNIXTIME(unix_timestamp)
以’YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS格式返回unix_timestamp參數(shù)所表示的值,取決于函數(shù)是在一個字符串
還是或數(shù)字上下文中被使用。
mysql> select FROM_UNIXTIME(875996580);
-> ’1997-10-04 22:23:00’
mysql> select FROM_UNIXTIME(875996580) + 0;
-> 19971004222300
FROM_UNIXTIME(unix_timestamp,format)
返回表示 Unix 時間標(biāo)記的一個字符串,根據(jù)format字符串格式化。format可以包含與DATE_FORMAT()函數(shù)列出的條
目同樣的修飾符。
mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(),
’%Y %D %M %h:%i:%s %x’);
-> ’1997 23rd December 03:43:30 x’
SEC_TO_TIME(seconds)
返回seconds參數(shù),變換成小時、分鐘和秒,值以’HH:MM:SS’或HHMMSS格式化,取決于函數(shù)是在一個字符串還是在數(shù)字
上下文中被使用。
mysql> select SEC_TO_TIME(2378);
-> ’00:39:38’
mysql> select SEC_TO_TIME(2378) + 0;
-> 3938
TIME_TO_SEC(time)
返回time參數(shù),轉(zhuǎn)換成秒。
mysql> select TIME_TO_SEC(’22:23:00’);
-> 80580
mysql> select TIME_TO_SEC(’00:39:38’);
-> 2378
mysql的日期和時間函數(shù)
mysql的日期和時間函數(shù)
這里是一個使用日期函數(shù)的例子。下面的查詢選擇所有 date_col 值在最后 30 天內(nèi)的記錄。
mysql> SELECT something FROM tbl_name
WHERE TO_DAYS(NOW()) - TO_DAYS(date_col)
DAYOFWEEK(date)
返回 date 的星期索引(1 = Sunday, 2 = Monday, ... 7 = Saturday)。索引值符合 ODBC 的標(biāo)準(zhǔn)。
mysql> SELECT DAYOFWEEK('1998-02-03');
-> 3
WEEKDAY(date)
返回 date 的星期索引(0 = Monday, 1 = Tuesday, ... 6 = Sunday):
mysql> SELECT WEEKDAY('1998-02-03 22:23:00');
-> 1
mysql> SELECT WEEKDAY('1997-11-05');
-> 2
DAYOFMONTH(date)
返回 date 是一月中的第幾天,范圍為 1 到 31:
mysql> SELECT DAYOFMONTH('1998-02-03');
-> 3
DAYOFYEAR(date)
返回 date 是一年中的第幾天,范圍為 1 到 366:
mysql> SELECT DAYOFYEAR('1998-02-03');
-> 34
MONTH(date)
返回 date 中的月份,范圍為 1 到 12:
mysql> SELECT MONTH('1998-02-03');
-> 2
DAYNAME(date)
返回 date 的星期名:
mysql> SELECT DAYNAME("1998-02-05");
-> 'Thursday'
MONTHNAME(date)
返回 date 的月份名:
mysql> SELECT MONTHNAME("1998-02-05");
-> 'February'
QUARTER(date)
返回 date 在一年中的季度,范圍為 1 到 4:
mysql> SELECT QUARTER('98-04-01');
-> 2
WEEK(date)
WEEK(date,first)
對于星期日是一周中的第一天的場合,如果函數(shù)只有一個參數(shù)調(diào)用,返回 date 為一年的第幾周,返回值范圍為 0 到 53 (是的,可能有第 53 周的開始)。兩個參數(shù)形式的 WEEK() 允許你指定一周是否以星期日或星期一開始,以及返回值為 0-53 還是 1-52。 這里的一個表顯示第二個參數(shù)是如何工作的: 值 含義
0 一周以星期日開始,返回值范圍為 0-53
1 一周以星期一開始,返回值范圍為 0-53
2 一周以星期日開始,返回值范圍為 1-53
3 一周以星期一開始,返回值范圍為 1-53 (ISO 8601)
mysql> SELECT WEEK('1998-02-20');
-> 7
mysql> SELECT WEEK('1998-02-20',0);
-> 7
mysql> SELECT WEEK('1998-02-20',1);
-> 8
mysql> SELECT WEEK('1998-12-31',1);
-> 53
注意,在版本 4.0 中,WEEK(#,0) 被更改為匹配 USA 歷法。 注意,如果一周是上一年的最后一周,當(dāng)你沒有使用 2 或 3 做為可選參數(shù)時,MySQL 將返回 0:
mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);
-> 2000, 0
mysql> SELECT WEEK('2000-01-01',2);
-> 52
你可能會爭辯說,當(dāng)給定的日期值實(shí)際上是 1999 年的第 52 周的一部分時,MySQL 對 WEEK() 函數(shù)應(yīng)該返回 52。我們決定返回 0 ,是因?yàn)槲覀兿M摵瘮?shù)返回“在指定年份中是第幾周”。當(dāng)與其它的提取日期值中的月日值的函數(shù)結(jié)合使用時,這使得 WEEK() 函數(shù)的用法可靠。 如果你更希望能得到恰當(dāng)?shù)哪?周值,那么你應(yīng)該使用參數(shù) 2 或 3 做為可選參數(shù),或者使用函數(shù) YEARWEEK() :
mysql> SELECT YEARWEEK('2000-01-01');
-> 199952
mysql> SELECT MID(YEARWEEK('2000-01-01'),5,2);
-> 52
YEAR(date)
返回 date 的年份,范圍為 1000 到 9999:
mysql> SELECT YEAR('98-02-03');
-> 1998
YEARWEEK(date)
YEARWEEK(date,first)
返回一個日期值是的哪一年的哪一周。第二個參數(shù)的形式與作用完全與 WEEK() 的第二個參數(shù)一致。注意,對于給定的日期參數(shù)是一年的第一周或最后一周的,返回的年份值可能與日期參數(shù)給出的年份不一致:
mysql> SELECT YEARWEEK('1987-01-01');
-> 198653
注意,對于可選參數(shù) 0 或 1,周值的返回值不同于 WEEK() 函數(shù)所返回值(0), WEEK() 根據(jù)給定的年語境返回周值。
HOUR(time)
返回 time 的小時值,范圍為 0 到 23:
mysql> SELECT HOUR('10:05:03');
-> 10
MINUTE(time)
返回 time 的分鐘值,范圍為 0 到 59:
mysql> SELECT MINUTE('98-02-03 10:05:03');
-> 5
SECOND(time)
返回 time 的秒值,范圍為 0 到 59:
mysql> SELECT SECOND('10:05:03');
-> 3
PERIOD_ADD(P,N)
增加 N 個月到時期 P(格式為 YYMM 或 YYYYMM)中。以 YYYYMM 格式返回值。 注意,期間參數(shù) P 不是 一個日期值:
mysql> SELECT PERIOD_ADD(9801,2);
-> 199803
PERIOD_DIFF(P1,P2)
返回時期 P1 和 P2 之間的月數(shù)。P1 和 P2 應(yīng)該以 YYMM 或 YYYYMM 指定。 注意,時期參數(shù) P1 和 P2 不是 日期值:
mysql> SELECT PERIOD_DIFF(9802,199703);
-> 11
DATE_ADD(date,INTERVAL expr type)
DATE_SUB(date,INTERVAL expr type)
ADDDATE(date,INTERVAL expr type)
SUBDATE(date,INTERVAL expr type)
這些函數(shù)執(zhí)行日期的算術(shù)運(yùn)算。ADDDATE() 和 SUBDATE() 分別是 DATE_ADD() 和 DATE_SUB() 的同義詞。 在 MySQL 3.23 中,如果表達(dá)式的右邊是一個日期值或一個日期時間型字段,你可以使用 + 和 - 代替 DATE_ADD() 和 DATE_SUB()(示例如下)。 參數(shù) date 是一個 DATETIME 或 DATE 值,指定一個日期的開始。expr 是一個表達(dá)式,指定從開始日期上增加還是減去間隔值。expr 是一個字符串;它可以以一個 “-” 領(lǐng)頭表示一個負(fù)的間隔值。type 是一個關(guān)鍵詞,它標(biāo)志著表達(dá)式以何格式被解釋。 下表顯示 type 和 expr 參數(shù)是如何關(guān)聯(lián)的: type 值 expr 期望的格式
SECOND SECONDS
MINUTE MINUTES
HOUR HOURS
DAY DAYS
MONTH MONTHS
YEAR YEARS
MINUTE_SECOND "MINUTES:SECONDS"
HOUR_MINUTE "HOURS:MINUTES"
DAY_HOUR "DAYS HOURS"
YEAR_MONTH "YEARS-MONTHS"
HOUR_SECOND "HOURS:MINUTES:SECONDS"
DAY_MINUTE "DAYS HOURS:MINUTES"
DAY_SECOND "DAYS HOURS:MINUTES:SECONDS"
在 expr 的格式中,MySQL 允許任何字符作為定界符。表中所顯示的是建議的定界字符。如果 date 參數(shù)是一個 DATE 值,并且計算的間隔僅僅有 YEAR、MONTH 和 DAY 部分(沒有時間部分),那么返回值也是一個 DATE 值。否則返回值是一個 DATETIME 值:
mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND;
-> 1998-01-01 00:00:00
mysql> SELECT INTERVAL 1 DAY + "1997-12-31";
-> 1998-01-01
mysql> SELECT "1998-01-01" - INTERVAL 1 SECOND;
-> 1997-12-31 23:59:59
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
-> INTERVAL 1 SECOND);
-> 1998-01-01 00:00:00
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
-> INTERVAL 1 DAY);
-> 1998-01-01 23:59:59
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
-> INTERVAL "1:1" MINUTE_SECOND);
-> 1998-01-01 00:01:00
mysql> SELECT DATE_SUB("1998-01-01 00:00:00",
-> INTERVAL "1 1:1:1" DAY_SECOND);
-> 1997-12-30 22:58:59
mysql> SELECT DATE_ADD("1998-01-01 00:00:00",
-> INTERVAL "-1 10" DAY_HOUR);
-> 1997-12-30 14:00:00
mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY);
-> 1997-12-02
如果你指定了一個太短的間隔值(沒有包括 type 關(guān)鍵詞所期望的所有間隔部分),MySQL 假設(shè)你遺漏了間隔值的最左邊部分。例如,如果指定一個 type 為 DAY_SECOND,那么 expr 值被期望包含天、小時、分鐘和秒部分。如果你象 "1:10" 樣指定一個值,MySQL 假設(shè)天和小時部分被遺漏了,指定的值代表分鐘和秒。換句話說,"1:10" DAY_SECOND 被解釋為等價于 "1:10" MINUTE_SECOND。這類似于 MySQL 解釋 TIME 值為經(jīng)過的時間而不是一天的時刻。 注意,如果依著包含一個時間部分的間隔增加或減少一個日期值,該日期值將被自動地轉(zhuǎn)換到一個日期時間值:
mysql> SELECT DATE_ADD("1999-01-01", INTERVAL 1 DAY);
-> 1999-01-02
mysql> SELECT DATE_ADD("1999-01-01", INTERVAL 1 HOUR);
-> 1999-01-01 01:00:00
如果你使用了確定不正確的日期,返回結(jié)果將是 NULL。如果你增加 MONTH、YEAR_MONTH 或 YEAR,并且結(jié)果日期的天比新月份的最大天數(shù)還大,那么它將被調(diào)整到新月份的最大天數(shù):
mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH);
-> 1998-02-28
注意,上面的例子中,單詞 INTERVAL 和關(guān)鍵詞 type 是不區(qū)分字母大小寫的。
EXTRACT(type FROM date)
EXTRACT() 函數(shù)使用與 DATE_ADD() 或 DATE_SUB() 一致的間隔類型,但是它用于指定從日期中提取的部分,而不是進(jìn)行日期算術(shù)運(yùn)算。
mysql> SELECT EXTRACT(YEAR FROM "1999-07-02");
-> 1999
mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");
-> 199907
mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");
-> 20102
TO_DAYS(date)
給出一個日期 date,返回一個天數(shù)(從 0 年開始的天數(shù)):
mysql> SELECT TO_DAYS(950501);
-> 728779
mysql> SELECT TO_DAYS('1997-10-07');
-> 729669
TO_DAYS() 無意于使用先于格里高里歷法(即現(xiàn)行的陽歷)(1582)出現(xiàn)的值,因?yàn)樗豢紤]當(dāng)歷法改變時所遺失的天數(shù)。
FROM_DAYS(N)
給出一個天數(shù) N,返回一個 DATE 值:
mysql> SELECT FROM_DAYS(729669);
-> '1997-10-07'
FROM_DAYS() 無意于使用先于格里高里歷法(1582)出現(xiàn)的值,因?yàn)樗豢紤]當(dāng)歷法改變時所遺失的天數(shù)。
DATE_FORMAT(date,format)
依照 format 字符串格式化 date 值。下面的修飾符可被用于 format 字符串中: 修飾符 含義
%M 月的名字 (January..December)
%W 星期的名字 (Sunday..Saturday)
%D 有英文后綴的某月的第幾天 (0th, 1st, 2nd, 3rd, etc.)
%Y 年份,數(shù)字的,4 位
%y 年份,數(shù)字的,2 位
%X 周值的年份,星期日是一個星期的第一天,數(shù)字的,4 位,與 '%V' 一同使用
%x 周值的年份,星期一是一個星期的第一天,數(shù)字的,4 位,與 '%v' 一同使用
%a 縮寫的星期名 (Sun..Sat)
%d 月份中的天數(shù),數(shù)字的 (00..31)
%e 月份中的天數(shù),數(shù)字的 (0..31)
%m 月,數(shù)字的 (00..12)
%c 月,數(shù)字的 (0..12)
%b 縮寫的月份名 (Jan..Dec)
%j 一年中的天數(shù) (001..366)
%H 小時 (00..23)
%k 小時 (0..23)
%h 小時 (01..12)
%I 小時 (01..12)
%l 小時 (1..12)
%i 分鐘,數(shù)字的 (00..59)
%r 時間,12 小時 (hh:mm:ss [AP]M)
%T 時間,24 小時 (hh:mm:ss)
%S 秒 (00..59)
%s 秒 (00..59)
%p AM 或 PM
%w 一周中的天數(shù) (0=Sunday..6=Saturday)
%U 星期 (00..53),星期日是一個星期的第一天
%u 星期 (00..53),星期一是一個星期的第一天
%V 星期 (01..53),星期日是一個星期的第一天。與 '%X' 一起使用
%v 星期 (01..53),星期一是一個星期的第一天。與 '%x' 一起使用
%% 一個字母 “%”
所有其它的字符不經(jīng)過解釋,直接復(fù)制到結(jié)果中:
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
-> 'Saturday October 1997'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
'%D %y %a %d %m %b %j');
-> '4th 97 Sat 04 10 Oct 277'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
'%H %k %I %r %T %S %w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
-> '1998 52'
在 MySQL 3.23 中,在格式修飾符前需要字符 `%'。在更早的 MySQL 版本中,`%' 是可選的。 月份與天修飾符的范圍從零開始的原因是,在 MySQL 3.23 中,它允許存儲不完善的日期值(例如 '2004-00-00')。
TIME_FORMAT(time,format)
它的使用方法與上面的 DATE_FORMAT() 函數(shù)相似,但是 format 字符串只包含處理小時、分和秒的那些格式修飾符。使用其它的修飾符會產(chǎn)生一個 NULL 值或 0。
CURDATE()
CURRENT_DATE
以 'YYYY-MM-DD' 或 YYYYMMDD 格式返回當(dāng)前的日期值,返回的格式取決于該函數(shù)是用于字符串還是數(shù)字語境中:
mysql> SELECT CURDATE();
-> '1997-12-15'
mysql> SELECT CURDATE() + 0;
-> 19971215
CURTIME()
CURRENT_TIME
以 'HH:MM:SS' 或 HHMMSS 格式返回當(dāng)前的時間值,返回的格式取決于該函數(shù)是用于字符串還是數(shù)字語境中:
mysql> SELECT CURTIME();
-> '23:50:26'
mysql> SELECT CURTIME() + 0;
-> 235026
NOW()
SYSDATE()
CURRENT_TIMESTAMP
以 'YYYY-MM-DD HH:MM:SS' 或 YYYYMMDDHHMMSS 格式返回當(dāng)前的日期時間值,返回的格式取決于該函數(shù)是用于字符串還是數(shù)字語境中:
mysql> SELECT NOW();
-> '1997-12-15 23:50:26'
mysql> SELECT NOW() + 0;
-> 19971215235026
注意,函數(shù) NOW() 在每個查詢中只計算一次,也就是在查詢開始執(zhí)行時。這就是說,如果在一個單獨(dú)的查詢中多次引用了 NOW(),它只會給出值都是一個相同的時間。
UNIX_TIMESTAMP()
UNIX_TIMESTAMP(date)
如果調(diào)用時沒有參數(shù),以無符號的整數(shù)形式返回一個 Unix 時間戳(從 '1970-01-01 00:00:00' GMT 開始的秒數(shù))。如果以一個參數(shù) date 調(diào)用 UNIX_TIMESTAMP(),它將返回該參數(shù)值從 '1970-01-01 00:00:00' GMT 開始經(jīng)過的秒數(shù)值。date 可以是一個 DATE 字符串,一個 DATETIME 字符串,一個 TIMESTAMP,或者以一個 YYMMDD 或 YYYYMMDD 顯示的本地時間:
mysql> SELECT UNIX_TIMESTAMP();
-> 882226357
mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00');
-> 875996580
當(dāng) UNIX_TIMESTAMP 被用于一個 TIMESTAMP 列時,函數(shù)直接返回一個內(nèi)部的時間戳值,而不進(jìn)行一個隱含地 “string-to-unix-timestamp” 轉(zhuǎn)換。如果你傳遞一個超出范圍的日期參數(shù)給 UNIX_TIMESTAMP() ,它將返回 0,但是請注意,MySQL 對其僅僅進(jìn)行基本的檢驗(yàn)(年范圍 1970-2037,月份 01-12,日期 01-31)。 如果你希望減去 UNIX_TIMESTAMP() 列,你應(yīng)該需要將結(jié)果強(qiáng)制轉(zhuǎn)換為一有符號整數(shù)。查看章節(jié) 6.3.5 Cast 函數(shù)。
FROM_UNIXTIME(unix_timestamp [,format])
以 'YYYY-MM-DD HH:MM:SS' 或 YYYYMMDDHHMMSS 格式返回一個 unix_timestamp 參數(shù)值,返回值的形式取決于該函數(shù)使用于字符串還是數(shù)字語境。 如果 format 給出,返回值依 format 字符串被格式。format 可以包含與 DATE_FORMAT() 函數(shù)同樣的修飾符。
mysql> SELECT FROM_UNIXTIME(875996580);
-> '1997-10-04 22:23:00'
mysql> SELECT FROM_UNIXTIME(875996580) + 0;
-> 19971004222300
mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),
'%Y %D %M %h:%i:%s %x');
-> '1997 23rd December 03:43:30 1997'
SEC_TO_TIME(seconds)
以 'HH:MM:SS' 或 HHMMSS 格式返回參數(shù) seconds 被轉(zhuǎn)換到時分秒后的值,返回值的形式取決于該函數(shù)使用于字符串還是數(shù)字語境:
mysql> SELECT SEC_TO_TIME(2378);
-> '00:39:38'
mysql> SELECT SEC_TO_TIME(2378) + 0;
-> 3938
TIME_TO_SEC(time)
將參數(shù) time 轉(zhuǎn)換為秒數(shù)后返回:
mysql> SELECT TIME_TO_SEC('22:23:00');
-> 80580
mysql> SELECT TIME_TO_SEC('00:39:38');
è 2378
使用distinct在mysql中查詢多條不重復(fù)記錄值的解決辦法
在使用mysql時,有時需要查詢出某個字段不重復(fù)的記錄,雖然mysql提供有distinct這個關(guān)鍵字來過濾掉多余的重復(fù)記錄只保留一條,但往往只用它來返回不重復(fù)記錄的條數(shù),而不是用它來返回不重記錄的所有值。其原因是distinct只能返回它的目標(biāo)字段,而無法返回其它字段,這個問題讓我困擾了很久,用distinct不能解決的話,我只有用二重循環(huán)查詢來解決,而這樣對于一個數(shù)據(jù)量非常大的站來說,無疑是會直接影響到效率的。所以我花了很多時間來研究這個問題,網(wǎng)上也查不到解決方案,期間把容容拉來幫忙,結(jié)果是我們兩人都郁悶了。。。。。。。。。
下面先來看看例子:
table
id name
1 a
2 b
3 c
4 c
5 b
庫結(jié)構(gòu)大概這樣,這只是一個簡單的例子,實(shí)際情況會復(fù)雜得多。
比如我想用一條語句查詢得到name不重復(fù)的所有數(shù)據(jù),那就必須使用distinct去掉多余的重復(fù)記錄。
select distinct name from table
得到的結(jié)果是:
name
a
b
c
好像達(dá)到效果了,可是,我想要得到的是id值呢?改一下查詢語句吧:
select distinct name, id from table
結(jié)果會是:
id name
1 a
2 b
3 c
4 c
5 b
distinct怎么沒起作用?作用是起了的,不過他同時作用了兩個字段,也就是必須得id與name都相同的才會被排除。。。。。。。
我們再改改查詢語句:
select id, distinct name from table
很遺憾,除了錯誤信息你什么也得不到,distinct必須放在開頭。難到不能把distinct放到where條件里?能,照樣報錯。。。。。。。
很麻煩吧?確實(shí),費(fèi)盡心思都沒能解決這個問題。沒辦法,繼續(xù)找人問。
拉住公司里一JAVA程序員,他給我演示了oracle里使用distinct之后,也沒找到mysql里的解決方案,最后下班之前他建議我試試group by。
試了半天,也不行,最后在mysql手冊里找到一個用法,用group_concat(distinct name)配合group by name實(shí)現(xiàn)了我所需要的功能,興奮,天佑我也,趕快試試。
報錯。。。。。。。。。。。。郁悶。。。。。。。連mysql手冊也跟我過不去,先給了我希望,然后又把我推向失望,好狠哪。。。。
再仔細(xì)一查,group_concat函數(shù)是4.1支持,暈,我4.0的。沒辦法,升級,升完級一試,成功。。。。。。
終于搞定了,不過這樣一來,又必須要求客戶也升級了。
突然靈機(jī)一閃,既然可以使用group_concat函數(shù),那其它函數(shù)能行嗎?
趕緊用count函數(shù)一試,成功,我。。。。。。。想哭啊,費(fèi)了這么多工夫。。。。。。。。原來就這么簡單。。。。。。
現(xiàn)在將完整語句放出:
select *, count(distinct name) from table group by name
結(jié)果:
id name count(distinct name)
1 a 1
2 b 1
3 c 1
最后一項是多余的,不用管就行了,目的達(dá)到。。。。。
唉,原來mysql這么笨,輕輕一下就把他騙過去了,郁悶也就我吧(對了,還有容容那家伙),現(xiàn)在拿出來希望大家不要被這問題折騰。
哦,對,再順便說一句,group by 必須放在 order by 和 limit之前,不然會報錯,差不多了,發(fā)給容容放網(wǎng)站上去,我繼續(xù)忙碌。。。。。。
-----------------------------------------------------------------------------------------
更郁悶的事情發(fā)生了,在準(zhǔn)備提交時容容發(fā)現(xiàn),有更簡單的解決方法。。。。。。
select id, name from table group by name
看來對mysql的了解還是太膚淺了,不怕被笑話,發(fā)出來讓大家別犯同樣的錯誤。。。。。。
by 索爾
數(shù)據(jù)庫連接過多的錯誤,可能的原因分析及解決辦法
系統(tǒng)不能連接數(shù)據(jù)庫,關(guān)鍵要看兩個數(shù)據(jù):
1、數(shù)據(jù)庫系統(tǒng)允許的最大可連接數(shù)max_connections。這個參數(shù)是可以設(shè)置的。如果不設(shè)置,默認(rèn)是100。最大是16384。
2、數(shù)據(jù)庫當(dāng)前的連接線程數(shù)threads_connected。這是動態(tài)變化的。
查看max_connections、max_connections的辦法見后。
如果 threads_connected == max_connections 時,數(shù)據(jù)庫系統(tǒng)就不能提供更多的連接數(shù)了,這時,如果程序還想新建連接線程,數(shù)據(jù)庫系統(tǒng)就會拒絕,如果程序沒做太多的錯誤處理,就會出現(xiàn)類似強(qiáng)壇的報錯信息。
因?yàn)閯?chuàng)建和銷毀數(shù)據(jù)庫的連接,都會消耗系統(tǒng)的資源。而且為了避免在同一時間同時打開過多的連接線程,現(xiàn)在編程一般都使用所謂數(shù)據(jù)庫連接池技術(shù)。
但數(shù)據(jù)庫連接池技術(shù),并不能避免程序錯誤導(dǎo)致連接資源消耗殆盡。
這種情況通常發(fā)生在程序未能及時釋放數(shù)據(jù)庫連接資源或其他原因造成數(shù)據(jù)庫連接資源不能釋放,但強(qiáng)壇系統(tǒng)估計不會發(fā)生這種低級的編程錯誤。
該錯誤的簡便的檢查辦法是,在刷新強(qiáng)壇頁面時,不斷監(jiān)視threads_connected的變化。如果max_connections足夠大,而threads_connected值不斷增加以至達(dá)到max_connections,那么,就應(yīng)該檢查程序了。當(dāng)然,如果采用數(shù)據(jù)庫連接池技術(shù),threads_connected增長到數(shù)據(jù)庫連接池的最大連接線程數(shù)時,就不再增長了。
從強(qiáng)壇出錯的情況看,更大的可能性是數(shù)據(jù)庫系統(tǒng)沒能進(jìn)行適當(dāng)?shù)嘏渲。下面提出一點(diǎn)建議。供參考
讓你們的工程師把MySQL的最大允許連接數(shù)從默認(rèn)的100調(diào)成32000。這就不會老出現(xiàn)連接過多的問題了。
查看max_connections
進(jìn)入MySQL,用命令:show variables
查看數(shù)據(jù)庫最大可連接數(shù)的變量值:max_connections
查看threads_connected
進(jìn)入MySQL,用命令:show status
查看當(dāng)前活動的連接線程變量值:threads_connected
設(shè)置max_connections
設(shè)置辦法是在my.cnf文件中,添加下面的最后紅色的一行:
--------------------------------------------------------------------------------
[mysqld]
port=3306
#socket=MySQL
skip-locking
set-variable = key_buffer=16K
set-variable = max_allowed_packet=1M
set-variable = thread_stack=64K
set-variable = table_cache=4
set-variable = sort_buffer=64K
set-variable = net_buffer_length=2K
set-variable = max_connections=32000
--------------------------------------------------------------------------------
修改完畢后,重啟MySQL即可。當(dāng)然,為了確保設(shè)置正確,應(yīng)該查看一下max_connections。
注意:
1、雖然這里寫的32000。但實(shí)際MySQL服務(wù)器允許的最大連接數(shù)16384;
2、除max_connections外,上述其他配置應(yīng)該根據(jù)你們系統(tǒng)自身需要進(jìn)行配置,不必拘泥;
3、添加了最大允許連接數(shù),對系統(tǒng)消耗增加不大。
4、如果你的mysql用的是my.ini作配置文件,設(shè)置類似,但設(shè)置的格式要稍作變通。
mysql的字符串函數(shù)
注意:如果結(jié)果的長度大于服務(wù)器參數(shù)max_allowed_packet,字符串值函數(shù)返回NULL
對于針對字符串位置的操作,第一個位置被標(biāo)記為1。
ASCII(str)
返回字符串str的最左面字符的ASCII代碼值。如果str是空字符串,返回0。如果str是NULL,返回NULL。
mysql> select ASCII('2');
-> 50
mysql> select ASCII(2);
-> 50
mysql> select ASCII('dx');
-> 100也可參見ORD()函數(shù)。
ORD(str)
如果字符串str最左面字符是一個多字節(jié)字符,通過以格式((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]返回字符的ASCII代碼值來返回多字節(jié)字符代碼。如果最左面的字符不是一個多字節(jié)字符。返回與ASCII()函數(shù)返回的相同值。
mysql> select ORD('2');
-> 50
CONV(N,from_base,to_base)
在不同的數(shù)字基之間變換數(shù)字。返回數(shù)字N的字符串?dāng)?shù)字,從from_base基變換為to_base基,如果任何參數(shù)是NULL,返回NULL。參數(shù)N解釋為一個整數(shù),但是可以指定為一個整數(shù)或一個字符串。最小基是2且最大的基是36。如果to_base是一個負(fù)數(shù),N被認(rèn)為是一個有符號數(shù),否則,N被當(dāng)作無符號數(shù)。 CONV以64位點(diǎn)精度工作。
mysql> select CONV("a",16,2);
-> '1010'
mysql> select CONV("6E",18,8);
-> '172'
mysql> select CONV(-17,10,-18);
-> '-H'
mysql> select CONV(10+"10"+'10'+0xa,10,10);
-> '40'
BIN(N)
返回二進(jìn)制值N的一個字符串表示,在此N是一個長整數(shù)(BIGINT)數(shù)字,這等價于CONV(N,10,2)。如果N是NULL,返回NULL。
mysql> select BIN(12);
-> '1100'
OCT(N)
返回八進(jìn)制值N的一個字符串的表示,在此N是一個長整型數(shù)字,這等價于CONV(N,10,8)。如果N是NULL,返回NULL。
mysql> select OCT(12);
-> '14'
HEX(N)
返回十六進(jìn)制值N一個字符串的表示,在此N是一個長整型(BIGINT)數(shù)字,這等價于CONV(N,10,16)。如果N是NULL,返回NULL。
mysql> select HEX(255);
-> 'FF'
CHAR(N,...)
CHAR()將參數(shù)解釋為整數(shù)并且返回由這些整數(shù)的ASCII代碼字符組成的一個字符串。NULL值被跳過。
mysql> select CHAR(77,121,83,81,'76');
-> 'MySQL'
mysql> select CHAR(77,77.3,'77.3');
-> 'MMM'
CONCAT(str1,str2,...)
返回來自于參數(shù)連結(jié)的字符串。如果任何參數(shù)是NULL,返回NULL。可以有超過2個的參數(shù)。一個數(shù)字參數(shù)被變換為等價的字符串形式。
mysql> select CONCAT('My', 'S', 'QL');
-> 'MySQL'
mysql> select CONCAT('My', NULL, 'QL');
-> NULL
mysql> select CONCAT(14.3);
-> '14.3'
LENGTH(str)
OCTET_LENGTH(str)
CHAR_LENGTH(str)
CHARACTER_LENGTH(str)
返回字符串str的長度。
mysql> select LENGTH('text');
-> 4
mysql> select OCTET_LENGTH('text');
-> 4
注意,對于多字節(jié)字符,其CHAR_LENGTH()僅計算一次。
LOCATE(substr,str)
POSITION(substr IN str)
返回子串substr在字符串str第一個出現(xiàn)的位置,如果substr不是在str里面,返回0.
mysql> select LOCATE('bar', 'foobarbar');
-> 4
mysql> select LOCATE('xbar', 'foobar');
-> 0
該函數(shù)是多字節(jié)可靠的。 LOCATE(substr,str,pos)
返回子串substr在字符串str第一個出現(xiàn)的位置,從位置pos開始。如果substr不是在str里面,返回0。
mysql> select LOCATE('bar', 'foobarbar',5);
-> 7
這函數(shù)是多字節(jié)可靠的。
INSTR(str,substr)
返回子串substr在字符串str中的第一個出現(xiàn)的位置。這與有2個參數(shù)形式的LOCATE()相同,除了參數(shù)被顛倒。
mysql> select INSTR('foobarbar', 'bar');
-> 4
mysql> select INSTR('xbar', 'foobar');
-> 0
這函數(shù)是多字節(jié)可靠的。
LPAD(str,len,padstr)
返回字符串str,左面用字符串padstr填補(bǔ)直到str是len個字符長。
mysql> select LPAD('hi',4,'??');
-> '??hi'
RPAD(str,len,padstr)
返回字符串str,右面用字符串padstr填補(bǔ)直到str是len個字符長。
mysql> select RPAD('hi',5,'?');
-> 'hi???'
LEFT(str,len)
返回字符串str的最左面len個字符。
mysql> select LEFT('foobarbar', 5);
-> 'fooba'
該函數(shù)是多字節(jié)可靠的。
RIGHT(str,len)
返回字符串str的最右面len個字符。
mysql> select RIGHT('foobarbar', 4);
-> 'rbar'
該函數(shù)是多字節(jié)可靠的。
SUBSTRING(str,pos,len)
SUBSTRING(str FROM pos FOR len)
MID(str,pos,len)
從字符串str返回一個len個字符的子串,從位置pos開始。使用FROM的變種形式是ANSI SQL92語法。
mysql> select SUBSTRING('Quadratically',5,6);
-> 'ratica'
該函數(shù)是多字節(jié)可靠的。
SUBSTRING(str,pos)
SUBSTRING(str FROM pos)
從字符串str的起始位置pos返回一個子串。
mysql> select SUBSTRING('Quadratically',5);
-> 'ratically'
mysql> select SUBSTRING('foobarbar' FROM 4);
-> 'barbar'
該函數(shù)是多字節(jié)可靠的。
SUBSTRING_INDEX(str,delim,count)
返回從字符串str的第count個出現(xiàn)的分隔符delim之后的子串。如果count是正數(shù),返回最后的分隔符到左邊(從左邊數(shù)) 的所有字符。如果count是負(fù)數(shù),返回最后的分隔符到右邊的所有字符(從右邊數(shù))。
mysql> select SUBSTRING_INDEX('www.mysql.com', '.', 2);
-> 'www.mysql'
mysql> select SUBSTRING_INDEX('www.mysql.com', '.', -2);
-> 'mysql.com'
該函數(shù)對多字節(jié)是可靠的。
LTRIM(str)
返回刪除了其前置空格字符的字符串str。
mysql> select LTRIM(' barbar');
-> 'barbar'
RTRIM(str)
返回刪除了其拖后空格字符的字符串str。
mysql> select RTRIM('barbar ');
-> 'barbar'
該函數(shù)對多字節(jié)是可靠的。 TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
返回字符串str,其所有remstr前綴或后綴被刪除了。如果沒有修飾符BOTH、LEADING或TRAILING給出,BOTH被假定。如果remstr沒被指定,空格被刪除。
mysql> select TRIM(' bar ');
-> 'bar'
mysql> select TRIM(LEADING 'x' FROM 'xxxbarxxx');
-> 'barxxx'
mysql> select TRIM(BOTH 'x' FROM 'xxxbarxxx');
-> 'bar'
mysql> select TRIM(TRAILING 'xyz' FROM 'barxxyz');
-> 'barx'
該函數(shù)對多字節(jié)是可靠的。
SOUNDEX(str)
返回str的一個同音字符串。聽起來“大致相同”的2個字符串應(yīng)該有相同的同音字符串。一個“標(biāo)準(zhǔn)”的同音字符串長是4個字符,但是SOUNDEX()函數(shù)返回一個任意長的字符串。你可以在結(jié)果上使用SUBSTRING()得到一個“標(biāo)準(zhǔn)”的 同音串。所有非數(shù)字字母字符在給定的字符串中被忽略。所有在A-Z之外的字符國際字母被當(dāng)作元音。
mysql> select SOUNDEX('Hello');
-> 'H400'
mysql> select SOUNDEX('Quadratically');
-> 'Q36324'
SPACE(N)
返回由N個空格字符組成的一個字符串。
mysql> select SPACE(6);
-> ' '
REPLACE(str,from_str,to_str)
返回字符串str,其字符串from_str的所有出現(xiàn)由字符串to_str代替。
mysql> select REPLACE('www.mysql.com', 'w', 'Ww');
-> 'WwWwWw.mysql.com'
該函數(shù)對多字節(jié)是可靠的。
REPEAT(str,count)
返回由重復(fù)countTimes次的字符串str組成的一個字符串。如果count ,返回一個空字符串。如果str或count是NULL,返回NULL。
mysql> select REPEAT('MySQL', 3);
-> 'MySQLMySQLMySQL'
REVERSE(str)
返回顛倒字符順序的字符串str。
mysql> select REVERSE('abc');
-> 'cba'
該函數(shù)對多字節(jié)可靠的。
INSERT(str,pos,len,newstr)
返回字符串str,在位置pos起始的子串且len個字符長得子串由字符串newstr代替。
mysql> select INSERT('Quadratic', 3, 4, 'What');
-> 'QuWhattic'
該函數(shù)對多字節(jié)是可靠的。
ELT(N,str1,str2,str3,...)
如果N= 1,返回str1,如果N= 2,返回str2,等等。如果N小于1或大于參數(shù)個數(shù),返回NULL。ELT()是FIELD()反運(yùn)算。
mysql> select ELT(1, 'ej', 'Heja', 'hej', 'foo');
-> 'ej'
mysql> select ELT(4, 'ej', 'Heja', 'hej', 'foo');
-> 'foo'
FIELD(str,str1,str2,str3,...)
返回str在str1, str2, str3, ...清單的索引。如果str沒找到,返回0。FIELD()是ELT()反運(yùn)算。
mysql> select FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
-> 2
mysql> select FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
-> 0
FIND_IN_SET(str,strlist)
如果字符串str在由N子串組成的表strlist之中,返回一個1到N的值。一個字符串表是被“,”分隔的子串組成的一個字符串。如果第一個參數(shù)是一個常數(shù)字符串并且第二個參數(shù)是一種類型為SET的列,F(xiàn)IND_IN_SET()函數(shù)被優(yōu)化而使用位運(yùn)算!如果str不是在strlist里面或如果strlist是空字符串,返回0。如果任何一個參數(shù)是NULL,返回NULL。如果第一個參數(shù)包含一個“,”,該函數(shù)將工作不正常。
mysql> SELECT FIND_IN_SET('b','a,b,c,d');
-> 2
MAKE_SET(bits,str1,str2,...)
返回一個集合 (包含由“,”字符分隔的子串組成的一個字符串),由相應(yīng)的位在bits集合中的的字符串組成。str1對應(yīng)于位0,str2對應(yīng)位1,等等。在str1, str2, ...中的NULL串不添加到結(jié)果中。
mysql> SELECT MAKE_SET(1,'a','b','c');
-> 'a'
mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world');
-> 'hello,world'
mysql> SELECT MAKE_SET(0,'a','b','c');
-> ''
EXPORT_SET(bits,on,off,[separator,[number_of_bits]])
返回一個字符串,在這里對于在“bits”中設(shè)定每一位,你得到一個“on”字符串,并且對于每個復(fù)位(reset)的位,你得到一個“off”字符串。每個字符串用“separator”分隔(缺省“,”),并且只有“bits”的“number_of_bits” (缺省64)位被使用。
mysql> select EXPORT_SET(5,'Y','N',',',4)
-> Y,N,Y,N
LCASE(str)
LOWER(str)
返回字符串str,根據(jù)當(dāng)前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改變成小寫。該函數(shù)對多字節(jié)是可靠的。
mysql> select LCASE('QUADRATICALLY');
-> 'quadratically'
UCASE(str)
UPPER(str)
返回字符串str,根據(jù)當(dāng)前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改變成大寫。該函數(shù)對多字節(jié)是可靠的。
mysql> select UCASE('Hej');
-> 'HEJ'
該函數(shù)對多字節(jié)是可靠的。
LOAD_FILE(file_name)
讀入文件并且作為一個字符串返回文件內(nèi)容。文件必須在服務(wù)器上,你必須指定到文件的完整路徑名,而且你必須有file權(quán)限。文件必須所有內(nèi)容都是可讀的并且小于max_allowed_packet。如果文件不存在或由于上面原因之一不能被讀出,函數(shù)返回NULL。
mysql> UPDATE table_name
SET blob_column=LOAD_FILE("/tmp/picture")
WHERE id=1;
MySQL必要時自動變換數(shù)字為字符串,并且反過來也如此:
mysql> SELECT 1+"1";
-> 2
mysql> SELECT CONCAT(2,' test');
-> '2 test'
如果你想要明確地變換一個數(shù)字到一個字符串,把它作為參數(shù)傳遞到CONCAT()。
如果字符串函數(shù)提供一個二進(jìn)制字符串作為參數(shù),結(jié)果字符串也是一個二進(jìn)制字符串。被變換到一個字符串的數(shù)字被當(dāng)作是一個二進(jìn)制字符串。這僅影響比較。
Mysql字段長度
列類型 需要的存儲量
TINYINT 1 字節(jié)
SMALLINT 2 個字節(jié)
MEDIUMINT 3 個字節(jié)
INT 4 個字節(jié)
INTEGER 4 個字節(jié)
BIGINT 8 個字節(jié)
FLOAT(X) 4 如果 X 或 8 如果 25 個字節(jié)
DOUBLE 8 個字節(jié)
DOUBLE PRECISION 8 個字節(jié)
REAL 8 個字節(jié)
DECIMAL(M,D) M字節(jié)(D+2 , 如果M 字節(jié)(D+2 , 如果M 日期和時間類型
列類型 需要的存儲量
DATE 3 個字節(jié)
DATETIME 8 個字節(jié)
TIMESTAMP 4 個字節(jié)
TIME 3 個字節(jié)
YEAR 1 字節(jié)
串類型
列類型 需要的存儲量
CHAR(M) M字節(jié),1 字節(jié), 在此L 和1 字節(jié), 在此L字節(jié), 在此L字節(jié), 在此L字節(jié), 在此L或 2 個字節(jié), 取決于枚舉值的數(shù)目(最大值65535)
SET('value1','value2',...) 1,2,3,4或8個字節(jié), 取決于集合成員的數(shù)量(最多64個成員)
MySQL中各種字段的取值范圍
TINYINT
-128 - 127
TINYINT UNSIGNED
0 - 255
SMALLINT
-32768 - 32767
SMALLINT UNSIGNED
0 - 65535
MEDIUMINT
-8388608 - 8388607
MEDIUMINT UNSIGNED
0 - 16777215
INT 或 INTEGER
-2147483648 - 2147483647
INT UNSIGNED 或 INTEGER UNSIGNED
0 - 4294967295
BIGINT
-9223372036854775808 - 9223372036854775807
BIGINT UNSIGNED
0 - 18446744073709551615
FLOAT
-3.402823466E+38 - -1.175494351E-38
0
1.175494351E-38 - 3.402823466E+38
DOUBLE 或 DOUBLE PRECISION 或 REAL
-1.7976931348623157E+308 - -2.2250738585072014E-308
0
2.2250738585072014E-308 - 1.7976931348623157E+308
DECIMAL[(M,[D])] 或 NUMERIC(M,D)
由M(整個數(shù)字的長度,包括小數(shù)點(diǎn),小數(shù)點(diǎn)左邊的位數(shù),小數(shù)點(diǎn)右邊的位數(shù),但不包括負(fù)號)和D(小數(shù)點(diǎn)右邊的位數(shù))來決定,M缺省為10,D缺省為0
DATE
1000-01-01 - 9999-12-31
DATETIME
1000-01-01 00:00:00 - 9999-12-31 23:59:59
TIMESTAMP
1970-01-01 00:00:00 - 2037年的某天(具體是哪天我也不知道,呵呵)
TIME
-838:59:59' to 838:59:59
YEAR[(2|4)]
缺省為4位格式,4位格式取值范圍為1901 - 2155,0000,2位格式取值范圍為70-69(1970-2069)
CHAR(M) [BINARY] 或 NCHAR(M) [BINARY]
M的范圍為1 - 255,如果沒有BINARY項,則不分大小寫,NCHAR表示使用缺省的字符集.在數(shù)據(jù)庫中以空格補(bǔ)足,但在取出來時末尾的空格將自動去掉.
[NATIONAL] VARCHAR(M) [BINARY]
M的范圍為1 - 255.在數(shù)據(jù)庫中末尾的空格將自動去掉.
TINYBLOB 或 TINYTEXT
255(2^8-1)個字符
BLOB 或 TEXT
65535(2^16-1)個字符
MEDIUMBLOB 或 MEDIUMTEXT
16777215 (2^24-1)個字符
LONGBLOB 或 LONGTEXT
4294967295 (2^32-1)個字符
ENUM('value1','value2',...)
可以總共有65535個不同的值
SET('value1','value2',...)
本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u/3787/showart_130223.html |
|