mysql和sqlserver存储斜杆

来源:互联网 发布:软件系统测试方法 编辑:程序博客网 时间:2024/04/29 22:13

love聊网络那点事http://weibo.com/u/3923942488

斜杆问题:

一:mysql测试总结(tab  blob,name varchar)

                  1:通过sql语句在mysql工具中插入斜杆时例如:INSERT INTO tab VALUES('\\','\\');结果插入的是一个斜杆,说明其中一个斜杆时转义字符。

                  2:通过java代码往mysql中插入斜杆时例如:stmt.execute("insert into tab(tab,name) values('\\\\','\\\\')");插入的是一个斜杆,解释:因为先需要通过java转义一次,然后 

                         mysql又需要转义一次。

                  3:通过java执行stmt.execute("insert into tab(tab,name) values('\\','\\')");报如下错误。

com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\')' at line 1(因为通过java转义后变成一个斜杆后在mysql中会将斜杆后的单引号转义点引起报错)。

                 4:执行stmt.execute("insert into tab(tab,name) values('\','\')");插入为空 (解释:'','')


二:sqlserver测试总结(sqlserver2008)(tab image,name varchar)

                1:执行这个语句insert into tab values('\\','\\');第一个字段插入的是16进制的两个斜杆(通过java代码查询出来后验证了),第二个字段插入的就是两斜杆。说明sqlserver

                       客户端工具斜杆并不是转义字符而仅仅是普通字符。

                2:执行这个语句stmt.execute("insert into tab(tab,name) values('\','\')");第一个字段是0x第二参数为空,java查询出来就是两个空 (解释:'','')

               
   
 遇到的问题案例:mysql数据库和sqlserver数据兼容工作

问题描述:


           以blob字段类型存储在mysql中的报表数据(chinaexcel:BSTR SaveDataAsZipText()方法)通过mysql工具导出为sql语句,然后通过处理将这些

导出的数据存储到sqlserver2008中,blob字段类型对应sqlserver中的image类型遇到兼容性问题,sqlserver2008中的image中的数据读出来不能显示出来。

问题其实就是存在存储之后斜杆处理方式不同的问题,当然还有其他字符的处理方式问题比如‘\Z’和方框字符

这个问题在通过mysql工具导出sql语句再插入sqlserver时经常会遇到,因为mysql工具和sqlserver客户端对特殊字符的处理方式不一样导致,所以一般数据迁移不采用数据库sql语句迁移方式为好。目前的体会。

比如blob字段,通过mysql工具导出sql语句方式插入到sqlserver时,很多转义字符sqlserver当作字符处理。而mysql工具导出sql时为了能够再次导入mysql所以他导出的sql语句中会将自己的转义字符反转义到sql语句中。比如斜杆会转成双斜杠等。这样直接通过复制blob中的数据和sql语句中的数据对比是会有差距的,(可以自己试试用compare工具比较下。而直接复制blob的数据和用java读取blob的数据是没有差距的。)


    @Test
    public void test2(){
        String str = "aa\\\\aa\\\\ddaaaacc\\\\44\\gg\\ddddddddddddddd";//这里'\\'代表一个斜杆
        System.out.println(str);
        str = str.replaceAll("[\\\\]{2}", "\\\\");//replaceAll中需要用'\\\\'代表一个斜杆
        System.out.println(str);
    }

aa\\aa\\ddaaaacc\\44\gg\ddddddddddddddd
aa\aa\ddaaaacc\44\gg\ddddddddddddddd