mysql reset root password

Solution for MySQL: Error 1045 (28000): Access denied for user ‘root’@’localhost’

1. sudo service mysql stop

2. sudo mysqld_safe --skip-grant-tables

3. open another terminal:

$ mysql

mysql> use mysql;

mysql> UPDATE user SET password=PASSWORD('YOUR_NEW_PASSWORD_HERE') WHERE user = 'root';

mysql> exit;

5. sudo service mysql start

Simple mysql date diff function

sameple 1: select * from table where datediff(createdate, NOW())=’0′;”);

sameple 2: select * from table where createdate>subDate(NOW(), ‘1’);

 

reference: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

,

MYSQL enum and set

The ENUM Type

An ENUM is a string object with a value chosen from a list of permitted values that are enumerated explicitly in the column specification at table creation time.

An enumeration value must be a quoted string literal; it may not be an expression, even one that evaluates to a string value. For example, you can create a table with an ENUM column like this:

CREATE TABLE sizes (
    name ENUM('small', 'medium', 'large')
);

The SET Type

SET is a string object that can have zero or more values, each of which must be chosen from a list of permitted values specified when the table is created. SET column values that consist of multiple set members are specified with members separated by commas (“,”). A consequence of this is that SET member values should not themselves contain commas.

For example, a column specified as SET('one', 'two') NOT NULL can have any of these values:

''
'one'
'two'
'one,two'

SET can have a maximum of 64 different members.

 

ENUM and SET Constraints

ENUM and SET columns provide an efficient way to define columns that can contain only a given set of values. SeeSection 10.4.4, “The ENUM Type”, and Section 10.4.5, “The SET Type”. However, in MySQL 4.1 and earlier, ENUMand SET columns do not provide true constraints on entry of invalid data:

  • ENUM columns always have a default value. If you specify no default value, then it is NULL for columns that can have NULL, otherwise it is the first enumeration value in the column definition.
  • If you insert an incorrect value into an ENUM column or if you force a value into an ENUM column with IGNORE, it is set to the reserved enumeration value of 0, which is displayed as an empty string in string context.
  • If you insert an incorrect value into a SET column, the incorrect value is ignored. For example, if the column can contain the values 'a''b', and 'c', an attempt to assign 'a,x,b,y' results in a value of 'a,b'.
, ,

Usage of primary Key / Index / Unique

■ Index:

◎ 資料索引,可加快搜尋速度,Mysql引擎除了Archive外都支援B-tree索引

◎ 可多欄位設定為Index

◎ 語法為 CREATE INDEX <索引的名字> ON tablename (列的列表)

■ Unique:

◎ 和index相同,差異在於不能允許重複值

◎ 語法為CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表)

■ PRIMARY Key(PK):

◎ 是一種index但不能為空值(NULL),PK會自動建立index

◎ 每個table只能有一個PRIMARY Key

◎ 語法為CREATETABLE tablename ( […], PRIMARY KEY (列的列表) );

■ index的觀念:

◎ index建立會占用儲存空間,資料增刪修時會異動

◎ index 欄位長度是越短越好

◎ index 欄位長度若是固定比變動好

◎ 使用「LIKE」參數時,若將萬用字元(%)置於關鍵詞後方,可以使用到 index,前方不起作用

◎ 單列索引與多列索引的觀念:

▲ 將「A+B+C」設為 index 時,僅搜尋A是不會用到索引的

▲ 「A+B+C」和「A」設為 index不同,如搜尋A+B+C,前者直接回覆A+B+C索引值,後者為A用索引,縮小範圍後再以搜尋B+C

reference: http://miggo.pixnet.net/blog/post/30862194-%5Bmysql%E5%9F%BA%E6%9C%AC%E8%A7%80%E5%BF%B5%5D-primary-key—index—unique%E5%B7%AE%E5%88%A5

, , , ,

Mysql日期和時間函數

