请教一个LEFT()的问题

wgqqgw 2006-07-11 01:00:06
今天遇到一个奇怪的问题:
表table_01里面有个字段field_01,类型为char(40),我写了下面这句:

select left(field_01,20) as field_test
into test
from table_01

结果看看test表,发现生成的字段field_test是varchar(40),而不是我想要的varchar(20)或char(20),非常不解,请问是怎么回事呢?left(,20)好像没有起到作用?

BTW:这次用的是SQL2000;在SQL7上测试过同样的语句,生成的结果是varchar(20)
...全文
188 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qingsongy 2006-07-12
  • 打赏
  • 举报
回复
原因如下:
1. 中文字符集是双字节字符集: 一个汉字字符要两个字节表示
2.char(40) 表示一个字符类型, 她的长度是40字节, 它最少可以放20个字符(汉字), 最多可以放40个字符(ASCII, 英文)
3.LEFT 函数的第二个参数是字符数, 而不是字节数,

left(field_01,20)
表示要返回从左边数的前20个字符,
这20个字符要用最多40个字节表示, 所以 返回的数据类型是 varchar(40)
当然, 前提是 field_01 列的 collation是 中文,
如果是英文, 那末, 返回类型为varchar(20) 因为 varchar(20)可以放20个英文字副

可以用 sp_help table_01来验证,
collation of field_01 should be chinese_prc_ci_as
ycitzzq 2006-07-11
  • 打赏
  • 举报
回复
估计和字符的编码格式有关。
marco08 2006-07-11
  • 打赏
  • 举报
回复
晕...
wgqqgw 2006-07-11
  • 打赏
  • 举报
回复
……不是太明白,和双字节单字节有关系?原来的数据类型就是char(40),left(20)以后还是char(40)而不是char(20)??晕了……在SQL7上测试是ok的哦,会不会跟那些ANSI padding/ANSI nulls等设置有关系呢?
  • 打赏
  • 举报
回复
个人认为使用select into 实际上就是创建了一个和原表中所选择字段的数据类型一致的一个表结构,当然没有主键!
子陌红尘 2006-07-11
  • 打赏
  • 举报
回复
left()取字节数,而varchar()/char()的长度是字节数,如果用left处理的数据全部是双字节字符,自然取得的字节数为40。

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