先上段php代码,摘录自liu21st的DbMysql.class.php
- /**
- * 连接数据库方法
- * @access public
- * @throws ThinkExecption
- */
- public function connect($config='',$linkNum=0,$force=false) {
- if ( !isset($this->linkID[$linkNum]) ) {
- if(empty($config)) $config = $this->config;
- // 处理不带端口号的socket连接情况
- $host = $config['hostname'].($config['hostport']?":{$config['hostport']}":'');
- // 是否长连接
- $pconnect = !empty($config['params']['persist'])? $config['params']['persist']:$this->pconnect;
- if($pconnect) {
- $this->linkID[$linkNum] = mysql_pconnect( $host, $config['username'], $config['password'],131072);
- }else{
- $this->linkID[$linkNum] = mysql_connect( $host, $config['username'], $config['password'],true,131072);
- }
- if ( !$this->linkID[$linkNum] || (!empty($config['database']) && !mysql_select_db($config['database'], $this->linkID[$linkNum])) ) {
- throw_exception(mysql_error());
- }
- $dbVersion = mysql_get_server_info($this->linkID[$linkNum]);
- //使用UTF8存取数据库
- mysql_query("SET NAMES '".C('DB_CHARSET')."'", $this->linkID[$linkNum]);
- //设置 sql_model
- if($dbVersion >'5.0.1'){
- mysql_query("SET sql_mode=''",$this->linkID[$linkNum]);
- }
- // 标记连接成功
- $this->connected = true;
- // 注销数据库连接配置信息
- if(1 != C('DB_DEPLOY_TYPE')) unset($this->config);
- }
- return $this->linkID[$linkNum];
- }
php
每次连接mysql,会先执行set name为配置的字符集,以及set sql_mode=''。
但正常我们会在my.cnf配置为sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES!!!
解释一下:
NO_ENGINE_SUBSTITUTION:引擎可用模式,如果建立的表使用的引擎不可用则返回ERROR
STRICT_TRANS_TABLES:严格模式,插入非法的值返回ERROR
因此出现使用该驱动类的php程序,即使插入的数据不合法,也不会报错。
- admin test>show create table t_innodb\G
- *************************** 1. row ***************************
- Table: t_innodb
- Create Table: CREATE TABLE `t_innodb` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `name` varchar(20) DEFAULT NULL,
- `age` int(11) NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
- 1 row in set (0.00 sec)
- admin test>show global variables like 'sql_mode';
- +---------------+--------------------------------------------+
- | Variable_name | Value |
- +---------------+--------------------------------------------+
- | sql_mode | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
- +---------------+--------------------------------------------+
- 1 row in set (0.00 sec)
- admin test>insert into t_innodb(name) values('b');
- ERROR 1364 (HY000): Field 'age' doesn't have a default value
- admin test>set sql_mode='';
- Query OK, 0 rows affected (0.00 sec)
- admin test>insert into t_innodb(name) values('b');
- Query OK, 1 row affected, 1 warning (0.00 sec)
- admin test>show warnings;
- +---------+------+------------------------------------------+
- | Level | Code | Message |
- +---------+------+------------------------------------------+
- | Warning | 1364 | Field 'age' doesn't have a default value |
- +---------+------+------------------------------------------+
- 1 row in set (0.00 sec)
pgsql
Comments