com.mysql.jdbc.MysqlDataTruncation: Data truncation: Illegal double '57e488506566' value found during parsing
开始我以为是这个字段的问题,但是后来我发现时里面带中文的原因,我把传进去的中文去掉或者换成字母就没问题,可以确定是编码的问题,但是以前遇到的编码问题大不了就是乱码,编码统一就可以了,而且在数据库中直接call test3();传进中文也没问题就是程序传进去的出问题...这次遇到的问题貌似是在预编译的时候遇到的,"during parsing",这个真不知道怎么办了,google了半天也没个结果...
下面是程序:
DELIMITER $$
USE `test`$$
DROP PROCEDURE IF EXISTS `test3`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `test3`(IN str LONGTEXT CHARACTER SET gbk,IN n INT(5))
#批量数据入库
BEGIN
DECLARE i INT(11);
DECLARE len INT(11);
SET i = 1;
SET len = 0;
SET @sqltext = '' ;
SET @sqltemp = '';
WHILE i<=n DO
IF i = 1 THEN
SET @sqltemp = CONVERT(SUBSTR(str,1,LOCATE(';',str,1)-1) USING gbk);
ELSE
SET @sqltemp = CONVERT(SUBSTR(str,len+2,LOCATE(';',str,len+2)-len-2) USING gbk);
END IF;
IF MOD(i,1000) = 1 THEN
SET @sqltext = CONVERT(CONCAT('(',@sqltemp,')') USING gbk);
ELSEIF MOD(i,1000) = 0 THEN
SET @sqltext = CONVERT(CONCAT(@sqltext,',(',@sqltemp,')') USING gbk);
SET @sqltext = CONCAT('insert into taobao_item(iid,detail_url,num_iid,pic_path,num,approve_status,cid,user_id) values ',CONVERT( @sqltext USING gbk));
PREPARE stmt FROM @sqltext;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @sqltext = '';
ELSE
SET @sqltext = CONCAT(@sqltext,',(',@sqltemp,')');
END IF;
SET i = i+1;
SET len =len + LENGTH(@sqltemp);
SET @sqltemp = '';
END WHILE;
#处理剩余的插入值
IF @sqltext<>'' THEN
SET @sqltext = CONCAT('insert into taobao_item(iid,detail_url,num_iid,pic_path,num,approve_status,cid,user_id) values',CONVERT(@sqltext USING gbk)) ;
PREPARE stmt FROM @sqltext;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @sqltext='';
END IF;
END $$
DELIMITER ;
各位高手啊,我连最后的CHARACTER SET gbk,CONVERT都用上了,没用...弄了大半天了,还望高手们帮帮忙
5 个解决方案
#1
应该是字符集设置的原因,SET NAMES ‘xxxxxx' 试一下。
http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx
MySQL 中文显示乱码
http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx
MySQL 中文显示乱码
#2
多谢,明天再看了,头都大了....
#3
2楼的帖子学习过了.
SHOW FULL COLUMNS FROM test;
collation
gbk_chinese_ci
但是我用jdbc程序里面直接insert into 表的话就是正常的,仅在存储过程里面出错....
SHOW FULL COLUMNS FROM test;
collation
gbk_chinese_ci
但是我用jdbc程序里面直接insert into 表的话就是正常的,仅在存储过程里面出错....
#5
问题解决了,不是字符编码的问题,应该是我截字符串的函数用的有问题,
SET @sqltemp = CONVERT(SUBSTR(str,1,LOCATE(';',str,1)-1) USING gbk);
ELSE
SET @sqltemp = CONVERT(SUBSTR(str,len+2,LOCATE(';',str,len+2)-len-2) USING gbk);
END IF;
好像如果是中文的话截取就会出问题,具体原因不知道.而且这个方法太麻烦了..
最后用的是:SET @sqltemp = SUBSTRING_INDEX(SUBSTRING_INDEX(str,';',i),';',-1) ;(i是循环变量)这样只定位你要取的字符的位置,和字符串长度就没关系了,而且简单明了...
2楼是真正的高手,学习了不少字符集的东东...
SET @sqltemp = CONVERT(SUBSTR(str,1,LOCATE(';',str,1)-1) USING gbk);
ELSE
SET @sqltemp = CONVERT(SUBSTR(str,len+2,LOCATE(';',str,len+2)-len-2) USING gbk);
END IF;
好像如果是中文的话截取就会出问题,具体原因不知道.而且这个方法太麻烦了..
最后用的是:SET @sqltemp = SUBSTRING_INDEX(SUBSTRING_INDEX(str,';',i),';',-1) ;(i是循环变量)这样只定位你要取的字符的位置,和字符串长度就没关系了,而且简单明了...
2楼是真正的高手,学习了不少字符集的东东...
#1
应该是字符集设置的原因,SET NAMES ‘xxxxxx' 试一下。
http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx
MySQL 中文显示乱码
http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx
MySQL 中文显示乱码
#2
多谢,明天再看了,头都大了....
#3
2楼的帖子学习过了.
SHOW FULL COLUMNS FROM test;
collation
gbk_chinese_ci
但是我用jdbc程序里面直接insert into 表的话就是正常的,仅在存储过程里面出错....
SHOW FULL COLUMNS FROM test;
collation
gbk_chinese_ci
但是我用jdbc程序里面直接insert into 表的话就是正常的,仅在存储过程里面出错....
#4
#5
问题解决了,不是字符编码的问题,应该是我截字符串的函数用的有问题,
SET @sqltemp = CONVERT(SUBSTR(str,1,LOCATE(';',str,1)-1) USING gbk);
ELSE
SET @sqltemp = CONVERT(SUBSTR(str,len+2,LOCATE(';',str,len+2)-len-2) USING gbk);
END IF;
好像如果是中文的话截取就会出问题,具体原因不知道.而且这个方法太麻烦了..
最后用的是:SET @sqltemp = SUBSTRING_INDEX(SUBSTRING_INDEX(str,';',i),';',-1) ;(i是循环变量)这样只定位你要取的字符的位置,和字符串长度就没关系了,而且简单明了...
2楼是真正的高手,学习了不少字符集的东东...
SET @sqltemp = CONVERT(SUBSTR(str,1,LOCATE(';',str,1)-1) USING gbk);
ELSE
SET @sqltemp = CONVERT(SUBSTR(str,len+2,LOCATE(';',str,len+2)-len-2) USING gbk);
END IF;
好像如果是中文的话截取就会出问题,具体原因不知道.而且这个方法太麻烦了..
最后用的是:SET @sqltemp = SUBSTRING_INDEX(SUBSTRING_INDEX(str,';',i),';',-1) ;(i是循环变量)这样只定位你要取的字符的位置,和字符串长度就没关系了,而且简单明了...
2楼是真正的高手,学习了不少字符集的东东...