使用Mysql遇到的几个数据类型/格式的问题

来源:互联网 发布:淘宝开户流程 编辑:程序博客网 时间:2024/05/19 04:05
1.首先说下数据长度超长的问题
Mysql里当你的实际数据的长度,超过字段定义的长度后,而sql_mode模式又不是STRICT_TRANS_TABLES模式的话,Mysql默认会(只出现内部警告而不会显式的抛出错误信息)把数据截取成一个“错误”的最大值存储

点击(此处)折叠或打开

  1. CREATE TABLE test_col_overflow (
  2.     id_tinyint TINYINT,
  3.     id_int INT,
  4.     name_varchar VARCHAR (8)
  5. ) ENGINE = INNODB DEFAULT CHARSET = utf8;

  6. INSERT INTO test_col_overflow (id_tinyint)
  7. VALUES
  8.     (2560);

  9. SELECT
  10.     *
  11. FROM
  12.     test_col_overflow;

  13. SELECT
  14.     @@SESSION .sql_mode;


  15. SET SESSION sql_mode = 'STRICT_TRANS_TABLES';

  16. SELECT
  17.     @@SESSION .sql_mode;

  18. INSERT INTO test_col_overflow (id_tinyint)
  19. VALUES
  20.     (2560);

  21. SELECT
  22.     *
  23. FROM
  24.     test_col_overflow;
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类型,看个测试代码

点击(此处)折叠或打开

  1. BEGIN
  2.     DECLARE
  3.         d_stat_date date;
  4. SET d_stat_date = DATE_FORMAT(p_stat_date, '%Y-%m-%d');


  5. IF d_stat_date >= '2012-01-01'
  6. AND d_stat_date < '2013-09-01' THEN
  7.     SELECT
  8.         'test1';
  9. END IF;


  10. IF d_stat_date >= '2013-1-1' THEN
  11.     SELECT
  12.         'test2';
  13. END IF;


  14. IF d_stat_date >= '2013-01-01' THEN
  15.     SELECT
  16.         'test2b';
  17. END IF;


  18. IF d_stat_date >= '2013-8-1' THEN
  19.     SELECT
  20.         'test3';
  21. END IF;
  22. END

call test_date('2013-05-01')时程序结果只有两个结果
test1与test2b
这里要说的问题是mysql在平时查询时与存储过程中对日期类型的写法支持还不一样,比如日常查询,有一个日期列的查询条件你写成col_date='2013-5-1'是没问题能查出数据的初生婴儿用品清单

而当你在过程中再这样使用时她却不认你了。


0 0