关于SQL的char,varchar字段在导出时切断中文字符显示问号或乱码的问题[原创]

原创 2007年09月12日 20:05:00

http://blog.csdn.net/chengg0769  转载保留此行。勿作修改。

QQ群请加: 6539042(powerbuilder11&SQL)  

最近在处理客户的FTP下来的资料,出现如题的问题

txt文本里有如下记录:

广东省某某某某某某某某某公司-IC卡,100,100

广东省某某某某某某某某公司-IC?100,100

问题,下面这行的分隔符不见了,造成数据无法导入本地SQL2000

这个字段类型是varchar(30),这是最近的文档资料,但我发现导出的资料有超过30长度的。证明这个字段现在只是修改了文档资料为30长度,而数据库必然是大于30的,只是从其它工单表里转入资料时作了切断来满足现在文档的要求,否则也不可能完整存放长度大于30的字符串(第一行)。

而这个切断就出现了问题,其实我们看到的问号,并非是英文的问号,而是半个汉字与逗号的结合造成的乱码。

所以总结一下就是:数据长度刚好30,而且英文字符的数量是奇数,并且以汉字结尾

当然,如果是以英文结束并切断英文部分,是不会造成这个问题的;如果英文字符数量是偶数也没问题。

彻底解决方法:

这个问题的澈底解决方法是不要作切断,否则肯定会出现或多或少的问题。而至于要完整的切断一个中文,在处理效率上不现实。当然这是程序的问题了。

折衷的解决方法:

1. 本地文本替换问号为逗号,但不一定保险。因为目前除问号问题外,还出现了数据折行显示,甚至跳过几行等问题,其归根结底是中文切字造成不可见字符造成的。而且这个没什么规律。

因为我们虽然在notepad里看到的是问号"?",并且可以替换,但是编程来替换就不行,因为末字符是ascii>127的,而且你无法判断是半个字符,因为汉字就是两个半个字符组合而成,除非用我上面用黑体显示的那个规律来判断之。(与notepad里能看到问号是两码事)

2. 本地表加宽成varchar(40),导出是增加一个“A-Z”的字符,如果后面有半个字符则结合成一个字或者问号,从而不会与逗号结合。如果没有半个字符则显示出这个英文,影响也不大。

导出时选择用一条sql语句来筛选:select id,name=name+'A',price from tab_name where 1=1

我在sql2000里测试增加一个'A':IP专?3269334变成了: IP专蟌,3269334

如果末尾加英文的空格,显然比较贴切,有半个字符的显示为问号,但不吃掉逗号,而正常的记录只是多一个空格出来,完全不影响实际上使用。(推荐)

select id,name=name+' ',price from tab_name where 1=1

IP专?3269334 变成了: IP专?,3269334

然聪明的人能想到,先在末尾添加一个字符,再用left(name,len(name)-1)来处理也是可以的,因为left是基于一个完整的字符,英文算一个,汉字也算一个。

select id,name=left(name+'A ',len(name+'A')-1),price from tab_name where 1=1

(结果非常完美)

当然还有人认为不用添加一个字符,直接切掉末尾字符,当然没问题的字段也会被切掉一个,当然不可以。

3. 判断长度为30而且英文字符数为奇数,则切断末尾的半个汉字。这个方法太费劲。而且这种方法不是数据库维护人员能做到的。(简直没必要费这个劲)

4. 在导出时用sql语句把字段转换成nvarchar(30),我在sql2000里测试ok.

select id,name=cast(name  as nvarchar(30)),price from tab_name where 1=1

即说2,4的方法是可行的。windowxp+sql2000里我测试过。其它DBsys和OS未作测试。 

//20070918续:

省公司照以上方案改进后,采用管道符号(ASCII=124)分隔。

不想出现这个错误:错误当前行中找到多列; 最后定义列的数据后发现非空白字符--没找到具体原因,看ms网站打sp3补丁即可(sp1修正的此问题)

解决了逗号问题,但我测试时仍然出现问题,什么问题呢,就是录入人员有时录入的是繁体的汉字(比如东莞录入成東莞),我把出现错误的行全部copy到一个文件里导入,在手动导入时的预览界面看到,繁体字的地方会被分隔成两行,从而报错。唉,真是好事多磨。

東(150+124) ---BIG5编码

億(131+124)---BIG5编码

可见如果按字节读,则会生出一个分隔符号来。如果要避免这个问题,可改用两个管道符号(||)

