`
hy2012_campus
  • 浏览: 29185 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论

mysql数据类型注意地方

 
阅读更多

CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

下面的表显示了将各种字符串值保存到 CHAR(4)和 VARCHAR(4)列后的结果,说明了 CHAR 和VARCHAR 之间的差别:

  char(4) 存储需求 varchar(4) 存储需求
 ‘ ’ ‘ ’ 4个字节 ‘ ’ 1个字节
‘ab’ 'ab' 4个字节 ‘ab’ 3个字节
'abcd' 'abcd' 4个字节 'abcd' 5个字节
'abcdef' 'abcd' 4个字节 'abcd' 5个字节


请注意上表中最后一行的值只适用不使用严格模式时;如果 MySQL 运行在严格模式,超过列长度不的值不保存,并且会出现错误。从 CHAR(4)和 VARCHAR(4)列检索的值并不总是相同,因为检索时从 CHAR 列删除了尾部的空格。通过下面的例子说明该差别:

mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
mysql> INSERT INTO vc VALUES ('ab  ','ab  ');
mysql> SELECT CONCAT(v, '+'), CONCAT(c, '+') FROM vc;


在使用 text 和 blob 字段类型时要注意以下几点,以便更好的发挥数据库的性能. 
  1. BLOB和TEXT值也会引起自己的一些问题,特别是执行了大量的删除或更新操作的时候。删除这种值会在数据表中留下很大的 "空洞",以后填入这些"空洞"的记录可能长度不同,为了提高性能,建议定期使用 OPTIMIZE TABLE 功能对这类表进行碎片整理.
  2. 使用合成的(synthetic)索引。合成的索引列在某些时候是有用的。一种办法是根据其它的列的内容建立一个散列值,并把这个值存储在单独的数据列中。接下来你就可以通过检索散列值找到数据行了。但是,我们要注意这种技术只能用于精确匹配的查询(散列值对于类似<或>=等范围搜索操作符 是没有用处的)。我们可以使用MD5()函数生成散列值,也可以使用SHA1()或CRC32(),或者使用自己的应用程序逻辑来计算散列值。请记住数值型散列值可以很高效率地存储。同样,如果散列算法生成的字符串带有尾部空格,就不要把它们存储在CHAR或VARCHAR列中,它们会受到尾部空格去除的影响。合成的散列索引对于那些BLOB或TEXT数据列特别有用。用散列标识符值查找的速度比搜索BLOB列本身的速度快很多。
  3. 在不必要的时候避免检索大型的BLOB或TEXT值。例如,SELECT *查询就不是很好的想 法,除非你能够确定作为约束条件的WHERE子句只会找到所需要的数据行。否则,你可能毫无目的地在网络上传输大量的值。这也是 BLOB或TEXT标识符信息存储在合成的索引列中对我们有所帮助的例子。你可以搜索索引列,决定那些需要的数据行,然后从合格的数据行中检索BLOB或 TEXT值。
  4. 把BLOB或TEXT列分离到单独的表中。在某些环境中,如果把这些数据列移动到第二张数据表中,可以让你把原数据表中 的数据列转换为固定长度的数据行格式,那么它就是有意义的。这会减少主表中的碎片,使你得到固定长度数据行的性能优势。它还使你在主数据表上运行 SELECT *查询的时候不会通过网络传输大量的BLOB或TEXT值。
浮点数与定点数:
    为了能够引起大家的重视,在介绍浮点数与定点数以前先让大家看一个例子:
mysql> CREATE TABLE test (c1 float(10,2),c2 decimal(10,2));
mysql> insert into test values(131072.32,131072.32);
mysql> select * from test;
 从上面的例子中我们看到 c1 列的值由 131072.32 变成了 131072.31,这就是浮点数的不精确性造成的。
在 mysql 中 float、double(或 real)是浮点数,decimal(或 numberic)是定点数。浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;它的缺点是会引起精度问题。
在今后关于浮点数和定点数的应用中,大家要记住以下几点:
1、浮点数存在误差问题;
2、对货币等对精度敏感的数据,应该用定点数表示或存储;
3、编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较;
4、要注意浮点数中一些特殊值的处理。
 
mysql>setsessionsql_mode='STRICT_TRANS_TABLES'
这样我们再执行同样的操作,mysql 就会告诉我们插入的值太长,操作被终止,
 
Sql_mode

描述

ANSI

更改语法和行为,使其更符合标准 SQL

STRICT_TRANS_T ABLES 如果不能将给定的值插入到事务表中,则放弃该语句。对于非事务表如果值出现在单行语句或多行语句的第 1 行,则放弃该语句

 

 

TRADITIONAL
ake MySQL 的行为象传统SQL 数据库系统。该模式的简单描述是当在列中插入不正确的值时给出错误而不是警告。注释:一旦发现错误立即放弃 INSERT/UPDATE。如果你使用非事务存储引擎,这种方式不是你想要的,因为出现错误前进行的数据更改不会滚动结果是更新只进行了一部分

 

 

 

分享到:
评论

相关推荐

    MySQL数据类型详解及部分使用范例

    MySQL数据类型数据类型数值类型整数类型使用实例浮点数和定点数类型使用实例日期类型使用实例字符串类型相关概念CHAR和VARCHARBINARY和VARBINARYTEXT和BLOBENUM:单选SET:多选使用范例小小的注意事项 数据类型 ...

    如何把sqlserver数据迁移到mysql数据库及需要注意事项

    一、SQL Server中常用数据类型与MySQL不同的地方 二、将SQL Server数据迁移到MySQL需要注意的一些问题 1、唯一索引的不同,sql server的唯一索引的字段只能允许存在一个null值,而mysql,一直oracle中唯一索引对应...

    mysql学习——数据表的基本操作

    嗯,接上一章数据库的基本操作后,这篇是基于数据表的基本操作,我们将数据库建立好后,就有创建...字段名1,数据类型[完整约束条件], 字段名2,数据类型[完整约束条件], 字段名3,数据类型[完整约束条件] ); 这样咱

    Win7下mysql5.5安装图文教程

    mysql安装比较简单,一般都是直接下一步,重点说一下需要注意的地方。 下载地址:https://www.mysql.com/downloads/ (1)选择安装类型 Typical:典型安装 Custom:自定义安装 Complete:完全安装 选择第二...

    将pymysql获取到的数据类型是tuple转化为pandas方式

    补充知识:python pymysql注意事项 cursor.execute 与 cursor.executemany有许多不同的地方 1. execute 中字段的值是字符串形式时必须加引号,但是executemany只需要使用占位符%s,pymysql利用给的参数list自动会...

    phpMyAdmin下将Excel中的数据导入MySql的图文方法

    一开始导入失败了。 生成的SQL语句不正确。 SQL 查询: ...当然表名和字段名要和mySQL的定义一致,同时数据的类型和长度要没有问题,才能导入成功。   您可能感兴趣的文章:使用phpexcel类实现excel

    快逸报表在J2EE部署中最简实例

    数据库类型选择相应的类型,数据源URL默认不是本机,需要修改,当然如果在其他机器上需要填写相应的IP地址,后面填写相应的数据库名字.下面填写数据用户名和密码.完成之后回到数据源窗口,选择刚创建的数据源,点击连接,...

    简单的ADO.net数据访问客户端

    简单的Ado.net数据访问客户端。 数据库访问入口 获取IDbClient 在开始之前,先添加一个数据库访问入口。当然,也可以使用任何你喜欢的方式来创建IDbClient(的实现类)实例。 public static class Db { private...

    POJOGenerator v1.3.3 Install(可视化POJO代码生成器最终版)

    3、可以预先在配置档generator.cfg.xml中设定您的数据类型映射方案,配置档中已经 提供了MS SQL Server/MySQL/DB2和Oracle两种映射方案,当然,可能有不太完整的地方 ,您可以根据实际情况稍作修改即可。需要注意的...

    自己使用Swing实现的POJOGenerator(POJO代码生成器 v1.2)

    3、可以预先在配置档generator.cfg.xml中设定您的数据类型映射方案,配置档中已经 提供了MS SQL Server和Oracle两种映射方案,当然,可能有不太完整的地方,您可以 根据实际情况稍作修改即可。需要注意的一点是ref...

    自己使用纯Swing写的POJOGenerator(POJO代码生成器) v1.2版

    3、可以预先在配置档generator.cfg.xml中设定您的数据类型映射方案,配置档中已经 提供了MS SQL Server和Oracle两种映射方案,当然,可能有不太完整的地方,您可以 根据实际情况稍作修改即可。需要注意的一点是ref...

    java初学者必看

    1.7.1 虚拟机数据类型 1.7.2 Java虚拟机的生命周期 1.7.3 Java虚拟机的体系结构 1.8 垃圾收集器 1.9 本章习题 第2章 Java开发环境 2.1 J2SE的下载和安装 2.1.1 J2SE的下载 2.1.2 J2SE的安装 2.2 环境变量的...

    蚂蚁分类信息系统mymps 1.6 utf8.rar

    一,后台数据库备份 默认数据改为2000K,并加上提示语,注意系统数据库的前缀 二,重写了栏目分类相关程序代码,为提高程序响应速度; 三,信息发布页重写代码,为应对机器人 四,信息发布完成后,加入再发一条...

    易语言程序免安装版下载

    注意:静态编译后常量数据位于PE文件的.rdata段中,只可读不可写,编程时请避免修改它们。譬如以下的代码,静态编译后就可能会出现问题: a = " " GetWindowTextA(hWnd, a, 20) 正确的代码为: a = 取空白文本 ...

    springmybatis

    查询出列表,也就是返回list, 在我们这个例子中也就是 List&lt;User&gt; , 这种方式返回数据,需要在User.xml 里面配置返回的类型 resultMap, 注意不是 resultType, 而这个resultMap 所对应的应该是我们自己配置的 ...

    蚂蚁分类信息系统mymps v1.6 GBK.zip

    一,后台数据库备份 默认数据改为2000K,并加上提示语,注意系统数据库的前缀 二,重写了栏目分类相关程序代码,为提高程序响应速度; 三,信息发布页重写代码,为应对机器人 四,信息发布完成后,加入再发一条...

    蚂蚁分类信息系统 mymps v1.6 UTF-8.zip

    一,后台数据库备份 默认数据改为2000K,并加上提示语,注意系统数据库的前缀 二,重写了栏目分类相关程序代码,为提高程序响应速度; 三,信息发布页重写代码,为应对机器人 四,信息发布完成后,加入再发一条...

    2009达内SQL学习笔记

    可以利用通配符创建比较特定数据的搜索模式,通配符只能用于文本,非文本数据类型不能使用通配符。 通配符在搜索模式中任意位置使用,并且可以使用多个通配符。 通配符%表示任何字符出现任意次数;还能代表搜索...

Global site tag (gtag.js) - Google Analytics