對於每個類型擁有的值範圍以及並且指定日期何時間值的有效格式的描述見7.3.6 日期和時間類型。

ref. http://www.webasp.net/article/25/24538.htm
這裡是一個使用日期函數的例子。 下面的查詢選擇了所有記錄,其date_col的值是在最後30天以內:

mysql> SELECT something FROM table
WHERE TO_DAYS(NOW()) – TO_DAYS(date_col) <= 30; DAYOFWEEK(date) 返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六)。 這些索引值對應於ODBC標準。 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範圍內。
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)
對於星期天是一周的第一天的地方,有一個單個參數,返回date的周數,範圍在0到52。2個參數形式WEEK()允許
你指定星期是否開始於星期天或星期一。 如果第二個參數是0,星期從星期天開始,如果第二個參數是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的秒數,範圍是0到59。
mysql> select SECOND(’10:05:03’);
-> 3

PERIOD_ADD(P,N)
增加N個月到階段P(以格式YYMM或YYYYMM)。 以格式YYYYMM返回值。 注意階段參數P不是日期值。
mysql> select PERIOD_ADD(9801,2);
-> 199803

PERIOD_DIFF(P1,P2)
返回在時期P1和P2之間月數,P1和P2應該以格式YYMM或YYYYMM。 注意,時期參數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)
這些功能執行日期運算。 對於MySQL 3.22,他們是新的。 ADDDATE()和SUBDATE()是DATE_ADD()和DATE_SUB()的同義詞。
在MySQL 3.23中,你可以使用+和-而不是DATE_ADD()和DATE_SUB()。 (見例子)date是一個指定開始日期的
DATETIME或DATE值,expr是指定加到開始日期或從開始日期減去的間隔值一個表達式,expr是一個字符串;它可以以
一個“-”開始表示負間隔。 type是一個關鍵詞,指明表達式應該如何被解釋。 EXTRACT(type FROM date)函數從日期
中返回“type”間隔。 下表顯示了type和expr參數怎樣被關聯: 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格式中允許任何標點分隔符。 表示顯示的是建議的分隔符。 如果date參數是一個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
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關鍵詞期望的間隔部分),MySQL假設你省掉了間隔值的最左面部分。 例如,
如果你指定一個type是DAY_SECOND,值expr被希望有天、小時、分鐘和秒部分。 如果你像”1:10″這樣指定值,
MySQL假設日子和小時部分是丟失的並且值代表分鐘和秒。 換句話說,”1:10″ DAY_SECOND以它等價於”1:10” MINUTE_SECOND
的方式解釋,這對那MySQL解釋TIME值表示經過的時間而非作為一天的時間的方式有二義性。 如果你使用確實不正確的日期,
結果是NULL。 如果你增加MONTH、YEAR_MONTH或YEAR並且結果日期大於新月份的最大值天數,日子在新月用最大的天調整。

mysql> select DATE_ADD(‘1998-01-30’, Interval 1 month);
-> 1998-02-28

注意,從前面的例子中詞INTERVAL和type關鍵詞不是區分大小寫的。
TO_DAYS(date)
給出一個日期date,返回一個天數(從0年的天數)。
mysql> select TO_DAYS(950501);
-> 728779
mysql> select TO_DAYS(‘1997-10-07’);
-> 729669

TO_DAYS()不打算用於使用格列高里歷(1582)出現前的值。

FROM_DAYS(N)
給出一個天數N,返回一個DATE值。
mysql> select FROM_DAYS(729669);
-> ‘1997-10-07’

TO_DAYS()不打算用於使用格列高里歷(1582)出現前的值。

