mysql 学习知识总结(一)

浮点数与定点数
为了能够引起大家的重视,在介绍浮点数与定点数以前先让大家看一个例子:
mysql> CREATE TABLE test (c1 float(10,2),c2 decimal(10,2));
Query OK, 0 rows affected (0.29 sec)
mysql> insert into test values(131072.32,131072.32);
Query OK, 1 row affected (0.07 sec)
mysql> select * from test;
+-----------+-----------+
| c1 | c2 |
+-----------+-----------+
| 131072.31 | 131072.32 |
+-----------+-----------+
1 row in set (0.00 sec)
从上面的例子中我们看到 c1 列的值由 131072.32 变成了 131072.31,这就是浮点数的
不精确性造成的。
在 mysql 中 float、double(或 real)是浮点数,decimal(或 numberic)是定点数。
浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;
它的缺点是会引起精度问题。
在今后关于浮点数和定点数的应用中,大家要记住以下几点:
1、浮点数存在误差问题;
2、对货币等对精度敏感的数据,应该用定点数表示或存储;
3、编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较;
4、要注意浮点数中一些特殊值的处理。
怎样选择合适的字符集
我们建议在能够完全满足应用的前提下,尽量使用小的字符集。因为更小的字符集意味着能够节省空间、减少网络传输字节数,同时由于存储空间的较小间接的提高了系统的性
能。
有很多字符集可以保存汉字,比如 utf8、gb2312、gbk、latin1 等等,但是常用的是
gb2312 和 gbk。因为 gb2312 字库比 gbk 字库小,有些偏僻字(例如:洺)不能保存,因此
在选择字符集的时候一定要权衡这些偏僻字在应用出现的几率以及造成的影响,不能做出肯
定答复的话最好选用 gbk。
SQL Mode 及相关问题
MySQL 服务器能够工作在不同的 SQL 模式下,并能针对不同的客户端以不同的方式应
用这些模式。
通过启动 mysqld 来设置默认的 SQL 模式。从 MySQL 4.1 开始,也能在启动之后,使用 SET [SESSION|GLOBAL] sql_mode='modes'语句,通过设置 sql_mode 变量更改模式。
通常在 linux 下安装完 mysql 后,默认的 sql-mode 值是空,在这种情形下 mysql 执行的是一种不严格的检查,例如日期字段可以插入 ’ 0000-00-00 00:00:00 ’这样的值,还有如果要插入的字段长度超过列定义的长度,那么 mysql 不会终止操作,而是会自动截断后面的字符继续插入操作
Sql_mode 值 描述
ANSI 更改语法和行为,使其更符合标准 SQL。
STRICT_TRANS_TABLES 如果不能将给定的值插入到事务表中,则放弃该语句。对于非事务表 ,如果值出现在单行语句或多行语句的第 1 行,则放弃该语句。本节后面给出了更详细的描述。
TRADITIONAL Make MySQL 的行为象“传统”SQL 数据库系统。该模式的简单描述是当在列中插入不正确的值时“给出错误而不是警告”。注释:一旦发现错误立即放弃 INSERT/UPDATE。如果你使用非事务存储引擎,这种方式不是你想要的,因为出现错误前进行的数据更改不会“滚动”,结果是更新“只进行了一部分”。
SQL Mode 与可移植性
如果 mysql 与其它异构数据库之间有数据移植的需求的话,那么下面的 sql_mode 的组
合设置可以达到相应的效果:
数据库 Sql_mode 值
DB2 PIPES_AS_CONCAT 、 ANSI_QUOTES 、 IGNORE_SPACE 、 NO_KEY_OPTIONS 、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS
MAXDB PIPES_AS_CONCAT 、 ANSI_QUOTES 、 IGNORE_SPACE 、 NO_KEY_OPTIONS 、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、 NO_AUTO_CREATE_USER
MSSQL PIPES_AS_CONCAT 、 ANSI_QUOTES 、 IGNORE_SPACE 、 NO_KEY_OPTIONS 、NO_TABLE_OPTIONS、 NO_FIELD_OPTIONS
ORACLE PIPES_AS_CONCAT 、 ANSI_QUOTES 、 IGNORE_SPACE 、 NO_KEY_OPTIONS 、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER
POSTGRESQL PIPES_AS_CONCAT 、 ANSI_QUOTES 、 IGNORE_SPACE 、 NO_KEY_OPTIONS 、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS
SQL Mode 与数据效验
SQL Mode 还可以实现对数据效验和转移等功能如:
·效验日期数据合法性.
·在 INSERT 或 UPDATE 过程中,如果被零除(或 MOD(X,0)),则产生错误
·将‘"’视为识别符引号(‘`’引号字符)
·禁用反斜线字符(‘\’)做为字符串内的退出字符。启用 NO_BACKSLASH_ESCAPES
模式,反斜线则成为普通字符。
·将||视为字符串连接操作符(+)(同 CONCAT()),而不视为 OR。