怎麼把 varchar 轉換成 nvarchar (字段中有漢字)??? 謝謝 !!!

laker_tmj 2005-01-15 03:10:15
怎麼把 varchar 轉換成 nvarchar (字段中有漢字)??? 謝謝 !!!
...全文
1360 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hglhyy 2005-01-15
  • 打赏
  • 举报
回复
学习ing...

邹建的收藏先!
631799 2005-01-15
  • 打赏
  • 举报
回复
我这个如果varchar字段超过4000个字符可能会出错了
631799 2005-01-15
  • 打赏
  • 举报
回复
我一般这样也没发现过问题:

alter table tb add 字段 nvarchar(50)
update tb set 字段=cast(varchar字段 as nvarchar)
--update tb set 字段=varchar字段 --这里不转好像也不会乱码,不知怎么回事?
alter table tb drop column varchar字段
laker_tmj 2005-01-15
  • 打赏
  • 举报
回复
TO zjcxc(邹建)

請問 bcp, bulk 這兩個怎麼用?

能不能用這兩個來导数据?
laker_tmj 2005-01-15
  • 打赏
  • 举报
回复
TO zjcxc(邹建)

請問除了用 import 的方法導入數據外還有別的導入數據的方法?
(用 import 是可以把 varchar 轉換成 nvarchar 沒有亂碼)
zjcxc 元老 2005-01-15
  • 打赏
  • 举报
回复
看我上面的回复
laker_tmj 2005-01-15
  • 打赏
  • 举报
回复
TO zjcxc(邹建) 謝謝 !!!


生成脚本+导数据的方法?

請明示(是不是另外生成一NVARCHAR類型的表,然後用什麼方法导数据?)

我需要把這個過程做在 VFP 程序中

zjcxc 元老 2005-01-15
  • 打赏
  • 举报
回复
因为你的数据用varchar还是正常显示的,所以建议你用生成脚本+导数据的方法进行处理,应该可以在导数据的过程中正常转换到代码页,避免乱码
zjcxc 元老 2005-01-15
  • 打赏
  • 举报
回复
字段类型不是用来直接解决乱码的,因为你保存到数据库中的数据已经是一种编码形式了,如果客户端的代码页不支持,那读出来的就是乱码

nvarchar类型只是以unicode编码存储你的数据,这就要求你保存到数据库中的数据是以unicode编码传递给数据库的,否则还未保存到数据库中已经是乱码了
这也是为什么会强调要在多语言环境下使用数据库时,应该字段类型用nvarchar/nchar
处理语句用类似下面的:
insert 表 values(N'中')
insert 表 select N'中'

如果没有那个N标识字符以unicode编码传递,那保存到数据库中的数据也不一定正确
laker_tmj 2005-01-15
  • 打赏
  • 举报
回复
to zjcxc(邹建):

你的方法在我的數據庫中不行啊?
我的數據庫的字符集是 Latin1_General_BIN 我從另一數據庫(字符集是 Latin1_General_BIN )中導入類型為varchar字段內容到T2表,(INSERT T2 SELECT TOP 1000 DES,DES2 FROM PRCFOOKTIN..UN_ITEM1)

如果T2表的DESC1為varchar類型導入的內容就不是亂碼,但一換成nvarchar類型就會是亂碼,

用你提供的方法把DESC1從varchar改nvarchar后也是亂碼!

以下是我的數據庫腳本

IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'COLLATETEST')
DROP DATABASE [COLLATETEST]
GO

CREATE DATABASE [COLLATETEST] ON (NAME = N'COLLATETEST_Data', FILENAME = N'd:\MSSQL\data\COLLATETEST_Data.MDF' , SIZE = 2, FILEGROWTH = 10%) LOG ON (NAME = N'COLLATETEST_Log', FILENAME = N'd:\MSSQL\data\COLLATETEST_Log.LDF' , SIZE = 1, FILEGROWTH = 10%)
COLLATE Latin1_General_BIN
GO

use [COLLATETEST]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[T1]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[T1]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[T2]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[T2]
GO

CREATE TABLE [dbo].[T1] (
[T] [nvarchar] (50) COLLATE Latin1_General_BIN NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[T2] (
[DESC1] [varchar] (200) COLLATE Latin1_General_BIN NULL ,
[DESC2] [nvarchar] (200) COLLATE Latin1_General_BIN NULL
) ON [PRIMARY]
GO



zjcxc 元老 2005-01-15
  • 打赏
  • 举报
回复
或者右键要转换的数据库--所有任务--生成SQL脚本--将"包含扩展属性"选上,其他根据需要设置

这样生成一个脚本文件,再把脚本文件中的 varchar 用替换为 nvarchar
执行这个脚本文件生成一个空库
再把数据从旧库导到这个新库中.
chinaandys 2005-01-15
  • 打赏
  • 举报
回复
To 邹老师:

为什么我像我那样也转成功了,有没有区别了?能不能举一个转不成功的例子
zjcxc 元老 2005-01-15
  • 打赏
  • 举报
回复

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_set]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_set]
GO

/*--char,varchar字段转换成nchar,nvarchar

将所有的用户表中,数值类型由char,varchar改为nchar,nvarchar
要注意的是,如果字段上有约束,则修改会出错

--邹建 2004.01(引用请保留此信息)--*/

/*--调用示例:

exec p_set
--*/
create procedure p_set
@flag bit=0 --转换标志:
--0 转换时使用原来的定义长度,如果原来定义长度超过4000,则定义为4000
--1 转换时使用原来的定义长度/2
as
declare tb cursor local for
SELECT N'alter table ['
+replace(o.name,N']',N']]')
+N'] alter column ['
+replace(c.name,N']',N']]')
+N'] N'
+replace(t.name,N']',N']]')
+N'('
+case
when @flag=0
then case when c.prec>4000 then '4000' else rtrim(c.prec) end
else rtrim(c.prec/2)
end+N')'
FROM syscolumns c,systypes t,sysobjects o
where o.id=c.id
and c.xusertype=t.xusertype
and objectproperty(o.id,'IsUserTable')=1
and o.status>=0
and t.name in('char','varchar') --要处理的数据类型
and not exists(
SELECT 1 FROM sysobjects
where xtype='PK'
and name in (
SELECT name FROM sysindexes
WHERE indid in(
SELECT indid FROM sysindexkeys
WHERE id = c.id AND colid=c.colid))) --主键不能修改
order by o.id,c.colid

declare @s nvarchar(4000)
open tb
fetch tb into @s
while @@fetch_status = 0
begin
exec(@s)
fetch tb into @s
end
close tb
deallocate tb
go
chinaandys 2005-01-15
  • 打赏
  • 举报
回复
declare @s varchar(20)
set @s='ab产不c'
select cast(@s as nvarchar(20))
chinaandys 2005-01-15
  • 打赏
  • 举报
回复
declare @s varchar(20)
set @s='ab产不c'
select cast(@s as nvarchar(20))
Softlee81307 2005-01-15
  • 打赏
  • 举报
回复
declare @s varchar(10)
set @s='好dd'
Declare @k nvarchar(10)
set @k=@s
select @k,@s
laker_tmj 2005-01-15
  • 打赏
  • 举报
回复
up

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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