欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

nodejs和C語言插入mysql數(shù)據(jù)庫亂碼怎么辦-創(chuàng)新互聯(lián)

這篇文章將為大家詳細講解有關(guān)nodejs和C語言插入mysql數(shù)據(jù)庫亂碼怎么辦,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

站在用戶的角度思考問題,與客戶深入溝通,找到余江網(wǎng)站設(shè)計與余江網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、虛擬主機、企業(yè)郵箱。業(yè)務(wù)覆蓋余江地區(qū)。

在這里記錄了nodejs過程中的一些亂碼情況,這里的亂碼主要是由于網(wǎng)頁的編碼方式與nodejs的默認解碼方式(utf8)不一致所造成的。這一次要說一下的是在C語言和nodejs與MySQL進行交互的時候出現(xiàn)的亂碼問題。

      1,由于爬蟲程序在多個Docker中執(zhí)行,因此我需要定期的同步每一個docker中的mysql數(shù)據(jù)到一個全局的mysql數(shù)據(jù)表中。使用nodejs進行數(shù)據(jù)同步,出現(xiàn)中文亂碼。要知道在每一docker中的中文是不存在亂碼的。原因是nodejs默認處理字符是utf8,而mysql默認是latin1,畢竟是歐洲人開發(fā)的數(shù)據(jù)庫。分析如下

      命令show variables like 'char%';得到的結(jié)果如下:

+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+

      即在建立數(shù)據(jù)庫的時候不特別指定,則數(shù)據(jù)庫,數(shù)據(jù)表的以及數(shù)據(jù)字段的編碼格式為默認值,而默認值在不更改配置文件的時候是latin1(默認安裝形式)。由于utf8是較為通用的編碼方式,因此我們將數(shù)據(jù)庫的所有編碼方式改為utf8。這里需要說明的是mysql的編碼分為好幾個層次,包括數(shù)據(jù)庫級別,數(shù)據(jù)表級別以及數(shù)據(jù)字段級別等,我這里沒有去深究這些方面,一個個去設(shè)置每個字段,每個表的編碼方式,而是把所有的編碼方式均設(shè)置為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服務(wù)service mysqld restart

      命令show variables like 'char%';再次查看編碼格式,得到的結(jié)果如下:

+--------------------------+----------------------------+
| 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,至此在建立數(shù)據(jù)庫和數(shù)據(jù)表,數(shù)據(jù)字段的時候如果不特別指定,那么則會采用默認的編碼方式,即現(xiàn)在的utf8。

      2,雖然編碼格式從latin1變成了utf8,但是我這里還是遇到如下的問題。

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

      意思是key值長度大于1000個字節(jié)了,這里面的key值長度指的是定義key值時候的長度和乘以編碼格式字節(jié)數(shù),而不指實際長度。同時由于取1utf8=3字節(jié)(這個我是看別人都是這么說的,具體取多少我這邊不確定),因此將其和乘以3之后就大于1000個字節(jié)了。原先latin1是沒問題的(取的是1)。 

      解決辦法即就是(1),縮減key值的定義長度。(2),不使用utf8編碼。(3),因為默認DB engine 是MyIsAm,把其換成innodb。我使用方式(3),然后錯誤得以消除。

      3,這個時候又出現(xiàn)了如下問題:

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

      這個問題的原因還是utf8所導(dǎo)致的,在latin1編碼格式下,我設(shè)置了VARCHAR (512)類型為主鍵是沒有問題的,而utf8則不行,是由于utf8編碼取的是3字節(jié),也就說,只能容納256個utf8編碼格式的VARCHAR。因此定義的時候定義為VARCHAR (255)問題得以消除,或者換一種數(shù)據(jù)類型。 

      4,至此我使用nodejs進行數(shù)據(jù)庫的讀寫都是沒有問題的,但是我在使用C 語言的時候,發(fā)現(xiàn)插入utf8編碼的中文,仍然顯示的是亂碼。原因可能由多種,這里面我說一下我遇到的兩種情況。首先確認本地系統(tǒng)的默認編碼方式,使用locale命令進行查看(Linux),通常情況應(yīng)該是utf8,為了保險期間,我在C語言中加入了如下的代碼顯示指定編碼方式

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

      這個時候,C語言執(zhí)行mysql_query插入數(shù)據(jù)的時候,數(shù)據(jù)庫仍然顯示亂碼。解決方法如下:

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

      即在執(zhí)行數(shù)據(jù)庫插入命令前,多加上一行顯示的說明使用utf8方式執(zhí)行。

      由于nodejs插入的時候沒有C語言的問題,我就簡單構(gòu)想了一下如下原因,純屬個人猜測:

      由于C語言使用的是mysql官方提供的api接口,而且mysql是由于歐洲人開發(fā)的,開始的時候沒想到會應(yīng)用那么廣泛,因此使用了latin1默認編碼,隨著mysql應(yīng)用的人越來越多,因此在支持其他編碼的時候就需要在原來的接口上打補丁,因此就會出現(xiàn)上面顯示的指定編碼格式,并沒有做到接口和數(shù)據(jù)庫默認編碼能夠自動保持一致的情況。 

      對于nodejs來說,連接數(shù)據(jù)庫的行為會由nodejs進行封裝,考慮的就相對全面,因此沒有C 語言中的問題。

      最后我發(fā)現(xiàn)DB engine 從MyIsAm換成innodb,讀取速度好變慢了,不知是啥原因,知道的麻煩告知一聲。

關(guān)于“nodejs和C語言插入mysql數(shù)據(jù)庫亂碼怎么辦”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站aaarwkj.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站標題:nodejs和C語言插入mysql數(shù)據(jù)庫亂碼怎么辦-創(chuàng)新互聯(lián)
文章URL:http://aaarwkj.com/article26/dppojg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站營銷型網(wǎng)站建設(shè)、App開發(fā)、小程序開發(fā)、搜索引擎優(yōu)化域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管
国产成人精品视频午夜蜜蜂| 日本黄色高清视频一区| 欧美熟妇在线视频你懂的| 国产麻豆剧传媒国产av| 欧美精品一区二区毛卡片| 国产男女免费完整视频| 天堂av五月在线观看| 国产精品综合日韩精| 日韩精品中文字幕国产精品| 国产欧美日韩经典一区| 欧美激情性国产精品潮| 日本在线一区二区三区免费视频| 精精国产xxxx视频在线不卡| 亚洲天堂av现在观看| 亚洲熟女精品不卡一区二区| 人妻鲁丝一区二区三区| 国产伦国产一区二区三区在线观看| 日本不卡一区二区视频| 国产91高清免费视频| 欧美系列诱惑性国产精品| 欧美成人精品视频在线不卡| 久久精品国产亚洲av热老太| 在线观看免费视频成人播放| 国产精品观看在线亚洲人成网| 欧美亚洲综合日韩精品区| 伊人亚洲中文一区二区| 十八禁在线观看国产一区| 久久免费看少妇高潮av| 国产久精品热看久品热久热| 日本福利资源在线观看| 亚洲码欧洲码一二三区| 91麻豆粉色视频在线| 日韩欧美国产精品自拍| 国产精品国产精品三级在线观看| 欧美中文字幕内射合集| 亚洲精品一区二区播放| 国产一级三级视频在线| 日韩新片免费专区在线| 亚洲黄色录像特级生活片| 亚洲精品成人在线国产| 欧美日本国产专区一区|