LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 748|回复: 2

[c,mysql]我将一个包含汉字的文件的数据用C insert到MySQL后乱码

[复制链接]
发表于 2006-12-17 12:22:39 | 显示全部楼层 |阅读模式
文件的部分内容如下:

  1. 283     第二分区        020179  水流指示        二层西前区
  2. 284     第二分区        020180  信号碟阀        二层西前区
  3. 285     第二分区        020181  防火阀  二层西前区
  4. 286     第二分区        020182  防火阀  二层西前区
复制代码


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. //#include <sys/iconv.h>
  6. //#include "/usr/src/sys/sys/iconv.h"
  7. //#include "/usr/src/bin/csh/iconv.h"
  8. #include "/usr/local/include/mysql/mysql.h"

  9. int
  10. main(int argc,char **argv)
  11. {
  12.     MYSQL           mysql;
  13.     FILE            *fp;

  14.     if( 2 != argc ){
  15.         fprintf(stderr,"Usage:./prog inputfile\n");
  16.         exit(-1);
  17.     }

  18.     if( NULL == (fp=fopen(argv[1],"r")) ){
  19.         fprintf(stderr,"%s\n",strerror(errno));
  20.         exit(-1);
  21.     }
  22.     fprintf(stdout,"file %s opend...\n",argv[1]);

  23.     mysql_init(&mysql);
  24.     if(NULL==mysql_real_connect(&mysql,"localhost","zhongyi","localhost","ZhongYi",0,NULL,0)){
  25.         fprintf(stderr,"Failed to connect to database: Error: %s\n",mysql_error(&mysql));
  26.         exit(-1);
  27.     }
  28.     fprintf(stdout,"DataBase Connected...\n");
  29.     if( 0 != mysql_options(&mysql,MYSQL_SET_CHARSET_NAME,"utf8")){
  30.         fprintf(stderr,"mysql_options Error: %s\n",mysql_error(&mysql));
  31.         exit(-1);
  32.     }
  33.     if( 0 != mysql_set_character_set(&mysql,"utf8") ){
  34.         fprintf(stderr,"mysql_set_character_set Error: %s\n",mysql_error(&mysql));
  35.         exit(-1);
  36.     }

  37.     /*  --------------------------------- */
  38.     /*  021     第一分区    010021  光电感烟    一层东后区 */
  39.     for(char buf[4096]; NULL != fgets(buf,4096,fp); ){
  40.         /*
  41.          * | fenqu  | char(30)
  42.          * | bianma | int(6) unsigned zerofill
  43.          * | liexin | char(30)
  44.          * | weizhi | char(30)
  45.          */
  46.         char query[1024]="INSERT INTO zy(fenqu,bianma,liexin,weizhi) VALUES('";
  47.         char *iter_b,*iter_e;

  48.         for(iter_b=buf; 0 < *iter_b; ++iter_b);
  49.         for(iter_e=iter_b; 0 > *iter_e; iter_e+=2);
  50.         strncat(query,iter_b,iter_e-iter_b);
  51.         strcat(query,"',");
  52.         for(iter_b=iter_e; ' '==*iter_b; ++iter_b);
  53.         for(iter_e=iter_b; ' '!=*iter_e; ++iter_e);
  54.         strncat(query,iter_b,iter_e-iter_b);
  55.         strcat(query,",'");
  56.         for(iter_b=iter_e; 0 < *iter_b; ++iter_b);
  57.         for(iter_e=iter_b; 0 > *iter_e; iter_e+=2);
  58.         strncat(query,iter_b,iter_e-iter_b);
  59.         strcat(query,"','");
  60.         for(iter_b=iter_e; 0 < *iter_b; ++iter_b);
  61.         for(iter_e=iter_b; 0 > *iter_e; iter_e+=2);
  62.         strncat(query,iter_b,iter_e-iter_b);
  63.         strcat(query,"')");

  64.         /*  iconv */
  65.         /*
  66.         iconv_t   cd;
  67.         char outbuf[1024];
  68.         size_t in=strlen(query),out=1024;

  69.         if( (iconv_t)-1 == (cd = iconv_open("UTF-8","GBK")) ){
  70.             fprintf(stderr,"Iconv_open Error: %s\n",strerror(errno));
  71.             exit(-1);
  72.         }
  73.         if( (size_t)-1 == iconv(cd,(char **)&query,(size_t *)&in,(char **)&outbuf,(size_t *)&out) ){
  74.             fprintf(stderr,"Iconv Eoor: %s\n",strerror(errno));
  75.             exit(-1);
  76.         }
  77.         */

  78.         if( mysql_real_query(&mysql,query,strlen(query)) ){
  79.             fprintf(stderr,"Error making query: %s\n",mysql_error(&mysql));
  80.         }

  81.         /*
  82.         if( -1 == iconv_close(cd) ){
  83.             fprintf(stderr,"Iconv_close Error: %s\n",strerror(errno));
  84.             exit(-1);
  85.         }
  86.         */
  87.     }

  88.     fclose(fp);
  89.     mysql_close(&mysql);

  90.     exit(0);
  91. }
复制代码


gcc -std=c99 -L /usr/local/lib/mysql/ -lmysqlclient -I /usr/local/include/mysql/ main.c -o sql

./sql ~/doc 运行后
进mysql看select * from zy;出来的是问号和空值:em10::em10::em10::em10:
发表于 2006-12-17 16:06:42 | 显示全部楼层
这个和文件编码、mysql设置都有关系吧
好好查查
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-23 10:58:31 | 显示全部楼层
嗯 ,弄好了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表