diff --git a/framework/yii/db/ColumnSchema.php b/framework/yii/db/ColumnSchema.php
index ffdafd4..83453e4 100644
--- a/framework/yii/db/ColumnSchema.php
+++ b/framework/yii/db/ColumnSchema.php
@@ -88,6 +88,9 @@ class ColumnSchema extends \yii\base\Component
 		if ($value === null || gettype($value) === $this->phpType || $value instanceof Expression) {
 			return $value;
 		}
+		if ($value === '' && $this->type !== Schema::TYPE_TEXT && $this->type !== Schema::TYPE_STRING) {
+			return null;
+		}
 		switch ($this->phpType) {
 			case 'string':
 				return (string)$value;
diff --git a/framework/yii/db/QueryBuilder.php b/framework/yii/db/QueryBuilder.php
index 67a8dc3..09d7624 100644
--- a/framework/yii/db/QueryBuilder.php
+++ b/framework/yii/db/QueryBuilder.php
@@ -94,6 +94,11 @@ class QueryBuilder extends \yii\base\Object
 	 */
 	public function insert($table, $columns, &$params)
 	{
+		if (($tableSchema = $this->db->getTableSchema($table)) !== null) {
+			$columnSchemas = $tableSchema->columns;
+		} else {
+			$columnSchemas = array();
+		}
 		$names = array();
 		$placeholders = array();
 		foreach ($columns as $name => $value) {
@@ -106,7 +111,7 @@ class QueryBuilder extends \yii\base\Object
 			} else {
 				$phName = self::PARAM_PREFIX . count($params);
 				$placeholders[] = $phName;
-				$params[$phName] = $value;
+				$params[$phName] = isset($columnSchemas[$name]) ? $columnSchemas[$name]->typecast($value) : $value;
 			}
 		}
 
@@ -164,6 +169,12 @@ class QueryBuilder extends \yii\base\Object
 	 */
 	public function update($table, $columns, $condition, &$params)
 	{
+		if (($tableSchema = $this->db->getTableSchema($table)) !== null) {
+			$columnSchemas = $tableSchema->columns;
+		} else {
+			$columnSchemas = array();
+		}
+
 		$lines = array();
 		foreach ($columns as $name => $value) {
 			if ($value instanceof Expression) {
@@ -174,7 +185,7 @@ class QueryBuilder extends \yii\base\Object
 			} else {
 				$phName = self::PARAM_PREFIX . count($params);
 				$lines[] = $this->db->quoteColumnName($name) . '=' . $phName;
-				$params[$phName] = $value;
+				$params[$phName] = isset($columnSchemas[$name]) ? $columnSchemas[$name]->typecast($value) : $value;
 			}
 		}
 
diff --git a/framework/yii/db/mysql/QueryBuilder.php b/framework/yii/db/mysql/QueryBuilder.php
index ae6949a..a39d124 100644
--- a/framework/yii/db/mysql/QueryBuilder.php
+++ b/framework/yii/db/mysql/QueryBuilder.php
@@ -161,6 +161,12 @@ class QueryBuilder extends \yii\db\QueryBuilder
 	 */
 	public function batchInsert($table, $columns, $rows)
 	{
+		if (($tableSchema = $this->db->getTableSchema($table)) !== null) {
+			$columnSchemas = $tableSchema->columns;
+		} else {
+			$columnSchemas = array();
+		}
+
 		foreach ($columns as $i => $name) {
 			$columns[$i] = $this->db->quoteColumnName($name);
 		}
@@ -168,7 +174,10 @@ class QueryBuilder extends \yii\db\QueryBuilder
 		$values = array();
 		foreach ($rows as $row) {
 			$vs = array();
-			foreach ($row as $value) {
+			foreach ($row as $i => $value) {
+				if (isset($columnSchemas[$columns[$i]])) {
+					$value = $columnSchemas[$columns[$i]]->typecast($value);
+				}
 				$vs[] = is_string($value) ? $this->db->quoteValue($value) : $value;
 			}
 			$values[] = '(' . implode(', ', $vs) . ')';