高手请进!谁能帮我解释一下SQL多语言问题,关于varchar,nvarchar

wangjiamin 2004-12-21 10:40:17
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[mdata]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[mdata]
GO

CREATE TABLE [dbo].[mdata] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[name] [varchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,
[nname] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

--------比较nvarchar 和 varchar长度问题-------------
--"业务类型d" 太长,失败
--insert mdata(name,nname) values(N'业务类型d','业务类型')
-- succeed
insert mdata(name,nname) values(N'业务类型','业务类型业务类型')


-------比较SQL拼写对数据影响问题---------------------
insert mdata(name,nname) values('业务类型','业务类型')
insert mdata(name,nname) values('业务类型',N'业务类型')
insert mdata(name,nname) values(N'业务类型','业务类型')
insert mdata(name,nname) values(N'业务类型',N'业务类型')
insert mdata(name,nname) values('YWLXYWLX','YWLXYWLX')

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~``
--虽然第一个name字段是varchar,和第二个字段是nvarchar,上面5个insert语句都能成功
--且下面的比较查询语句也都能查处上面的值。
--
--谁解释一下在sql中存的是什么码(varchar,nvarchar),
--在下面的查询语句中能查询出认为内容(好像和编码无关),SQL语句又是在什么时候被处理的。
--我用的是中文SQL2000,其他环境也会这样么?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~``

select * from mdata where name = nname
select len(name), len(nname) from mdata where name = nname

select * from mdata where name = N'业务类型'
select * from mdata where nname = '业务类型'

...全文
202 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2004-12-24
  • 打赏
  • 举报
回复
1.假设你是用ADO连接,则连接的字符串是:
身份验证模式为:"sql server和windows"
Provider=SQLOLEDB.1;Persist Security Info=True;User ID=用户名;Password=密码;Initial Catalog=数据库名;Data Source=SQL服务器名;Auto Translate=False

即连接字符串中有: ;Auto Translate=False
如果你是先配置ODBC,创建DSN来连接,则在配置的过程中,有个"执行字符转换"的选项,不要勾上它


2.通过上述设置,能达到本机保存的数据,本机取不会出乱码

3."设置一下选项。然后把我SQL里面常量都当作unicode,也就是类似于加上N''前缀的效果"
这个做不了

wangjiamin 2004-12-23
  • 打赏
  • 举报
回复
to zjcxc(邹建):
插入问题确实和测试环境有关,我在英文版本,和繁体版本效果就不是这样,会出错。

你说的“数据库连接的选项中,有个"执行字符转换"的选项” 我怎么没有找到啊,我在SQL2000联机帮助里面没有找到相应的信息。

我能不能做到这样的效果,设置一下选项。然后把我SQL里面常量都当作unicode,也就是类似于加上N''前缀的效果

NinGoo 2004-12-21
  • 打赏
  • 举报
回复
nchar 和 nvarchar
nchar 是固定长度 Unicode 数据的数据类型,nvarchar 是可变长度 Unicode 数据的数据类型,二者均使用 UNICODE UCS-2 字符集。

子陌红尘 2004-12-21
  • 打赏
  • 举报
回复
SQL Server提供varchar,nvarchar两种数据类型来存储字符信息。在如何在SQL Server或应用程序中使用方面,这两种数据类型大致是一样的。差别在于nvarchar是用于存储处理数据库图表中多语言数据的Unicode数据。其它语言有一套需要保存的字符代码的扩展集,这种数据类型支持这样的扩展。因为需要存储其它语言的扩展字符代码,nvarchar占用的空间是varchar的两倍。
zjcxc 2004-12-21
  • 打赏
  • 举报
回复
至于插入的问题,与你的测试环境有关

在数据库连接的选项中,有个"执行字符转换"的选项,会影响
insert mdata(name,nname) values('业务类型','业务类型')
这种插入方式时,字符串采用的编码(这种编码与你的客户端操作系统的代码页有关)
zjcxc 2004-12-21
  • 打赏
  • 举报
回复
--------比较nvarchar 和 varchar长度问题-------------
这个问题看联机帮助上的定义就很清楚了:

--关于 varchar 与 nvarchar 的字义(联机帮助上的说明)

varchar[(n)]
长度为 n 个字节的可变长度且非 Unicode 的字符数据。

nvarchar(n)
包含 n 个字符的可变长度 Unicode 字符数据。



从定义上就可以看出为什么
insert mdata(name,nname) values(N'业务类型d','业务类型')
会失败

因为 name 是8个字节长度,而一个中文是两个字节,所以 "业务类型d" 是9个字节,自然超过长度

而下面的会成功:
insert mdata(name,nname) values(N'业务类型','业务类型业务类型')

是因为 nname 是8个字符,自然可以插入成功

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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