全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

nodejs和C语言插入mysql数据库乱码问题的解决方法

在这里记录了nodejs过程中的一些乱码情况,这里的乱码主要是由于网页的编码方式与nodejs的默认解码方式(utf8)不一致所造成的。这一次要说一下的是在C语言和nodejs与MySQL进行交互的时候出现的乱码问题。

       1,由于爬虫程序在多个Docker中执行,因此我需要定期的同步每一个docker中的mysql数据到一个全局的mysql数据表中。使用nodejs进行数据同步,出现中文乱码。要知道在每一docker中的中文是不存在乱码的。原因是nodejs默认处理字符是utf8,而mysql默认是latin1,毕竟是欧洲人开发的数据库。分析如下

       命令show variables like 'char%';得到的结果如下:

+--------------------------+----------------------------+
| Variable_name | Value  |
+--------------------------+----------------------------+
| character_set_client | latin1  |
| character_set_connection | latin1  |
| character_set_database | latin1  |
| character_set_filesystem | binary  |
| character_set_results | latin1  |
| character_set_server | latin1  |
| character_set_system | latin1  |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

       即在建立数据库的时候不特别指定,则数据库,数据表的以及数据字段的编码格式为默认值,而默认值在不更改配置文件的时候是latin1(默认安装形式)。由于utf8是较为通用的编码方式,因此我们将数据库的所有编码方式改为utf8。这里需要说明的是mysql的编码分为好几个层次,包括数据库级别,数据表级别以及数据字段级别等,我这里没有去深究这些方面,一个个去设置每个字段,每个表的编码方式,而是把所有的编码方式均设置为utf8。具体如下: 

      vi /etc/my.cnf修改my.cnf文件如下:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
default-character-set = utf8
character_set_server = utf8
[mysql]
default-character-set = utf8
[mysql.server]
default-character-set = utf8
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
default-character-set = utf8
[client]
default-character-set = utf8

       修改完之后,重起mysql服务service mysqld restart

       命令show variables like 'char%';再次查看编码格式,得到的结果如下:

+--------------------------+----------------------------+
| Variable_name | Value  |
+--------------------------+----------------------------+
| character_set_client | utf8  |
| character_set_connection | utf8  |
| character_set_database | utf8  |
| character_set_filesystem | binary  |
| character_set_results | utf8  |
| character_set_server | utf8  |
| character_set_system | utf8  |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

       可以看到所有的编码格式都会变成utf8,至此在建立数据库和数据表,数据字段的时候如果不特别指定,那么则会采用默认的编码方式,即现在的utf8。

       2,虽然编码格式从latin1变成了utf8,但是我这里还是遇到如下的问题。

Specified key was too long; max key length is 1000 bytes

       意思是key值长度大于1000个字节了,这里面的key值长度指的是定义key值时候的长度和乘以编码格式字节数,而不指实际长度。同时由于取1utf8=3字节(这个我是看别人都是这么说的,具体取多少我这边不确定),因此将其和乘以3之后就大于1000个字节了。原先latin1是没问题的(取的是1)。 

       解决办法即就是(1),缩减key值的定义长度。(2),不使用utf8编码。(3),因为默认DB engine 是MyIsAm,把其换成innodb。我使用方式(3),然后错误得以消除。

       3,这个时候又出现了如下问题:

ERROR: ER_TOO_LONG_KEY: Specified key was too long; max key length is 767 bytes

       这个问题的原因还是utf8所导致的,在latin1编码格式下,我设置了VARCHAR (512)类型为主键是没有问题的,而utf8则不行,是由于utf8编码取的是3字节,也就说,只能容纳256个utf8编码格式的VARCHAR。因此定义的时候定义为VARCHAR (255)问题得以消除,或者换一种数据类型。 

       4,至此我使用nodejs进行数据库的读写都是没有问题的,但是我在使用C 语言的时候,发现插入utf8编码的中文,仍然显示的是乱码。原因可能由多种,这里面我说一下我遇到的两种情况。首先确认本地系统的默认编码方式,使用locale命令进行查看(Linux),通常情况应该是utf8,为了保险期间,我在C语言中加入了如下的代码显示指定编码方式

