免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2135 | 回复: 5
打印 上一主题 下一主题

我将一个包含汉字的文件的数据用C insert到MySQL后乱码了,求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-17 10:54 |只看该作者 |倒序浏览
文件的部分内容如下:

  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;出来的是问号和空值

论坛徽章:
0
2 [报告]
发表于 2006-12-17 14:40 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2006-12-17 15:24 |只看该作者
我将输入文件的编码用iconv改成了utf8

mysql:
------------------------------------------------------------------
mysql> create table zy ( xuhao int(6) unsigned zerofill auto_increment
primary key not null, fenqu char(50) character set utf8, bianma int(6)
unsigned zerofill, liexin char(50) character set utf8, weizhi char(50)
character set utf8 );
Query OK, 0 rows affected (0.62 sec)

mysql> describe zy;
+--------+--------------------------+------+-----+---------+----------------+
| Field  | Type                     | Null | Key | Default | Extra
    |
+--------+--------------------------+------+-----+---------+----------------+
| xuhao  | int(6) unsigned zerofill | NO   | PRI | NULL    |
auto_increment |
| fenqu  | char(50)                 | YES  |     | NULL    |
    |
| bianma | int(6) unsigned zerofill | YES  |     | NULL    |
    |
| liexin | char(50)                 | YES  |     | NULL    |
    |
| weizhi | char(50)                 | YES  |     | NULL    |
    |
+--------+--------------------------+------+-----+---------+----------------+
5 rows in set (0.28 sec)
------------------------------------------------------------------

然后程序main.c

  1.      if( 0 != mysql_options(&mysql,MYSQL_SET_CHARSET_NAME,"utf8")){
  2.         fprintf(stderr,"mysql_options Error:
  3. %s\n",mysql_error(&mysql));
  4.     }
  5.     if( 0 != mysql_set_character_set(&mysql,"utf8") ){
  6.         fprintf(stderr,"mysql_set_character_set Error:
  7. %s\n",mysql_error(&mysql));
  8.     }

  9.     /*  --------------------------------- */
  10.     /*  021     第一分区    010021  光电感烟    一层东后区
  11. */
  12.     for(char buf[4096]; NULL != fgets(buf,4096,fp); ){
  13.         /*
  14.          * | fenqu  | char(30)
  15.          * | bianma | int(6) unsigned zerofill
  16.          * | liexin | char(30)
  17.          * | weizhi | char(30)
  18.          */
  19.         char query[1024]="INSERT INTO zy(fenqu,bianma,liexin,weizhi)
  20. VALUES('";
  21.         char *iter_b,*iter_e;

  22.         for(iter_b=buf; 0 < *iter_b; ++iter_b);
  23.         for(iter_e=iter_b; 0 > *iter_e; iter_e+=2);
  24.         strncat(query,iter_b,iter_e-iter_b);
  25.         strcat(query,"',");
  26.         for(iter_b=iter_e; ' '==*iter_b; ++iter_b);
  27.         for(iter_e=iter_b; ' '!=*iter_e; ++iter_e);
  28.         strncat(query,iter_b,iter_e-iter_b);
  29.         strcat(query,",'");
  30.         for(iter_b=iter_e; 0 < *iter_b; ++iter_b);
  31.         for(iter_e=iter_b; 0 > *iter_e; iter_e+=2);
  32.         strncat(query,iter_b,iter_e-iter_b);
  33.         strcat(query,"','");
  34.         for(iter_b=iter_e; 0 < *iter_b; ++iter_b);
  35.         for(iter_e=iter_b; 0 > *iter_e; iter_e+=2);
  36.         strncat(query,iter_b,iter_e-iter_b);
  37.         strcat(query,"')");

  38.         /*  iconv */
  39.         /*
  40.         iconv_t   cd;
  41.         char outbuf[1024];
  42.         size_t in=strlen(query),out=1024;

  43.         if( (iconv_t)-1 == (cd = iconv_open("UTF-8","GBK")) ){
  44.             fprintf(stderr,"Iconv_open Error: %s\n",strerror(errno));
  45.             exit(-1);
  46.         }
  47.         if( (size_t)-1 == iconv(cd,(char **)&query,(size_t *)&in,(char
  48. **)&outbuf,(size_t *)&out) ){
  49.             fprintf(stderr,"Iconv Eoor: %s\n",strerror(errno));
  50.             exit(-1);
  51.         }
  52.         */

  53.         if( mysql_real_query(&mysql,query,strlen(query)) ){
  54.             fprintf(stderr,"Error making query:
  55. %s\n",mysql_error(&mysql));
  56.         }

  57.         /*
  58.         if( -1 == iconv_close(cd) ){
  59.             fprintf(stderr,"Iconv_close Error: %s\n",strerror(errno));
  60.             exit(-1);
  61.         }
  62.         */
  63.     }

  64.     fclose(fp);
  65.     mysql_close(&mysql);

  66.     exit(0);

  67. }
复制代码


就可以了

论坛徽章:
0
4 [报告]
发表于 2006-12-17 20:09 |只看该作者
恭喜啊

论坛徽章:
0
5 [报告]
发表于 2006-12-17 21:08 |只看该作者
俺通过Google把俺的BC++需要的文件都找齐了,呵呵,备用

论坛徽章:
0
6 [报告]
发表于 2006-12-17 21:43 |只看该作者
原帖由 yejr 于 2006-12-17 20:09 发表
恭喜啊



可我还是不明白,头疼的是我不知道自己到底是具体的哪方面不明白

好像是编码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP