当前位置: 首页 > 图灵资讯 > 技术篇> 关于SQL的char,varchar字段在导出时切断中文字符显示问号或乱码的问题[原创]

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

来源:图灵教育
时间:2023-06-09 10:20:00

最近,在处理客户的FTP信息时,出现了问题

txt文本中有以下记录:

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

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

问题是,下行的分隔符消失了,导致数据无法导入本地SQL2000

这个字段类型是varchar(30),这是最近的文档数据,但我发现导出的数据有30多个长度。证明这个字段现在只修改了30长的文档数据,数据库必须大于30,只是切断从其他工作表中转移到数据,以满足当前文档的要求,否则不可能完全存储超过30长的字符串(第一行)。

事实上,我们看到的问号不是英文问号,而是半个汉字和逗号结合造成的混乱代码。

所以综上所述,数据长度刚好30,英文字符的数量是奇数,以汉字结尾。

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

彻底解决方案:

这个问题的解决办法是不要切断,否则肯定会或多或少出现问题。至于完全切断中文,处理效率是不现实的。当然,这是程序的问题。

折衷解决方案:

1. 本地文本替换问号是逗号,但不一定是保险。因为目前除了问号问题,还有数据折叠显示,甚至跳过几行等问题,归根结底是由于中文切割造成的不可见的字符。这是不规则的。

因为虽然我们在notepad上看到了问号“?”,可以替换,但编程不能替换,因为最后一个字符是asciii>127,你不能判断它是半个字符,因为汉字是两个半个字符的组合,除非它是用我上面显示的黑体规则来判断的。(这和在notepad上看到问号不一样)

2. 将本地表加宽成varchar(40),导出增加一个“A-Z“如果后面有半个字符,则将其组合成一个单词或问号,以免与逗号组合。如果没有半个字符,则显示英文,影响不大。

PB反编译大师,PB混淆加密大师 ,互联网数据组件:DataWindowHTTP,ESC/POS打印组件:ESC/POS ImagePrint(LPT,column format),直接驱动SQLCloudBC互联网数据库

选择使用sql语句进行导出筛选:select id,name=name+'A',price from tab_name where 1=1

我在sql2000里的测试中加了一个‘’A':IP专业326934成为: 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修正这个问题)

解决逗号问题,但我的测试仍然有问题,什么问题,是输入人员有时输入是传统汉字(如东莞进入东莞),我把所有错误的行复制到文件中,在手动导入预览界面中,传统汉字将分成两行,以报告错误。唉,这真的是一件好事。

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

131+124-BIG5编码

由此可见,如果按字节读取,就会产生分离符号。如果要避免这个问题,可以改用两个管道符号(||)

剩下的13个繁体字数据有问题,用双引号包括,顺利通过。

最后明确了我的要求:

1.每个文件必须是列的标题 2.文件编码:ANSI 3.行分隔符:CR+LF(回车+换行) 4.文本限定符:双引号 ("") 5.每行分隔符号数量一致 6.无折行、跳行、空白行等。

//20070925 append

若前台界面允许多行输入某个字段。也就是说,用户可能会输入/r,如果你导出这些看不见的字符,仍然使用/nr/n作行分隔符号,会出现跳行现象。因此,您可以使用一些不冲突的字符作为分隔符号,例如三个分号(;;;),可以避免问题。