#include <locale.h>
setlocale(LC_ALL, "en_US.UTF-8");

       这个时候,C语言执行mysql_query插入数据的时候,数据库仍然显示乱码。解决方法如下:

mysql_query(g_pMyConn, "set character set utf8");
mysql_query(g_pMyConn, g_strSqlStatement)

       即在执行数据库插入命令前,多加上一行显示的说明使用utf8方式执行。

       由于nodejs插入的时候没有C语言的问题,我就简单构想了一下如下原因,纯属个人猜测:

       由于C语言使用的是mysql官方提供的api接口,而且mysql是由于欧洲人开发的,开始的时候没想到会应用那么广泛,因此使用了latin1默认编码,随着mysql应用的人越来越多,因此在支持其他编码的时候就需要在原来的接口上打补丁,因此就会出现上面显示的指定编码格式,并没有做到接口和数据库默认编码能够自动保持一致的情况。 

       对于nodejs来说,连接数据库的行为会由nodejs进行封装,考虑的就相对全面,因此没有C 语言中的问题。

       最后我发现DB engine 从MyIsAm换成innodb,读取速度好变慢了,不知是啥原因,知道的麻烦告知一声。

以上所述是小编给大家介绍的nodejs和C语言插入mysql数据库乱码问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# nodejs  # c语言  # mysql  # 乱码  # mysql数据库  # c语言连接mysql数据库的实现方法  # linux安装mysql和使用c语言操作数据库的方法 c语言连接mysql  # 用C语言操作MySQL数据库的通用方法  # C语言实现访问及查询MySQL数据库的方法  # MySQL系列教程之使用C语言来连接数据库  # 的是  # 都是  # 我在  # 这个时候  # 这里面  # 是由于  # 即在  # 小编  # 默认值  # 的人  # 我是  # 我就  # 就会  # 一声  # 是在  # 在这里  # 我说  # 多个  # 在此  # 两种 


相关文章: 网站好制作吗知乎,网站开发好学吗?有什么技巧?  如何做网站制作流程,*游戏网站怎么搭建?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  高端云建站费用究竟需要多少预算?  建站之星2.7模板快速切换与批量管理功能操作指南  小程序网站制作需要准备什么资料,如何制作小程序?  如何批量查询域名的建站时间记录?  如何快速登录WAP自助建站平台?  ,怎么用自己头像做动态表情包?  小型网站制作HTML,*游戏网站怎么搭建?  简单实现Android文件上传  建站主机选虚拟主机还是云服务器更好?  山东网站制作公司有哪些,山东大源集团官网?  网站制作报价单模板图片,小松挖机官方网站报价?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  如何零基础在云服务器搭建WordPress站点?  如何在阿里云ECS服务器部署织梦CMS网站?  如何在新浪SAE免费搭建个人博客?  中山网站推广排名,中山信息港登录入口?  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  如何有效防御Web建站篡改攻击?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  郑州企业网站制作公司,郑州招聘网站有哪些?  如何使用Golang table-driven基准测试_多组数据测量函数效率  香港服务器网站卡顿?如何解决网络延迟与负载问题?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  焦点电影公司作品,电影焦点结局是什么?  宁波自助建站系统如何快速打造专业企业网站?  ,在苏州找工作,上哪个网站比较好?  建站之星24小时客服电话如何获取?  建站主机如何选?性能与价格怎样平衡?  北京网站制作网页,网站升级改版需要多久?  如何在西部数码注册域名并快速搭建网站?  网站制作软件有哪些,制图软件有哪些?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  想学网站制作怎么学,建立一个网站要花费多少?  如何快速查询网站的真实建站时间?  建站VPS选购需注意哪些关键参数?  宝塔Windows建站如何避免显示默认IIS页面?  官网网站制作腾讯审核要多久,联想路由器newifi官网  浅谈Javascript中的Label语句  定制建站如何定义?其核心优势是什么?  如何在建站之星网店版论坛获取技术支持?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  制作网站的公司有哪些,做一个公司网站要多少钱?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  济南专业网站制作公司,济南信息工程学校怎么样?  高端网站建设与定制开发一站式解决方案 中企动力 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。