nodejs和C语言插入mysql数据库乱码问题
来源:互联网 发布:vs2015怎么用c语言 编辑:程序博客网 时间:2024/05/21 19:30
在这里记录了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/mysqlsocket=/var/lib/mysql/mysql.sockuser=mysqldefault-storage-engine=INNODBdefault-character-set = utf8character_set_server = utf8[mysql]default-character-set = utf8[mysql.server]default-character-set = utf8# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0[mysqld_safe]log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.piddefault-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。因为涉及到更改了数据库的属性,因此需要重建一个新的数据库,如果在以前非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),然后错误得以消除。如上述的配置文件中的default-storage-engine=INNODB
语句。
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,读取速度好变慢了,不知是啥原因,知道的麻烦告知一声。
参考博客:
http://blog.csdn.net/e3399/article/details/7573257
http://blog.csdn.net/ACMAIN_CHM/article/details/4174186
http://blog.csdn.net/mvpme82/article/details/8056746
http://blog.csdn.net/cindy9902/article/details/6215769
本文为CSDN村中少年原创文章,转载记得加上小尾巴偶,博主链接这里。
- nodejs和C语言插入mysql数据库乱码问题
- linux c和vc mysql插入数据库后,显示乱码
- Eclipse 提取MySql中文乱码问题和向mysql数据库插入中文乱码问题
- JDBC插入Mysql数据库中文乱码问题
- MVC3 EntityFramework 插入Mysql数据库 乱码问题
- 插入到MySql数据库中乱码问题
- MySQL数据库插入中文数据乱码问题
- mysql数据库插入数据中文乱码问题
- MySql数据库插入乱码
- MySQL数据库插入乱码
- mysql和eclipse插入语句乱码问题
- 插入数据库乱码问题
- 插入mysql乱码问题
- Mysql插入乱码问题
- 解决C++连接MySQL数据库插入和获取记录中文字符乱码问题
- 解决插入MySQL数据库表时的乱码问题
- 解决jsp插入mysql数据库中的数据出现乱码问题
- 解决插入到MySql数据库中乱码问题
- 凯撒密码,简单的加密
- Leetcode 1. Two Sum
- 【Unity3D】Helloworld
- MyISAM表的存储格式---行格式
- I2S信号
- nodejs和C语言插入mysql数据库乱码问题
- Android项目 系统设计架构
- org.apache.ibatis.exceptions.PersistenceException: 前言中没有内容 错误的正确解决方法
- hdu 1394 Minimum Inversion Number -求逆序对的个数- 线段树单节点更新
- Linux系统源代码升级glibc到最新版本2.25.90(正在开发的版本)
- 【spark】使用scala读取项目中的文件的方法
- POJ 2236 Wireless Network(带权并查集)
- MVC流程
- 解决Eclipse中启动Tomcat时出现 Port 8080 required by Tomcat v8.5 Server at localhost is already in use...