在导入sql server数据库时,怎么老是出现乱码呀???
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在导入sql server数据库时,怎么老是出现乱码呀???相关的知识,希望对你有一定的参考价值。
用c#练习一个读取文件,导入数据库时,共两个字段,一个是UserName nvarchar(50)
一个是Age int;当是英文名字时,读取正常,是汉字时,就是乱码,郁闷呀。。
代码如下:
private void button1_Click(object sender, EventArgs e)
OpenFileDialog openFileDialog1 = new OpenFileDialog();
if (openFileDialog1.ShowDialog() != DialogResult.OK)
return;
using (FileStream filestream = File.OpenRead(openFileDialog1.FileName))
using (StreamReader streamreader = new StreamReader(filestream))
using (SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True"))
con.Open();
using (SqlCommand cmd = con.CreateCommand())
cmd.CommandText = "insert into T_usrs(name,age) values(@name,@age)";
string line = null;
while ((line = streamreader.ReadLine()) != null)
string[] lines = line.Split('|');
string name1 = lines[0];
int age = Convert.ToInt32(lines[1]);
cmd.Parameters.Clear();
cmd.Parameters.Add(new SqlParameter("name", name1));
cmd.Parameters.Add(new SqlParameter("age", age));
cmd.ExecuteNonQuery();
MessageBox.Show("导入成功!");
查询字符集的方法为:
use master
go
select * from syscharsets
go
如果记录中chinses_prc开头的都是支持简体中文的字符集
1. 字符集是支持双字节的字符集如中文字符集(Collation name为Chinese_PRC_CI_AS)
<1>. 定义varchar(2)
(1) 正式表
总结:在中文字符集下,定义varchar(x), 不论使用不使用N'',英文字符都占1个字节,即可以存x个英文字符; 不论使用不使用N'',中文字符都占2个字节,即可以存(x / 2)个中文,select结果为汉字本身,不是乱码。
(2) 临时表
总结:在中文字符集下,定义varchar(x), 和正式表表现一样;
<2>. 定义nvarchar(2)
(1) 正式表
总结:在中文字符集下,定义nvarchar(x), 不论使用不使用N'',英文字符都占2个字节,即可以存x个英文字符; 不论使用不使用N'',中文字符都占2个字节,即可以存x个中文,select结果为汉字本身,不是乱码。
(2) 临时表
总结:在中文字符集下,定义nvarchar(x), 和正式表表现一样。
<3>. 类型为varchar时,长度 x 和 datalength()对应,都指字节大小; 英文len() = datalength();中文len() = datalength() / 2;类型为nvarchar时,长度 x 和 len()对应,都指字符长度。
2. 字符集是支持单字节的字符集如拉丁字符集(Collation name为Latin1_General_CI_AS)
<1>. 定义varchar(2)
(1) 正式表
总结:在英文字符集下,定义varchar(x),不论使用不使用N'',英文字符都占1个字节,即可以存x个英文字符;不论使用不使用N'',中文字符都占1个字节,即可以存x个中文,但只保存前半截中文编码,所以select结果为乱码;(特殊:如果使用N'',此时插入的字符数最大为4000)
英文和中文 len() = datalength();
(2) 临时表
总结:在英文字符集下,定义varchar(x), 不论使用不使用N'',英文字符都占1个字节,即可以存x个英文字符;不使用N''时,中文占1个字节,可以存x个汉字,但都只存入汉字前半截字符编码,显示为乱码;使用N''时,中文占2个字节,只可以存 x/2 个汉字,没有乱码,取出仍为汉字,说明在英文字符集下通过使用N''是可以保存汉字的;除用N''保存的中文外,其余英文和中文 len() = datalength();用N''保存的中文字符len() = datalength() / 2;
<2>. 定义nvarchar(2)
(1) 正式表
总结:在英文字符集下,定义nvarchar(x),不论使用不使用N'',英文字符都占2个字节,即可以存x个英文字符;(注意每个字符比varchar用的空间大)不论使用不使用N'',中文字符都占2个字节,即可以存x个中文字符,但不使用N''只保存前半截中文编码,所以select结果为乱码;使用N''则保存和取出都为汉字本身;
(2) 临时表
总结:在英文字符集下,定义nvarchar(x), 和正式表表现相同;
<3>. 类型为varchar时,长度 x 和 datalength()对应,都指字节大小;(临时表中N''中文字符长度比较特殊;) 类型为nvarchar时,长度 x 和 len()对应,都指字符长度。
二、 使用归类
抛开不常用的临时表不谈,只看正式表,再加上varchar和nvarchar类型的最大长度,得到以下经验:
<1> 最大长度问题
1. 在中文字符集下使用varchar,最大长度可定义8000,这个8000是指字节数(datalength()),即最大可以保存8000个英文字符,4000个中文字符。
特殊:若存入字符N'a',则最大能保存4000个字符,但其所占空间为4000字节。
2. 在中文字符集下使用nvarchar,最大长度可定义4000,这个4000是指字符个数(len()),即最大可以保存4000个英文字符,4000个中文字符。
3. 在英文字符集下使用varchar,最大长度可定义8000,这个8000是指字节数(datalength()),由于中文英文都保存为1字节,故最大可以保存8000个英文、中文字符。
4. 在英文字符集下使用nvarchar,最大长度可定义4000,这个4000是指字符个数(len()),即最大可以保存4000个英文字符,4000个中文字符。
<2> 文字显示问题
1. N''要和数据类型nvarchar, nchar一起使用,如果对varchar, char字段类型强制使用N'',则会产生一些特殊现象,甚至无法控制。
2. 在英文字符集下,想要保存特殊符号字符、中文等双字节字符,在定义表结构时要使用nvarchar或者nchar,在保存时要用N''。
3. 在中文字符集下,数据库系统缺省已经可以保存特殊符号字符、中文等双字节字符。即使用不使用N'',都按双字节处理。但为了统一期间建议,在定义表结构时如果使用nvarchar或者nchar,在保存时要用N'',在定义表结构时如果使用varchar和char,此时不要使用N''操作。
4. SUBSTRING ( expression , start , length ) 。length:是一个整数,指定子串的长度(要返回的字符数或字节数)。 中文字符集中按字符数取;英文字符集中,char, varchar按字节数取,nchar, nvarchar按字符数取;
三、 其他参考
使用 Unicode 数据
unicode代码页、排序规则、SQL Server 排序规则基础知识、Windows 排序规则排序样式、选择 SQL 排序规则、 DBCS 字符追问
呵,我用的是vs2010内置的sql server 08,并没有安装它。里面找不到master数据库啊。无法执行:
use master
go
select * from syscharsets
go
纠结……
呵呵,数据库的编码方式在哪儿呀,新手,指点一下哈……
我知道用:string[] line = File.ReadAllLines(file,Encoding.Default);读取文件时,默认的编码就是utf8,不知道用streamreader读取时,如何改呀,指点一下哈,
SQL Server2012使用导入和导出向导时,用sql语句作为数据源,出现数据源类型会变成202或者203
用MS SqlServer2012进行数据导出时,使用的查询语句导出,但是出现了错误:
“发现 xx个未知的列类型转换
您只能保存此包“
点击列查看详细错误信息时,可以看到:
[源信息]
源位置: 192.168.1.97
源提供程序: SQLNCLI11
表: [查询]
列: ItemSize
列类型: 203
SSIS 类型: (类型未知...)
映射文件(到 SSIS 类型): C:\Program Files (x86)\Microsoft SQL Server\110\DTS\MappingFiles\MSSQLToSSIS10.XML
[目标信息]
目标位置: C:\Users\Administrator\Desktop\火星公司_测试_发货单_201705181134.xls
目标提供程序: Microsoft.Jet.OLEDB.4.0
表: `查询`
列: ItemSize
列类型: VarChar
SSIS 类型: Unicode 字符串 [DT_WSTR]
映射文件(到 SSIS 类型): C:\Program Files (x86)\Microsoft SQL Server\110\DTS\MappingFiles\JetToSSIS.xml
[转换步骤]
转换未知...
SSIS 转换文件: C:\Program Files (x86)\Microsoft SQL Server\110\DTS\binn\DtwTypeConversion.xml
在CSDN的一个帖子中查到,一些信息:
这是一个bug,这里解释了原因以及解决方案
https://connect.microsoft.com/SQLServer/feedback/details/775897/sql-server-import-and-export-wizard-does-not-recognise-varchar-and-nvarchar
上面链接中介绍:
描述
当输入检索通过一个查询使用SQL Server导入和导出向导在SQL Server 2012中的数据,VARCHAR类型被公认为是“200”而nvarchar类型“202”。这导致向导显示“审查”的数据类型的警告/错误类似于以下内容:14未知列类型转换(S)你只能拯救packagethis意味着数据传输不能执行和向导只能保存转移为ssis包的问题。似乎只出现在数据源查询-即“查询指定数据传输”中指定表复制或查询的SQL Server导入和导出向导部分。选择“复制数据从一个或多个表或视图”选项中指定表复制或查询部分似乎认识到varchar和nvarchar数据类型正确。
在品论中有人指出,可以将你的查询语句,创建成视图,然后用视图导出就正常了,我没有试过。
微软的工作人员说,上面的反馈重复,所以又发了一个链接:
https://connect.microsoft.com/sqlserver/feedback/details/772761/dtswizard-in-sql-2012-sp1-no-longer-recognizes-nvarchar-varchar-data-types-when-source-is-a-query
以上链接里面,似乎提示微软已经修复了该bug;
但是我没看到怎么修复的,我仍然有该问题。
有人指出可以看看这个链接:
https://social.msdn.microsoft.com/Forums/sqlserver/en-us/97ff1f01-c02a-4c9a-b867-8eaecc464cfb/2012-sp1-no-longer-recognizes-common-data-types?forum=sqlintegrationservices
我看了不行。
还好我装了两个客户端,最后我用我的sqlserver2008解决了问题,但是解决的并不彻底啊。
以上是关于在导入sql server数据库时,怎么老是出现乱码呀???的主要内容,如果未能解决你的问题,请参考以下文章
急求!!!我用SAS导入数据的时候 老是出现文件不存在的错误 这是为啥呢?
用C#连接操作MYSQL时,老是会超时,怎么处理SQL语句执超时啊,连接字符串里好像设置不了。