1.首先说下数据长度超长的问题
Mysql里当你的实际数据的长度,超过字段定义的长度后,而sql_mode模式又不是STRICT_TRANS_TABLES模式的话,Mysql默认会( 只出现内部警告而不会显式的抛出错误信息 )把数据截取成一个 “错误”的 最大值存储
oracle中会直接抛出错误信息,不需要什么设置。
或许应该合理的设置mysql的sql_mode
http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html
http://www.jb51.net/article/28018.htm
2.枚举型的问题
第一次接触使用这个数据类型时,很喜欢她,喜欢归喜欢,使用时却也得注意,尤其是 用数字做为枚举成员, 不注意会有“坑”^_^
(因为在做数据仓库数据探察时有童鞋只依据列值而不看列的数据类型定义,源系统是枚举型而仓库或ODS层用了数值型, 就会悲剧 ),其实 用数字做为枚举成员 这个Mysql官方也是不建议使用的
http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#enum
3.坑爹的date类型,看个测试代码
call test_date('2013-05-01')时程序结果只有两个结果
test1与test2b
这里要说的问题是mysql在平时查询时与存储过程中对日期类型的写法支持还不一样,比如日常查询,有一个日期列的查询条件你写成col_date='2013-5-1'是没问题能查出数据的初生婴儿用品清单
Mysql里当你的实际数据的长度,超过字段定义的长度后,而sql_mode模式又不是STRICT_TRANS_TABLES模式的话,Mysql默认会( 只出现内部警告而不会显式的抛出错误信息 )把数据截取成一个 “错误”的 最大值存储
点击(此处)折叠或打开
- CREATE TABLE test_col_overflow (
- id_tinyint TINYINT,
- id_int INT,
- name_varchar VARCHAR (8)
- ) ENGINE = INNODB DEFAULT CHARSET = utf8;
-
- INSERT INTO test_col_overflow (id_tinyint)
- VALUES
- (2560);
-
- SELECT
- *
- FROM
- test_col_overflow;
-
- SELECT
- @@SESSION .sql_mode;
-
-
- SET SESSION sql_mode = 'STRICT_TRANS_TABLES';
-
- SELECT
- @@SESSION .sql_mode;
-
- INSERT INTO test_col_overflow (id_tinyint)
- VALUES
- (2560);
-
- SELECT
- *
- FROM
- test_col_overflow;

或许应该合理的设置mysql的sql_mode
http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html
http://www.jb51.net/article/28018.htm
2.枚举型的问题
第一次接触使用这个数据类型时,很喜欢她,喜欢归喜欢,使用时却也得注意,尤其是 用数字做为枚举成员, 不注意会有“坑”^_^
(因为在做数据仓库数据探察时有童鞋只依据列值而不看列的数据类型定义,源系统是枚举型而仓库或ODS层用了数值型, 就会悲剧 ),其实 用数字做为枚举成员 这个Mysql官方也是不建议使用的
http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#enum
3.坑爹的date类型,看个测试代码
点击(此处)折叠或打开
- BEGIN
- DECLARE
- d_stat_date date;
- SET d_stat_date = DATE_FORMAT(p_stat_date, '%Y-%m-%d');
-
-
- IF d_stat_date >= '2012-01-01'
- AND d_stat_date < '2013-09-01' THEN
- SELECT
- 'test1';
- END IF;
-
-
- IF d_stat_date >= '2013-1-1' THEN
- SELECT
- 'test2';
- END IF;
-
-
- IF d_stat_date >= '2013-01-01' THEN
- SELECT
- 'test2b';
- END IF;
-
-
- IF d_stat_date >= '2013-8-1' THEN
- SELECT
- 'test3';
- END IF;
- END
call test_date('2013-05-01')时程序结果只有两个结果
test1与test2b
这里要说的问题是mysql在平时查询时与存储过程中对日期类型的写法支持还不一样,比如日常查询,有一个日期列的查询条件你写成col_date='2013-5-1'是没问题能查出数据的初生婴儿用品清单
而当你在过程中再这样使用时她却不认你了。