今天用java调用mysql的存储过程.出现了以下错误:
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都用上了,没用...弄了大半天了,还望高手们帮帮忙

解决方案 »

  1.   

    应该是字符集设置的原因,SET NAMES ‘xxxxxx'  试一下。http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx
    MySQL 中文显示乱码
      

  2.   

    2楼的帖子学习过了.
    SHOW FULL COLUMNS FROM  test;
    collation
    gbk_chinese_ci
    但是我用jdbc程序里面直接insert into 表的话就是正常的,仅在存储过程里面出错....
      

  3.   

    http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx
      

  4.   

    问题解决了,不是字符编码的问题,应该是我截字符串的函数用的有问题,
    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楼是真正的高手,学习了不少字符集的东东...