求救啊,没遇到过的问题java调用mysql存储过程编码问题

sunsetfreedom 2010-09-23 10:48:46
今天用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都用上了,没用...弄了大半天了,还望高手们帮帮忙
...全文
161 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunsetfreedom 2010-09-24
  • 打赏
  • 举报
回复
问题解决了,不是字符编码的问题,应该是我截字符串的函数用的有问题,
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楼是真正的高手,学习了不少字符集的东东...
ACMAIN_CHM 2010-09-23
  • 打赏
  • 举报
回复
http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx

[Quote]9. 存储过程参数乱码

create procedure t ( aa char(10) charset 'gbk')
[/Quote]
sunsetfreedom 2010-09-23
  • 打赏
  • 举报
回复
2楼的帖子学习过了.
SHOW FULL COLUMNS FROM test;
collation
gbk_chinese_ci
但是我用jdbc程序里面直接insert into 表的话就是正常的,仅在存储过程里面出错....
sunsetfreedom 2010-09-23
  • 打赏
  • 举报
回复
多谢,明天再看了,头都大了....
ACMAIN_CHM 2010-09-23
  • 打赏
  • 举报
回复
应该是字符集设置的原因,SET NAMES ‘xxxxxx' 试一下。

http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx
MySQL 中文显示乱码

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