LINUX 创建RAID5 和 LVM 逻辑卷
2014-08-20 13:49
239 查看
<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog01.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
有一天,执行
SELECT * FROM XXX_ORIGINAL_20031205
where msgid=62010388000012
语句,结果SQL Server报告出错:“将数据类型 varchar 转换为 numeric 时出错。”
这是什么意思呢?
Msgid这个字段的类型是:varchar(30)。
环境:[/b]
[/b]
数据库服务器:Microsoft SQL Server 2000以及7.0;
数据库服务器补丁:Microsoft SQL Server 2000 ServicePack1;
不是SQL Server突然不能从数字自动转换为字符串,而是单单对这个字段的数值有问题,这也和这个字段中实际已存储的字符串有关。
你看,我执行这个SQL语句是没有问题,可以自动转换:
SELECT * FROM XXXX_ORIGINAL_20031205
where recordid=62010388000012
recordid这个字段的类型也是:varchar(30)。
这为什么就可以呢?
为什么?[/b]
[/b]
这是因为msgid字段的真实数值是类似于这样的字符串“12051113280101053509”,由于你的SQL命令中要求拿字符串跟我们提供的这个数字62010388000012匹配,所以SQLServer默认要把这么多个“12051113280101053509”先统统转换为数字,再去跟62010388000012匹配。
(首先这就涉及到一个效率问题,转换这么多msgid成为数字,再跟你的数字匹配,将是一个多么大的浪费啊)
当然,这回SQLServer转不过来了,因为“12051113280101053509”换为数字实在太大了,超出了范围,所以你看SQLServer于是乎报告“将数据类型 varchar 转换为 numeric 时出错”,他指的就是把历史数据“12051113280101053509”这个varchar(30)转成numeric不行,而不是把你SQL脚本传递的参数62010388000012转换失败。
让我们看看另一种形式的错误,就更清楚了:
我们执行
SELECT * FROM XXXX_ORIGINAL_20031205
where msgid=120
命令就会得到错误:
varchar 值 '12050003010101026986' 的转换溢出了 int 列。超出了最大整数值。
这个错误,是不是很清楚地表明了SQLServer在帮你执行SQL命令时背后所作的事情?
他试图帮你主动把记录中的这个字段转换成你在SQL命令中指明的那个数据类型。
但是,第一,SQL Server不是转换你的脚本命令中的数值,而是转换已有的历史数据到你指定的那个类型,所以会增加执行时间;第二,容易转换出错。
所以,切忌让SQLServer自己判断,自动帮你转换,那样将降低执行效率,而且增加出错几率。你能够显式告诉SQL Server你的数据类型的话,就请一定这么做。
Writen by zhengyun.NoJunk(at)tomosoft.dot.com
本文档所包含的信息代表了在发布之日,ZhengYun 对所讨论问题的当前看法,Zhengyun 不保证所给信息在发布之日以后的准确性。
本文档仅供参考。对本文档中的信息,Zhengyun 不做任何明示或默示的保证。
用户必须遵守所有适用的版权法。在不对版权法所规定的权利加以限制的情况下,如未得到 zhengyun和CSDN.Net明确的书面许可,不得出于任何目的、以任何形式或手段(电子的、机械的、影印、录制等等)复制、传播本文的任何部分,也不得将其存储或引入到检索系统中。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=12744
为什么不要让SQLServer帮你自动转换SQL命令中的数据类型
Report Date[/b]:[/b] [/b]<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><chsdate w:st="on" isrocdate="False" islunardate="False" day="5" month="12" year="2003"><span lang="EN-US" style="FONT-FAMILY: Arial">2003/12/5</span></chsdate><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> | Prepared by:[/b] [/b]郑昀 |
Article last modified on <chsdate w:st="on" isrocdate="False" islunardate="False" day="16" month="2" year="2004">2004-2-16</chsdate> [/b] | |
The information in this article applies to: ü Microsoft SQL Server 2000,7.0 |
问题陈述:
有一天,执行SELECT * FROM XXX_ORIGINAL_20031205
where msgid=62010388000012
语句,结果SQL Server报告出错:“将数据类型 varchar 转换为 numeric 时出错。”
这是什么意思呢?
Msgid这个字段的类型是:varchar(30)。
环境:[/b]
[/b]
数据库服务器:Microsoft SQL Server 2000以及7.0;
数据库服务器补丁:Microsoft SQL Server 2000 ServicePack1;
原因分析:
不是SQL Server突然不能从数字自动转换为字符串,而是单单对这个字段的数值有问题,这也和这个字段中实际已存储的字符串有关。你看,我执行这个SQL语句是没有问题,可以自动转换:
SELECT * FROM XXXX_ORIGINAL_20031205
where recordid=62010388000012
recordid这个字段的类型也是:varchar(30)。
这为什么就可以呢?
为什么?[/b]
[/b]
这是因为msgid字段的真实数值是类似于这样的字符串“12051113280101053509”,由于你的SQL命令中要求拿字符串跟我们提供的这个数字62010388000012匹配,所以SQLServer默认要把这么多个“12051113280101053509”先统统转换为数字,再去跟62010388000012匹配。
(首先这就涉及到一个效率问题,转换这么多msgid成为数字,再跟你的数字匹配,将是一个多么大的浪费啊)
当然,这回SQLServer转不过来了,因为“12051113280101053509”换为数字实在太大了,超出了范围,所以你看SQLServer于是乎报告“将数据类型 varchar 转换为 numeric 时出错”,他指的就是把历史数据“12051113280101053509”这个varchar(30)转成numeric不行,而不是把你SQL脚本传递的参数62010388000012转换失败。
让我们看看另一种形式的错误,就更清楚了:
我们执行
SELECT * FROM XXXX_ORIGINAL_20031205
where msgid=120
命令就会得到错误:
varchar 值 '12050003010101026986' 的转换溢出了 int 列。超出了最大整数值。
这个错误,是不是很清楚地表明了SQLServer在帮你执行SQL命令时背后所作的事情?
他试图帮你主动把记录中的这个字段转换成你在SQL命令中指明的那个数据类型。
我的建议:
很多时候,我们懒得去看某个字段到底是什么类型,是char,还是tinyint,还是bool,还是varchar,我们就随便写一个数字,让聪明的SQL Server自己去判断该转成什么。但是,第一,SQL Server不是转换你的脚本命令中的数值,而是转换已有的历史数据到你指定的那个类型,所以会增加执行时间;第二,容易转换出错。
所以,切忌让SQLServer自己判断,自动帮你转换,那样将降低执行效率,而且增加出错几率。你能够显式告诉SQL Server你的数据类型的话,就请一定这么做。
Writen by zhengyun.NoJunk(at)tomosoft.dot.com
Disclaimers:
本文档所包含的信息代表了在发布之日,ZhengYun 对所讨论问题的当前看法,Zhengyun 不保证所给信息在发布之日以后的准确性。本文档仅供参考。对本文档中的信息,Zhengyun 不做任何明示或默示的保证。
用户必须遵守所有适用的版权法。在不对版权法所规定的权利加以限制的情况下,如未得到 zhengyun和CSDN.Net明确的书面许可,不得出于任何目的、以任何形式或手段(电子的、机械的、影印、录制等等)复制、传播本文的任何部分,也不得将其存储或引入到检索系统中。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=12744
相关文章推荐
- Linux LVM逻辑卷配置过程详解(创建,增加,减少,删除,卸载)
- Linux中创建LVM逻辑卷并限制磁盘配额
- GNU/Linux下LVM配置管理以及快照卷、物理卷、卷组、逻辑卷的创建和删除
- Linux下配置RAID5 LVM逻辑卷及磁盘配额的实验
- Linux中LVM的逻辑卷创建
- Linux创建LVM逻辑卷及实现磁盘配额
- 【Linux】创建逻辑卷管理(LVM)
- 实战Linux下逻辑卷LVM详细配置之创建、删除、修改
- Linux 逻辑卷LVM创建扩展删除实例
- (转)Linux LVM逻辑卷配置过程详解(创建、扩展、缩减、删除、卸载、快照创建)
- Linux系统LVM逻辑卷创建过程以及自动化脚本
- LVM逻辑卷管理一PV/VG/LV的创建-Linux
- GNU/Linux下LVM配置管理以及快照卷、物理卷、卷组、逻辑卷的创建和删除
- Linux LVM逻辑卷配置过程详解(创建,增加,减少,删除,卸载)
- LVM逻辑卷管理一PV/VG/LV的创建-Linux
- Linux LVM逻辑卷配置过程详解(创建,增加,减少,删除,卸载)
- LINUX 下创建RAID5以及LVM磁盘配额
- 浅谈Linux磁盘存储管理续【逻辑卷管理(LVM)】
- 怎样使用kickstart创建逻辑卷管理(LVM)分区?