2011年10月8日星期六
MySQL必知必会 chap 23-28
CREATE PROCEDURE testgetavg()
BEGIN
select avg(some_value) from sometable;
END
调用存储过程 call testgetavg();
CREATE PROCEDURE productpric ( OUT pl DECMAL (8,2) )
BEGIN
SELECT Min(prod_price) INTO pl FROM products;
END;
关键字OUT指定存储过程输出,IN 传入,INOUT 传入传出
查看存储过程:SHOW PROCEDURE STATUS;
MySQL游标只能用于存储过程
触发器是MySQL响应Delete/Insert/Update事件时自动执行的一条语句
事务处理,保留点提供回退,COMMIT/ROLLBACK/SAVEPOINT
字符集:字母和符号表示
编码:某个字符集成员内部表示
GRANT 授权 REVOKE取消授权
MySQL必知必会 chap 17-22
MyISAM引擎支持全文本查询,InnoDB不支持全文本查询
指定全文索引FULLTEXT(some_column),不要在导入数据时使用FULLTEXT。在所有数据都导入完毕后,再添加FULLTEXT
全文搜索时,Match指定列,Against指定搜索表达式,默认不区分大小写:select node_text from products WHERE Match(note_text) Against('rabbit');
指定IN BOOLEAN MODE可以进行更细致的全文搜索,但性能较差
如果数据检索较为重要,可以指定INSERT LOW_PRIORITY INTO降低插入操作的优先级
将select结果写入另一张表:INSERT INTO table_a(column_a, column_b) SELECT column_a, column_b from table_b;
指定更新数据在某些行出错的时候也继续执行:UPDATE IGNORE sometable …
删除表中所有行 TRUNCATE TABLE sometable;
建表:
CREATE TABLE IF NOT EXISTS customers (
id int NOT NULL AUTO_INCREMENT,
name char(50) NOT NULL DEFAULT 'test_name',
PRIMARY KEY (id)
) ENGINE=InnoDB;
每个表只允许一个AUTO_INCREMENT列,并且它必须被索引(成为主键)
几个引擎:
InnoDB 支持事务处理,不支持全文本搜索
MyISAM 不支持事务处理,支持全文本搜索
MEMORY 功能等同于MyISAM,但数据存在内存中(不在磁盘中),速度很快(特别适合临时表)
定义外键:ALTER TABLE sometable_a ADD CONSTRAINT sometable_a_column FOREIGN KEY (vend_id) REFERENCES vendors (vend_id);
重命名表 RENAME TABLE table_a TO table_b;
视图只包含使用时动态检索数据的查询,视图不能索引,也不能有关联的触发器或默认值
查看视图:SHOW CREATE VIEW someview;
建立视图:CREATE VIEW someview AS SELECT column_a,column_b FROM sometable;
视图一般用于检索,而不用于更新或删除
2011年9月18日星期日
MySQL 必知必会 chap 1-16
显示表的列:show columns from sometable; 或 describe sometable;
查看创建表的语句:show create table sometable;
限制查询返回的开始行和行数:select somecolumn from sometable limit 3 offest 5;
查询某个列取值在5和10之间的行:select somecolumn_a, somecolumn_b from sometable where somecolumn_b between 5 and 10;
查询某个列取值在某个集合内的行:select somecolumn_a, somecolumn_b from sometable where somecolumn_b in (3, 5, 7);
下划线匹配单个任意字符:select * from sometable where somecolumn like '_test';
尽量不要把通配符置于搜索模式的开始处
REGEXP正则匹配默认不区分大小写,要区分大小写,可使用BINARY关键字:select somecolumn_a from sometable where somecolumn_b REGEXP BINARY ‘abc .999’;
日期比较:select * from sometable where Date(somedate) between ‘2011-07-01’ and ‘2011-09-30’;
过滤分组:select cust_id count( * ) as orders from ordertable group by cust_id having count( * ) >= 2 ;
2011年1月2日星期日
CodeIgniter + Mysql : 中文表单乱码问题
上周用CodeIgniter搞了2个简单的前台页面,发现表单传中文内容正常,往Mysql的表里写的时候总是乱码。
折腾了一阵,总算搞定,参考资料如下:
配置说明:
mysql编码配置:
mysql建表命令:
create table sometable ( id int unsigned, user varchar(30), test text);
CodeIgniter的system\application\config\config.php中设置:
CodeIgniter的system\application\config\database.php设置:
使用说明:
- php文件的编码是gb2312,用 $this->db->insert($table, $data); 往表里插数据是正常的gb2312编码。
- perl脚本的编码是gb2312,用DBI连接数据库时不用显式指定编码,可直接取回表中gb2312编码的内容。