显示标签为“MySQL”的博文。显示所有博文
显示标签为“MySQL”的博文。显示所有博文

2011年10月8日星期六

MySQL必知必会 chap 23-28

存储过程可认为是一条或多条MySQL语句的集合

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

用UNION组合多个select查询,默认会去掉重复行;用UNION ALL则会保留重复行

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’;

2011-09-18_230234

日期比较: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_charset.png

mysql建表命令:

   create table sometable (
   id int unsigned,
   user varchar(30),
   test text);

CodeIgniter的system\application\config\config.php中设置:

codeigniter_config_charset.png

CodeIgniter的system\application\config\database.php设置:

codeigniter_db_charset.png

使用说明:

  • php文件的编码是gb2312,用 $this->db->insert($table, $data); 往表里插数据是正常的gb2312编码。
  • perl脚本的编码是gb2312,用DBI连接数据库时不用显式指定编码,可直接取回表中gb2312编码的内容。