日韩欧美人妻无码精品白浆,www.大香蕉久久网,狠狠的日狠狠的操,日本好好热在线观看

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

某次信創(chuàng)環(huán)境Oceanbase數(shù)據(jù)庫偶發(fā)亂碼問題

freeflydom
2025年2月7日 9:53 本文熱度 950

資料遷移,整理分享。 問題發(fā)生在2023年


一、環(huán)境介紹及問題簡述

數(shù)據(jù)庫oceanbase
操作系統(tǒng)Linux (麒麟)
WEB中間件Tongweb
數(shù)據(jù)庫表編碼GBK
中間件默認(rèn)使用的HTTP通道編碼GBK
Java應(yīng)用UTF8

在客戶方搭建的信創(chuàng)環(huán)境中,使用麒麟Linux作為操作系統(tǒng),Oceanbase作為應(yīng)用數(shù)據(jù)庫,東方通TongWeb作為Web應(yīng)用容器,在此環(huán)境下 部署我司JAVA應(yīng)用(后續(xù)表述中將使用簡稱WebA),在WebA使用過程中,偶發(fā)的出現(xiàn)中文字符入庫后亂碼的問題,導(dǎo)致業(yè)務(wù)數(shù)據(jù)無法正常查看。

其中,oceanbase數(shù)據(jù)庫編碼使用GBK,TongWeb中HTTP通道也使用了默認(rèn)的GBK編碼,WebA則采用UTF8編碼,應(yīng)用與數(shù)據(jù)庫的連接,交由TongWeb中的數(shù)據(jù)源配置進(jìn)行池化管理。

該亂碼問題隨機(jī)出現(xiàn),無規(guī)律,時(shí)間隨機(jī),針對(duì)同一個(gè)功能,即便是相同的數(shù)據(jù),也不會(huì)重復(fù)觸發(fā)。

二、結(jié)論聲明

  • 排查后發(fā)現(xiàn),現(xiàn)場(chǎng)存在定制化功能,對(duì)外公布接口,該接口在收到請(qǐng)求后,會(huì)調(diào)用set names gbk這個(gè)數(shù)據(jù)庫命令以防止后續(xù)SP執(zhí)行返回中文亂碼。
  • 該命令會(huì)修改數(shù)據(jù)庫session級(jí)的字符編碼,而且WebA的數(shù)據(jù)庫連接是由中間件池化管理的,進(jìn)而導(dǎo)致連接池里的連接被 set names gbk 命令污染。
  • WebA采用的字符集又是UTF8,后續(xù)使用過程中,使用被污染的連接操作中文字符時(shí)就會(huì)出現(xiàn)亂碼問題。

三、原因解釋

1、作為前提,需要知道,每一種編碼方式會(huì)有自己的字符映射表。同樣的字節(jié)序列在不同的編碼方式中代表的是不同的字符。

2、在向數(shù)據(jù)庫服務(wù)器發(fā)送一條SQL指令時(shí),指令及指令中的數(shù)據(jù)是以字節(jié)序列的形式發(fā)送到后臺(tái)的。

3、在數(shù)據(jù)庫中,可以通過 show variables like '%char%' 命令獲取當(dāng)前連接下的數(shù)據(jù)庫編碼,如下圖

其中,character_set_client 是數(shù)據(jù)庫服務(wù)器認(rèn)為的請(qǐng)求端使用的字符編碼方式,如上圖,即便客戶端在發(fā)送sql語句時(shí),使用的是GBK編碼,服務(wù)器也會(huì)將其認(rèn)為是UTF8編碼進(jìn)行處理。

character_set_connection 數(shù)據(jù)庫服務(wù)器會(huì)把按照 character_set_client 編碼處理的字符再轉(zhuǎn)換為 character_set_connection 對(duì)應(yīng)的編碼方案。此時(shí),如果兩者的配置值相同,就可以省略一個(gè)轉(zhuǎn)換的操作。

服務(wù)器的后續(xù)操作中,還會(huì)發(fā)生 character_set_connection到數(shù)據(jù)庫表或數(shù)據(jù)表列的字符轉(zhuǎn)換。

character_set_results 是服務(wù)器向請(qǐng)求端返回?cái)?shù)據(jù)時(shí)使用的字符集,服務(wù)器會(huì)采用該變量指定的字符集對(duì)返回給客戶端的數(shù)據(jù)進(jìn)行編碼。

