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