一、数据库备份与恢复: 加上-R选项即可把存储过程也备份下来了(如不加-R默认不导出存储过程):mysqldump -uroot -p -R database_name(数据库名称)>文件名称.sql (注:后最可任意)#windows下mysql备份还原,可不用修改my.ini来还原视图(已验证)$ mysqldump -uroot -p --default-character-set=gbk --opt --extended-insert=false --triggers -R --hex-blob -x db_name > f:\db.sql(文件位置) mysql -uroot -p -f db_name < f:\db.sql linux:SQL 来备份 MyISAM 表:$ mysqldump -uroot -p123 --default-character-set=utf8 --opt --extended-insert=false --triggers -R --hex-blob -x db_name > db_name.sql 使用以下 SQL 来备份 Innodb 表:$ mysqldump -uroot -p --default -character-set=utf8 --opt --extended-insert=false --triggers -R --hex-blob --single-transaction db_name > db_name.sql 参数注解:mysqldump 是采用SQL级别的备份机制,它将数据表导成 SQL 脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最常用的备份方法。现在来讲一下 mysqldump 的一些主要参数:--compatible=name 它告诉 mysqldump,导出的数据将和哪种数据库或哪个旧版本的 MySQL 服务器相兼容。值可以为 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options 等,要使用几个值,用逗号将它们隔开。当然了,它并不保证能完全兼容,而是尽量兼容。--complete-insert,-c 导出的数据采用包含字段名的完整 INSERT 方式,也就是把所有的值都写在一行。这么做能提高插入效率,但是可能会受到 max_allowed_packet 参数的影响而导致插入失败。因此,需要谨慎使用该参数,至少我不推荐。--default-character-set=charset 指定导出数据时采用何种字符集,如果数据表不是采用默认的 latin1 字符集的话,那么导出时必须指定该选项,否则再次导入数据后将产生乱码问题。--disable-keys 告诉 mysqldump 在 INSERT 语句的开头和结尾增加 /*!40000 ALTER TABLE table DISABLE KEYS */; 和 /*!40000 ALTER TABLE table ENABLE KEYS */; 语句,这能大大提高插入语句的速度,因为它是在插入完所有数据后才重建索引的。该选项只适合 MyISAM 表。--extended-insert = true|false 默认情况下,mysqldump 开启 --complete-insert 模式,因此不想用它的的话,就使用本选项,设定它的值为 false 即可。--hex-blob 使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用本选项。影响到的字段类型有 BINARY、VARBINARY、BLOB。--lock-all-tables,-x 在开始导出之前,提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭 --single-transaction 和 --lock-tables 选项。--lock-tables 它和 --lock-all-tables 类似,不过是锁定当前导出的数据表,而不是一下子锁定全部库下的表。本选项只适用于 MyISAM 表,如果是 Innodb 表可以用 --single-transaction 选项。--no-create-info,-t 只导出数据,而不添加 CREATE TABLE 语句。--no-data,-d 不导出任何数据,只导出数据库表结构。--opt 这只是一个快捷选项,等同于同时添加 --add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset 选项。本选项能让 mysqldump 很快的导出数据,并且导出的数据能很快导回。该选项默认开启,但可以用 --skip-opt 禁用。注意,如果运行 mysqldump 没有指定 --quick 或 --opt 选项,则会将整个结果集放在内存中。如果导出大数据库的话可能会出现问题。--quick,-q 该选项在导出大表时很有用,它强制 mysqldump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。--routines,-R 导出存储过程以及自定义函数。--single-transaction 该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如 InnoDB 和 BDB。本选项和 --lock-tables 选项是互斥的,因为 LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用 --quick 选项。--triggers 同时导出触发器。该选项默认启用,用 --skip-triggers 禁用它。 转自:
二、mysql查看表结构命令 desc 表名;(以详细列表的形式显示表结构) show columns from 表名;(以详细列表的形式显示表结构) describe 表名;(以详细列表的形式显示表结构) show create table 表名;(以创建表的形式显示表结构)
三、字符串截取函数用法 1、从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 2、从右开始截取字符串 right(str, length) 说明:right(被截取字段,截取长度) 3、截取任意字符串 substring(str, pos) 说明:substring(被截取字段,从第几位开始截取) substring(str, pos, length) 说明:substring(被截取字段,从第几位开始截取,截取长度) 注:str的起始位为"0",不是"1",如果位数是负数 如-5 则是从后倒数位数,到字符串结束或截取的长度 4、按关键字截取字符串 substring_index(str,delim,count) 说明:substring_index(被截取字段,关键字,关键字出现的次数) (注:如果关键字出现的次数是负数 如-2 则是从后倒数,到字符串结束)
参考:
4. 字符串截取:substring_index(str,delim,count)
4.1 截取第二个 '.' 之前的所有字符。
mysql> select substring_index('www.linuxidc.com', '.', 2);
+------------------------------------------------+ | substring_index('www.linuxidc.com', '.', 2) | +------------------------------------------------+ | www | +------------------------------------------------+ 4.2 截取第二个 '.' (倒数)之后的所有字符。mysql> select substring_index('www.linuxidc.com', '.', -2);
+-------------------------------------------------+ | substring_index('www.linuxidc.com', '.', -2) | +-------------------------------------------------+ | com.cn | +-------------------------------------------------+ 4.3 如果在字符串中找不到 delim 参数指定的值,就返回整个字符串mysql> select substring_index('www.linuxidc.com', '.coc', 1);
+---------------------------------------------------+ | substring_index('www.linuxidc.com', '.coc', 1) | +---------------------------------------------------+ | www.linuxidc.com | +---------------------------------------------------+转自:
四、MySQL replace函数 replace函数我们经常用到,下面就为您详细介绍MySQL replace函数的用法。 UPDATE some_table SET some_field=REPLACE(some_field, 'from', 'def'); 着用是将some_table这个表里的somae_fieldz字段里的“from”字符串替换为“def”字符串。
insert into的增强版。在向表中插入数据时,我们经常会遇到这样的情况:1、首先判断数据是否存在;2、如果不存在,则插入;3、如果存在,则 更新。
在SQL Server中可以这样处理:
if not exists (select 1 from t where id = 1)?
insert into t(id, update_time) values(1, getdate()) else update t set update_time = getdate() where id = 1那么 MySQL 中如何实现这样的逻辑呢?MySQL 中有更简单的方法: replace into
replace into t(id, update_time) values(1, now());
或
replace into t(id, update_time) select 1, now();
replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中, 1. 如果发现表中已经有此行数据(根据主键 或者唯一索引判断)则先删除此行数据,然后插入新的数据。 2. 否则,直接插入新数据。
要注意的是:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据。
MySQL replace into 有三种形式:
1. replace into tbl_name(col_name, ...) values(...)
2. replace into tbl_name(col_name, ...) select ...
3. replace into tbl_name set col_name=value, ...
第一种形式类似于insert into的用法,
第二种replace select的用法也类似于insert select,这种用法并不一定要求列名匹配,事实上,MYSQL甚至不关心select返回的列名,它需要的是列的位置。例如,replace into tb1( name, title, mood) select rname, rtitle, rmood from tb2;?这个例子使用replace into从?tb2中将所有数据导入tb1中。
第三种replace set用法类似于update set用法,使用一个例如“SET col_name = col_name + 1”的赋值,则对位于右侧的列名称的引用会被作为DEFAULT(col_name)处理。因此,该赋值相当于SET col_name = DEFAULT(col_name) + 1。
前两种形式用的多些。其中 “into” 关键字可以省略,不过最好加上 “into”,这样意思更加直观。另外,对于那些没有给予值的列,MySQL 将自动为这些列赋上默认值。
5、Mysql时间戳格式转换: mysql中一个表的一个时间列是int类型,现在想修改这个字段的值,打算可读日期时间格式转成int,然后修改那个值。 这个转换函数就是UNIX_TIMESTAMP,将可读的时间转换成int类型,具体用法: update xxx_table set xxx_time=UNIX_TIMESTAMP('2006-11-13 13:24:22') where ...... 同时介绍一个另一个转换函数:FROM_UNIXTIME,将将时间戳转成常用时间格式 select FROM_UNIXTIME(xxx_time) from xxx_table mysql将时间戳转成常用时间格式 在mysql中,一个时间字段的存储类型是int(11),怎么转化成字符类型,比方存储为13270655222,需要转化为yyyy -mm-dd的形式 使用 FROM_UNIXTIME函数,具体如下: FROM_UNIXTIME(unix_timestamp,format) 返回表示 Unix 时间标记的一个字符串,根据format字符串格式化。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), 这里星期一是星期的第一天 %% 一个文字“%”。 所有的其他字符不做解释被复制到结果中。 如: SELECT FROM_UNIXTIME(1234567890, '%Y-%m-%d %H:%i:%S') 可以自己指定格式。
6、SQL字段类型长度的更改方法 修改student表的number的长度为50ALTER TABLE `student` MODIFY COLUMN `number` INT(50) ;更改字段类型ALTER TABLE `student` COLUMN `number` VARCHAR添加not null约束ALTER TABLE `student` ALTER COLUMN `number` INT NOT NUL设置主键ALTER TABLE `student` ADD CONSTRAINT `id` PRIMARY KEY(`id`)
6、MYSQL "ON DUPLICATE KEY UPDATE" 语法 如果在INSERT语句末尾指定了ON DUPLICATE KEYUPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE;如果不会导致唯一值列重复的问题,则插入新行。 例如,如果列 a 为 主键 或 拥有UNIQUE索引,并且包含值1,则以下两个语句具有相同的效果:
1 INSERT INTO TABLE (a,c) VALUES (1,3) ON DUPLICATE KEY UPDATE c=c+1;
2 UPDATE TABLE SET c=c+1 WHERE a=1; 如果行作为新记录被插入,则受影响行的值显示1;如果原有的记录被更新,则受影响行的值显示2。 这个语法还可以这样用: 如果INSERT多行记录(假设 a 为主键或 a 是一个 UNIQUE索引列): 1 1.INSERT INTO TABLE (a,c) VALUES (1,3),(1,7) ON DUPLICATE KEY UPDATE c=c+1; 执行后, c 的值会变为 4 (第二条与第一条重复, c 在原值上+1). 1 2.INSERT INTO TABLE (a,c) VALUES (1,3),(1,7) ON DUPLICATE KEY UPDATE c=VALUES(c); 执行后, c 的值会变为 7 (第二条与第一条重复, c 在直接取重复的值7). 注意:ON DUPLICATE KEY UPDATE只是MySQL的特有语法,并不是SQL标准语法! 这个语法和适合用在需要 判断记录是否存在,不存在则插入存在则更新的场景. 可以参考语法: http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#insert7、创建数据库CREATE DATABASE `you_db_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
8、查看存储过程select `name` from mysql.proc where db = 'your_db_name' and `type` = 'PROCEDURE'show procedure status;show create procedure proc_name;show create function func_name;
9、获取当前时间戳:SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%S') AS mysql_timestamp;SELECT DATE_FORMAT(CURRENT_TIMESTAMP(),'%Y-%m-%d %H:%i:%S') AS mysql_timestamp;SELECT DATE_FORMAT(SYSDATE(),'%Y-%m-%d %H:%i:%S') AS mysql_timestamp;SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),'%Y-%m-%d %H:%i:%S') AS mysql_timestamp;