針對(duì)入庫亂碼的問題,此處重點(diǎn)關(guān)注 character_set_client 與 character_set_connection

4、set names gbk的作用

該 語句將三個(gè)會(huì)話系統(tǒng)變 量 character_set_client , character_set_connection 和 character_set_results 設(shè)置為給定的GBK字符集。 該命令僅作用于當(dāng)前數(shù)據(jù)庫會(huì)話,SESSION級(jí)別,詳情見SET NAMES_用戶指南_云數(shù)據(jù)庫OceanBase_敏捷版通用版本 (aliyun.com)。

另外,在OB數(shù)據(jù)中,支持在租戶級(jí)、Database 級(jí)、表級(jí)、字段級(jí)、session 級(jí)設(shè)置字符集,詳見字符集規(guī)范-OceanBase 數(shù)據(jù)庫 -OceanBase文檔中心-分布式數(shù)據(jù)庫使用文檔

5、測(cè)試(MySQL環(huán)境,OceanBase環(huán)境)。

MySQL測(cè)試用例一 :


 在WebA中通過代碼修改 當(dāng)前數(shù)據(jù)庫連接 的字符編碼設(shè)置,修改前后重復(fù)執(zhí)行  SELECT '中文字段啊四川省' as col FROM dual  語句,查看輸出結(jié)果是否亂碼。
character_set_clientcharacter_set_connection是否亂碼結(jié)果
utf8mb4utf8mb4 否
utf8mb4gbk




gbkgbk
gbkutf8mb4

MySQL測(cè)試用例二:

定義如下數(shù)據(jù)庫表


CREATE TABLE  encoding_test (  

 zzz  varchar(100) DEFAULT NULL,  

 xxx  varchar(100) DEFAULT NULL,  

 ccc  varchar(100) DEFAULT NULL,  

 vvv  varchar(100) DEFAULT NULL  

) ENGINE=InnoDB DEFAULT CHARSET=gbk

修改 當(dāng)前數(shù)據(jù)庫連接 的字符編碼設(shè)置,執(zhí)行insert插入語句,查看插入的數(shù)據(jù)是否亂碼。

character_set_clientcharacter_set_connection是否亂碼結(jié)果
utf8mb4utf8mb4
utf8mb4gbk
gbkgbk
gbkutf8mb4

由上結(jié)果可證: 在mysql的innodb引擎下,當(dāng) character_set_client 的編碼與請(qǐng)求端的實(shí)際編碼方式不匹配時(shí),會(huì)出現(xiàn)數(shù)據(jù)的亂碼情況。

OceanBase測(cè)試用例一 :


 通過代碼修改 當(dāng)前數(shù)據(jù)庫連接 的字符編碼設(shè)置,修改前后重復(fù)執(zhí)行  SELECT '中文字段啊四川省' as col FROM dual  語句,查看輸出結(jié)果是否亂碼。

character_se

t_client

character_se

t_connection

character_se

t_results

是否

亂碼

結(jié)果
utf8mb4utf8mb4utf8mb4 否
utf8mb4utf8mb4gbk
utf8mb4gbkutf8mb4
utf8mb4gbkgbk





gbkutf8mb4utf8mb4
gbkutf8mb4gbk
gbkgbkutf8mb4
gbkgbkgbk

根據(jù)上方表格及輸出截圖發(fā)現(xiàn),oceanbase中,character_set_connection與請(qǐng)求端編碼一致時(shí)不會(huì)出現(xiàn)亂碼的情況。

Oceanbase測(cè)試用例二:

字段,測(cè)試代碼沿用mysql測(cè)試示例二中的內(nèi)容,下方繼續(xù)以表格形式展示:

character_se

t_client

character_se

t_connection

character_se

t_results

是否亂碼結(jié)果
utf8mb4utf8mb4utf8mb4 否
utf8mb4utf8mb4gbk
utf8mb4gbkutf8mb4

無法確定。

默認(rèn)配置插入一條數(shù)據(jù)后,切換為當(dāng)前組合,第一或者第二條數(shù)據(jù)會(huì)亂碼,后面出現(xiàn)較少

utf8mb4gbkgbk無法確定,得不到確切的規(guī)律,多次執(zhí)行時(shí)甚至?xí)g接出現(xiàn)亂碼與不亂碼的情況。





