标签归档:MySQL

proc_open使用一例

平时工作中很少用到proc_open这个函数,最近用这个函数做了一个数据库管理小程序。

实现如下:


//file name db.php
$mysql_list = array(
'test' => 'mysql -hlocalhost -utest -p123456 -P3306 test',
'test2' => 'mysql -h172.16.190.199 -utest2 -p654321 -P3306 test2',
);
$desc = array(
0 => STDIN,
1 => STDOUT,
2 => STDERR,
);
$flag = @$argv[1];
$env = $_ENV;
$cwd = getcwd();
if(!isset($mysql_list[$flag]))
{
exit("can not found the $flag");
}
$re = proc_open($cmd, $desc, $pipes, $cwd, $env);
if(!$re)
{
exit('failed to execute cmd');
}

这样有很多数据库需要管理的时候就比较容易了,直接配置下连接参数,然后:

php db.php test

简单实用吧~

补一个bash实现的。

#!/bin/bash
flag=$1;
case $flag in
'test')
(mysql -hlocalhost -utest -p123456 -P3306 test);
;;
'test2')
(mysql -h172.16.190.199 -utest2 -p654321 -P3306 test2);
;;
*)
echo 'can not found the flag cmd';
;;
esac;

MySQL中得到当前使用的数据库

在MySQL中用use 切换使用的数据库(或者在PHP中用mysql_select_db函数),反过来我们怎样知道正在使用的是哪个数据库呢?

这种需求很少遇到,但是还是会遇到的:)

所以找了一下,发现MySQL可以通过select databse()命令来查看当前使用的数据库。

ps:MySQL database函数

推荐:Stop Making Apps

再搭车推荐:

《他们在毕业的前一天爆炸 》《听说》《那些年,我们一起追的女孩》值得一看

SQL中LIKE的另类玩法

设想一个场景,我有个关键词屏蔽词库(应该很多网站都有吧),所有的关键词都存储在MySQL中,怎样查询某个字符串是否含有屏蔽关键词?

比如我们有一个屏蔽词 tom,要屏蔽任何含有tom的词语。

通常情况下LIKE这样用

SELECT * FROM `table` WHERE field LIKE ‘%字符串%’

下面我们这样玩,来解决上面的问题

SELECT * FROM `table` WHERE ‘字符串’ LIKE CONCAT(‘%’,field,’%’)

PS:

这让我想起了初中时数学课中经常用来做几何证明的逆向思考方式。

mysql 跨库的触发器

今天遇到一个问题,想通过写一个垮库的触发器来解决。
其实垮库的触发器和同一个库的触发器,没有多大的区别。
只需要在操作的表前面加上数据库就可以了。

另外,触发器是存储在存在触发事件的表对应的数据库中的,
但是在触发执行语句中不用显示的更换数据库(use database)。

示例代码:


#示例1
DELIMITER $
USE `tom`$
DROP TRIGGER /*!50032 IF EXISTS */ `trigger1`$
CREATE
/*!50017 DEFINER = 'root'@'localhost' */
TRIGGER `trigger1` AFTER INSERT ON `tom`.`stu`
FOR EACH ROW BEGIN
INSERT INTO `test`.`coder` VALUES(new.id,new.name);
END
$
DELIMITER ;
#示例2
DELIMITER & USE `shine` &
DROP TRIGGER IF EXISTS `object_permission_trigger` &
CREATE TRIGGER `object_permission_trigger` AFTER UPDATE ON `object`
FOR EACH ROW BEGIN IF old.type = 'product' OR old.type = 'business' THEN
UPDATE `permission` SET `name` = REPLACE( `name` , old.name, new.name )
WHERE `object_id` = old.id;

END IF ;

END &
DELIMITER;

关于触发器

【转载】MySQL 常用用户管理命令


1、添加用户

本机访问权限:
mysql> GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost'
-> IDENTIFIED BY 'password' WITH GRANT OPTION;
远程访问权限:
mysql> GRANT ALL PRIVILEGES ON *.* TO 'username'@'%'
-> IDENTIFIED BY 'password' WITH GRANT OPTION;
另外还有一种方法是直接Insert INTO user,注意这种方法之后需要 FLUSH PRIVILEGES 让服务器重读授权表。

