Foxtable(狐表)用户栏目专家坐堂 → 能否考虑增加一个读取字符串长度的函数


  共有17007人关注过本帖树形打印复制链接

主题:能否考虑增加一个读取字符串长度的函数

帅哥哟,离线,有人找我吗?
reachtone
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:版主 帖子:1993 积分:19409 威望:0 精华:20 注册:2008/9/2 10:09:00
能否考虑增加一个读取字符串长度的函数  发帖心情 Post By:2009/11/1 15:31:00 [显示全部帖子]

由于Len、Left、Mid等字符串函数(包括Length属性)认为一个汉字和一个西文字符的长度都为1,这就带来很多问题。

比如,下面这个字符串:
星期一,星期二,星期三,星期四,星期五,星期六,星期日

用Length得到的长度是27,而我在数据库结构中给它定义的“字段长度”是50,但在将这个字符串添加到数据库时还是会出错。这是因为,数据库中的字段长度是按一个汉字2个字节的标准进行判断的。
对于中英文混合的字符串,要判断其长度更麻烦,比如:一二三ABC。。。
由于得不到准确的字符串长度,这就很容易在将其写入数据库时导致各种错误。请老六看看能否增加一个相应的函数(将汉字按2个字节来处理)。
我也查了一下资料,用ASC可以判断某字符是否是汉字,但它需要对每个字符进行循环判断。如果导入的外部数据有成千上万条,这是不是太占资源了?
[此贴子已经被作者于2009-11-1 15:32:16编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
reachtone
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:版主 帖子:1993 积分:19409 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/11/1 16:04:00 [显示全部帖子]

项目在交付前,测试都是好好的。交付后就出问题了,而且多是这样的问题:

图片点击可在新窗口打开查看此主题相关图片如下:2.jpg
图片点击可在新窗口打开查看

经认真检查,原来问题就出在对字符串长度的判断上。假如,某列的MaxLength是50(也就是字段的长度),用户在table或编辑行上输入50个汉字也是允许的。但只要对DataTable进行Save保存,肯定出错。(50个汉字实际上已经是100个字节了)
这个问题比较严重,请老六考虑一个妥善的解决办法。

 回到顶部
帅哥哟,离线,有人找我吗?
reachtone
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:版主 帖子:1993 积分:19409 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/11/1 16:52:00 [显示全部帖子]

以下是引用hnaysx在2009-11-1 16:31:00的发言:
Dim str As String = "星期一,星期二,星期三,星期四,星期五,星期六,星期日"
Dim Array() As Byte
array= System.Text.Encoding.Default.GetBytes(str)
Output.Show(Array.Length())

学习,收藏!谢谢!
那二楼的问题怎么处理呢?是不是只能在保存前对输入的字符串长度进行判断呢?

[此贴子已经被作者于2009-11-1 16:55:33编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
reachtone
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:版主 帖子:1993 积分:19409 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/11/1 22:19:00 [显示全部帖子]

以下是引用lxl在2009-11-1 20:26:00的发言:
如果要输入到汉字,设成nvarchar(50) 或者nchar(50)就不会报错
设成varchar(50) 或者 char(50)才会报错 

是的,varchar是按字节存储的,而带“n”的nvarchar是按字符存储的。同样的字段长度,varchar(50)只能存储50个字节长度的字符,也就是25个汉字;而nvarchar(50)则可以存储50个汉字(也就是100个字节)。
由于Varchar更节省空间,我一般都是用Varchar来定义字段宽度。由于之前用的其它开发工具都是将一个汉字统计为2个字节的,所以都很正常;现在改用到foxtable后,同样的判断方法已经无效,总是导致“字符串截断”的错误。


 回到顶部
帅哥哟,离线,有人找我吗?
reachtone
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:版主 帖子:1993 积分:19409 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/11/2 8:58:00 [显示全部帖子]

以下是引用lxl在2009-11-1 23:01:00的发言:

nvarchar只有储存字母 数字等的时候才会浪费空间。 因为他们本来只需要一个字节的空间,却占用2个字节的空间。
存储汉字,无论你用nchar还是char都是占用2个字节的物理空间。varchar(50)   nvarchar(50) 占用的物理空间就不一样
其实你完全可以用nvarchar来储存。nvarchar本来就是设计来储存双字节数据的,否则这个类型还有啥用。

呵呵,因为习惯及数据库移植问题,我还是要用Varchar类型来保存字符型数据的。
看来,只有在保存前用3楼的方法进行判断了。


 回到顶部