gbkutf8mb4utf8mb4
gbkutf8mb4gbk
gbkgbkutf8mb4無法確定,得不到確切的規(guī)律,多次執(zhí)行時(shí)甚至?xí)g接出現(xiàn)亂碼與不亂碼的情況
gbkgbkgbk無法確定,得不到確切的規(guī)律,多次執(zhí)行時(shí)甚至?xí)g接出現(xiàn)亂碼與不亂碼的情況請(qǐng)看下面的對(duì)比圖

這里有一個(gè)很奇怪的地方是:

直 接運(yùn)行 set character_set_client = gbk, character_set_connection = gbk, character_set_results = gbk, 然后執(zhí)行插入,有時(shí)可以得到正常數(shù)據(jù),有時(shí)候又是亂碼的數(shù)據(jù)。


運(yùn)行 set names gbk后執(zhí)行插入,則可以穩(wěn)定觸發(fā)亂碼現(xiàn)象。下方為對(duì)比圖:


根據(jù)以上測(cè)試結(jié)果發(fā)現(xiàn),在oceanbase中當(dāng) character_set_connection 的編碼與請(qǐng)求端的實(shí)際編碼方式不匹配時(shí),會(huì)出現(xiàn)數(shù)據(jù)的亂碼情況,且該亂碼情況也是隨機(jī)出現(xiàn),無法確認(rèn)規(guī)律。

四、使用建議

1、 建議將 character_set_client , character_set_connection 和 character_set_results 都設(shè)置為應(yīng)用使用的編碼方式,在WebA應(yīng)用的環(huán)境下使用時(shí),應(yīng)該將參數(shù)默認(rèn)設(shè)置為 utf8mb4。具體設(shè)置方式請(qǐng)參考:

部署在oceanbase上需要注意字符集規(guī)范,oceanbase默認(rèn)字符集為utf-8, 無特殊需求無需修改。

oceanbase中指定字符集方式:

? 在創(chuàng)建租戶時(shí)設(shè)置字符集

o 可以在 create tenant 語句添加 charset 設(shè)置,添加 "charset=utf8"

o 可以在 OCP 中創(chuàng)建租戶時(shí),選擇字符集為utf8

? 設(shè)置客戶端(鏈路)字符集

o 客戶端(鏈路)字符集是配置 client 和 server 之間交互使用的字符集設(shè)置

set global character_set_client = utf8;

set global character_set_connection = utf8;

set global character_set_results = utf8;

? 設(shè)置客戶端字符集

o 使用jdbc 連接 OceanBase 數(shù)據(jù)庫,utf8 鏈路一般在 url 里修改參數(shù)設(shè)置,添加 characterEncoding=utf8

String url = "jdbc:oceanbase://xxx.xxx.xxx.xxx:xxxx?useSSL=false&useUnicode=true&characterEncoding=utf8&connectTimeout=30000&rewriteBatchedStatements=true";

客戶端和服務(wù)端字符集編碼要保持一致。

五、當(dāng)前采用的修復(fù)方案

1、使用jdbc初始化征信接口使用的數(shù)據(jù)庫連接,避免與框架使用的數(shù)據(jù)庫連接池沖突。

?轉(zhuǎn)自https://www.cnblogs.com/imzx/p/18688135


該文章在 2025/2/7 9:53:26 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄色在线不卡顿视频| 人妻无码午夜福利| 欧美淫乱视频网站| 日大香蕉视频| 中文字幕侵犯一区二区三区四区 | 欧美激呦呦呦| 久久剧情日韩| 美女露B毛短视频在线| 99久久18禁| 欧美激情三区免费| 天堂在线男人天堂2019| 亚州熟女99大香蕉综合| 1024久久毛片免费| 91人妻一页| 欧美100集久久久| 亚州综合一二区| 狠狠躁夜夜| 嗨嗨综合网| 国产自制夫妻性爱视频网站| 色台湾久久| 精品亚洲二区三区| 一级黄片AV免费试看| 美女天天日天天日干| 国产91卡| 日本少妇XXXX| 欧美黄片首页| 国产又黄又涩| 欧洲成人精品无码久久一区二区国产| 亚洲一二三影视| 天天躁曰曰躁狠狠躁av| 一区二区在线观看麻豆| 大黑屌狂插金发少妇| 麻豆AV男生摸动漫美女胸网站| 久久99国产精一区二区三无码| 国产在线观看无码一区| 日韩中文精品网站| 粉嫩98久久综合国产精品一区| 精品自拍偷拍| 日韩色中文| 黑人日韩黄色影片| 好痒啊想要视频|