机房收费系统 —— 【数据类型与夺命“91”】

【登录窗体】

问题一:实时错误“91”:

问题原因:数据库中设置数据类型是varchar(10),即字符串长度最大为10,而我在敲代码是未限制输入字符串长度,所以报错!

机房收费系统 —— 【数据类型与夺命“91”】_第1张图片

解决方案:代码限制输入字符长度!(不限制字符串长度,此问题在其他窗体也会出现!)

【代码】:

Private Sub txtpassword_KeyPress(KeyAscii As Integer)
    txtpassword.MaxLength = 18  '限制长度为18
    
    Select Case KeyAscii
        Case 8  '退格
        Case Asc("A") To Asc("Z")  '可输入大写英文字母:A-Z
        Case Asc("0") To Asc("9")   '可输入数字:0-9
        Case Asc("a") To Asc("z")   '可输入小写英文字母:A-Z
        Case Else
        KeyAscii = 0
    End Select
End Sub

Private Sub txtusername_KeyPress(KeyAscii As Integer)   '限制用户名只能输入数字和退格键
    txtusername.MaxLength = 10  '限制长度为10

    Select Case KeyAscii
        Case 8 '退格
        Case Asc("0") To Asc("9")
        Case Else
        KeyAscii = 0
    End Select

End Sub

你认为这样就解决问题了吗?!NoNONo,没有你想象中那么简单,如果用户名(对应数据库中userID)使用的是char或者varchar型的数据类型,那么在后边组合查询是需要用到比较userID大小的问题时会出现新的问题,原因是char或者varchar类型的数据不可比较大小,所以要考虑userID应该是否适合使用varchar型的数据类型!答案是否定的,我们需要比较其大小,所以我们需要使用int(整数型)型的数据类型,当然密码是不需要比较大小的,使用varchar正好。OK,那我们把数据类型改为int型。

看,改完int型之后,“夺命91”又出现,天哪,“夺命91”确实厉害呀!

机房收费系统 —— 【数据类型与夺命“91”】_第2张图片

貌似还是这个问题,那是为啥呢?已经设置了最大输入字符为10位,怎么还是溢出呢?那就得具体了解一下 int 数据类型啦!

(1)int为整数型,用于定义整数类型的数据 。

(2)一个正常大小整数。有符号的范围是-2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字),无符号的范围是0到4294967295。一位大小为 4 个字节。

有符号& 无符号?

整型有无符号(unsigned)和有符号(signed)两种类型,在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。

无符号整型和有符号整型的区别就是无符号类型可以存放的正数范围比有符号整型中的范围大一倍,因为有符号类型将最高位储存符号,而无符号类型全都储存数字。

机房收费系统 —— 【数据类型与夺命“91”】_第3张图片

扩展资料

无符号数只表示大小,有符号数最高位(二进制情况下最高位表示符号位),在同一操作系统下,有符号数和无符号数的最大数值在大小上的关系是2*x+1(x表示有符号数的最大值,2*x+1表示无符号数最大值)。二者表示的数据范围大小是相同的,但是范围不同。

 

OK,想必原因已经知道啦,是因为int型的数据是默认为有符号整数的,是有数值范围的,输入的数字如果超过了(-2,147,483,648)到 (2,147,483,647)也会溢出。

那么好,考虑到用户名不适合设置char或者varchar型的,并且设置int型的不能超出范围,那么就设置允许输入的数据小于10位数(因为等于或者大于10位都有可能输入的数据超出范围!)

 

更多知识研究:

  • 首先明确的是,char的长度是不可变的,而varchar的长度是可变的.

  • 定义一个char[10]和varchar[10],如果存进去的是‘abcd’,那么char所占的长度依然为10,除了字符‘abcd’外,后面跟六个空格,而varchar立马就把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的。

  • char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。

  • char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;而varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节,两者的存储数据都非unicode的字符数据。

另外,其他的数据类型:

1、float为单精度浮点型,能准确到小数点后六位 。

2、double为双精度浮点型,能准确到小数点都十二位 。

3、char为字符型,用于定义字符类型的数据。

 

更多问题稍后继续更新与解决!敬请期待 >_<

 

你可能感兴趣的:(------VB学习,*******,第一次机房收费系统)