剩下繁体字的13笔资料有问题,采用双引号括起来,顺利通过。

最后明确了我要求:

1.每个文件必须要栏位的title
2.文件编码:ANSI
3.行分隔符:CR+LF(回车+换行)
4.文本限定符:双引号 ("")
5.每行分隔符号数量一致
6.不能出现折行,跳行,空白行等。

//20070925 append

如果某字段在前台界面里允许多行输入。也就是说可能存在用户会输入/r,/n这些不可见字符,则如果你导出时,还是使用/r/n作行分隔符号,就会出现跳行现象。所以这是你可以使用一些不会冲突的字符作行分隔符号,比如三个分号(;;;),即可避开问题。

关于利用Jsoup解析HTML中 变成非传统空格或乱码问题解决方法

在写爬虫的时候很多时候会遇到这种问题:HTML中源码显示 ;没问题,但是利用Jsoup的text()方法获取的文字就会出现问题,一般情况是 ;变成非传统空格或者乱码,这样在解析的时候想...
  • hubin1989
  • hubin1989
  • 2015年10月12日 14:22
  • 4473

java编码问题的解决办法!!

一、Java中文问题的由来   Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java和JSP文件本身...
  • wenjie4892543
  • wenjie4892543
  • 2011年08月18日 10:34
  • 1042

sqlserver采用varchar字段类型中文乱码

今天朋友遇到过怪问题,在同一个页面显示的2条中文记录一个正常,一个乱码,2条记录分别从不同的表里取出。录入的时候采用直接录入。仔细观察2者区别,发现能正常显示的字段在表中类型为nvarchar,不能的...
  • tesge
  • tesge
  • 2004年09月21日 14:12
  • 4547

SQL中varchar与Nvarchar区别(乱码的出现)

varchar在SQL Server中是采用单字节来存储数据的,nvarchar是使用Unico来存储数据的.中文字符存储到SQL Server中会保存为两个字节(一般采用Unico编码),英文字符保...
  • aabbjj
  • aabbjj
  • 2012年11月02日 14:34
  • 1641

[Python爬虫] 中文编码问题:raw_input输入、文件读取、变量比较等str、unicode、utf-8转换问题

最近研究搜索引擎、知识图谱和Python爬虫比较多,中文乱码问题再次浮现于眼前。虽然市面上讲述中文编码问题的文章数不胜数,但是此处还是准备简单做下笔记。方便以后查阅和大家学习。主要包括raw_inpu...
  • Eastmount
  • Eastmount
  • 2015年10月01日 22:46
  • 11232

10分钟学会理解和解决MySQL乱码问题

MySQL出现乱码的原因 要了解为什么会出现乱码,我们就先要理解:从客户端发起请求,到MySQL存储数据,再到下次从表取回客户端的过程中,哪些环节会有编码/解码的行为。为了更好的解释这个过程,博主制...
  • yanzongshuai
  • yanzongshuai
  • 2016年04月06日 20:19
  • 240

SQL学习---将所有的char,varchar改为nchar,nvarchar

CREATE PROC p_ToUnicode @type tinyint=0 --修改方式,0=仅查询可修改情况,1=仅所有列可修改时才修改,2=修改可修改列,报告不可修改列 AS SET NOC...
  • liguoming05
  • liguoming05
  • 2013年09月18日 15:05
  • 1084

向sql server中插入中文字段出现问号??

工程类型:asp.net 编程语言:basic 在向sql server中插入中文字段时总显示为:?? 把数据库中的字段设置成nvarchar后仍然显示为?? 注意到原插入语句...
  • wuyijc
  • wuyijc
  • 2011年09月09日 23:12
  • 5656

ajax获取数据中文乱码问题最简单的完美解决方案

转载地址:http://www.jb51.net/article/57783.htm 使用scriptCharset即可解决问题,用contentType就不一定可以了。 代码如下: $.a...
  • zaocha321
  • zaocha321
  • 2015年06月28日 22:22
  • 11998

python 处理中文 读取数据库输出全是问号

ref:http://www.cnblogs.com/zhoujie/archive/2013/06/07/problem1.html 1、python连接mssql数据库编码问题   p...
  • xyqzki
  • xyqzki
  • 2015年07月15日 13:01
  • 6330
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于SQL的char,varchar字段在导出时切断中文字符显示问号或乱码的问题[原创]
举报原因:
原因补充:

(最多只允许输入30个字)