DATE_FORMAT(date,format)
根據format字符串格式化date值。 下列修飾符可以被用在format字符串中: %M月名字(January……December)
%W 星期名字(Sunday……Saturday)
%D 有英語前綴的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 數字, 4 位
%y 年, 數字, 2 位
%a 縮寫的星期名字(Sun……Sat)
%d 月份中的天數, 數字(00……31)
%e 月份中的天數, 數字(0……31)
%m 月, 數字(01……12)
%c 月, 數字(1……12)
%b 縮寫的月份名字(Jan……Dec)
%j 一年中的天數(001……366)
%H 小時(00……23)
%k 小時(0……23)
%h 小時(01……12)
%I 小時(01……12)
%l 小時(1……12)
%i 分鐘, 數字(00……59)
%r 時間,12 小時(hh:mm:ss [AP]M)
%T 時間,24 小時(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一個星期中的天數(0=Sunday ……6=Saturday )
%U 星期(0……52), 這裡星期天是星期的第一天
%u 星期(0……52), 這裡星期一是星期的第一天
%% 一個文字“%”。

所有的其他字符不做解釋被複製到結果中。

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()函數一樣使用,但是format字符串只能包含處理小時、分鐘和秒的那些格式修飾符。
其他修飾符產生一個NULL值或0。
CURDATE()
 
CURRENT_DATE
以’YYYY-MM-DD’或YYYYMMDD格式返回今天日期值,取決於函數是在一個字符串還是數字上下文被使用。
mysql> select CURDATE();
-> ‘1997-12-15′
mysql> select CURDATE() + 0;
-> 19971215

CURTIME()
 
CURRENT_TIME
以’HH:MM:SS’或HHMMSS格式返回當前時間值,取決於函數是在一個字符串還是在數字的上下文被使用。
mysql> select CURTIME();
-> ’23:50:26’
mysql> select CURTIME() + 0;
-> 235026

NOW()
 
SYSDATE()
 
CURRENT_TIMESTAMP
以’YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS格式返回當前的日期和時間,取決於函數是在一個字符串還是在數字的
上下文被使用。
mysql> select NOW();
-> ‘1997-12-15 23:50:26′
mysql> select NOW() + 0;
-> 19971215235026

UNIX_TIMESTAMP()
 
UNIX_TIMESTAMP(date)
如果沒有參數調用,返回一個Unix時間戳記(從’1970-01-01 00:00:00’GMT開始的秒數)。 如果UNIX_TIMESTAMP()用一
個date參數被調用,它返回從’1970-01-01 00:00:00’ GMT開始的秒數值。 date可以是一個DATE字符串、一個DATETIME
字符串、一個TIMESTAMP或以YYMMDD或YYYYMMDD格式的本地時間的一個數字。
mysql> select UNIX_TIMESTAMP();
-> 882226357
mysql> select UNIX_TIMESTAMP(‘1997-10-04 22:23:00’);
-> 875996580

當UNIX_TIMESTAMP被用於一個TIMESTAMP列,函數將直接接受值,沒有隱含的“string-to-unix-timestamp”變換。

FROM_UNIXTIME(unix_timestamp)
以’YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS格式返回unix_timestamp參數所表示的值,取決於函數是在一個字符串
還是或數字上下文中被使用。
mysql> select FROM_UNIXTIME(875996580);
-> ‘1997-10-04 22:23:00’
mysql> select FROM_UNIXTIME(875996580) + 0;
-> 19971004222300

FROM_UNIXTIME(unix_timestamp,format)
返回表示Unix時間標記的一個字符串,根據format字符串格式化。 format可以包含與DATE_FORMAT()函數列出的條
目同樣的修飾符。
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參數,變換成小時、分鐘和秒,值以’HH:MM:SS’或HHMMSS格式化,取決於函數是在一個字符串還是在數字
上下文中被使用。
mysql> select SEC_TO_TIME(2378);
-> ’00:39:38′
mysql> select SEC_TO_TIME(2378) + 0;
-> 3938

TIME_TO_SEC(time)
返回time參數,轉換成秒。
mysql> select TIME_TO_SEC(’22:23:00′);
-> 80580
mysql> select TIME_TO_SEC(’00:39:38′);
-> 2378

, ,