insert into user(host,user,password,ssl_cipher,x509_issuer,x509_subject)
values(‘localhost’,'xff’,password(‘xff’),”,”,”);
FLUSH PRIVILEGES;
note:1)必须要加上ssl_cipher,x509_issuer,x509_subject三列,以为其默认值不为空(数据库版本为:5.0.51b)
2)FLUSH PRIVILEGES重载授权表,使权限更改生效
3)mysql是通过User表,Db表,Host表,Tables_priv 表,Columns_priv 表这5张表实现用户权限控制,均可以通过直接对这些表的操作以达到对用户的管理

2、删除用户

drop user admin@localhost;(@不加默认为“%”)

3、权限回收
revoke delete on test.* from admin@'localhost';

4、创建用户授权一起实现
grant select,insert,update,delete on *.* to 'admin2′@'%'
identified by ‘admin2′ with grant option;
note:在mysql中,如果@后面的登录范围不同,帐号可以一样

5、限制用户资源

mysql> GRANT ALL ON customer.* TO 'francis'@'localhost'
-> IDENTIFIED BY 'frank'
-> WITH MAX_QUERIES_PER_HOUR 20
-> MAX_UPDATES_PER_HOUR 10
-> MAX_CONNECTIONS_PER_HOUR 5
-> MAX_USER_CONNECTIONS 2;

6、用户密码设置

使用mysqladmin:
shell> mysqladmin -u user_name -h host_name password "newpwd"
或在mysql里执行语句:
mysql> SET PASSWORD FOR 'username'@'%'
= PASSWORD('password');
如果只是更改自己的密码,则:
mysql> SET PASSWORD = PASSWORD(‘password’);
在全局级别使用GRANT USAGE语句(在*.*)来指定某个账户的密码:
mysql> GRANT USAGE ON *.* TO 'username'@'%'
IDENTIFIED BY 'password';
或直接修改MySQL库表:
mysql> UPDATE user SET Password = PASSWORD('bagel')
-> WHERE Host = '%' AND User = 'francis';
mysql> FLUSH PRIVILEGES;

修改root密码:
update mysql.user set password=password(‘passw0rd’) where user=’root’;
FLUSH PRIVILEGES;

7、关于加密
mysql> select PASSWORD('password');
+-------------------------------------------+
| PASSWORD('password') |
+-------------------------------------------+
| *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 |
+-------------------------------------------+
1 row in set (0.00 sec)

mysql> select MD5('hello');
+----------------------------------+
| MD5('hello') |
+----------------------------------+
| 5d41402abc4b2a76b9719d911017c592 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select SHA1('abc');

-> 'a9993e364706816aba3e25717850c26c9cd0d89d'

SHA1()是为字符串算出一个 SHA1 160比特检查和,如RFC 3174 (安全散列算法)中所述。

8、授权精确到列
grant select (cur_url,pre_url) on test.abc to admin@localhost;

原文:http://www.ha97.com/4109.html

再谈MySQL乱码问题

MySQL乱码问题确实是一个比较头痛的问题。

前些天又遇到了MySQL的乱码问题,本来我自己做网站的话,现在不会遇到乱码。但是前些天接手的一个网站,前期是一个老师弄了一段时间,然后又找我帮忙弄得,所以到最后迁移的时候又遇到了的编码问题。

在解决的时候找到了一个办法。场景是这样的,我们是用DEDE做的网站,原先使用GBK做的,后来要迁移到UTF8上来。我们知道直接在数据库中改变编码会导致数据库中的数据直接在数据库中存储的都是乱码,所以我这样解决的问题,用phpMyAdmin的导出功能导出GBK编码的数据,然后打开导出的SQL文件,然后搜索替换里面的GBK关键词为UTF8,然后接SQL导出文件导入到目标机器。这样就可以平滑的将数据库由GBK变为UTF8的编码。