亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

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

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

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

資料遷移,整理分享。 問題發(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ī),針對同一個(gè)功能,即便是相同的數(shù)據(jù),也不會重復(fù)觸發(fā)。

二、結(jié)論聲明

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

三、原因解釋

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

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

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

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

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

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

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

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

4、set names gbk的作用

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

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

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

MySQL測試用例一 :


 在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測試用例二:

定義如下數(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 的編碼與請求端的實(shí)際編碼方式不匹配時(shí),會出現(xiàn)數(shù)據(jù)的亂碼情況。

OceanBase測試用例一 :


 通過代碼修改 當(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與請求端編碼一致時(shí)不會出現(xiàn)亂碼的情況。

Oceanbase測試用例二:

字段,測試代碼沿用mysql測試示例二中的內(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ù)會亂碼,后面出現(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)亂碼與不亂碼的情況請看下面的對比圖

這里有一個(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)象。下方為對比圖:


根據(jù)以上測試結(jié)果發(fā)現(xiàn),在oceanbase中當(dāng) character_set_connection 的編碼與請求端的實(shí)際編碼方式不匹配時(shí),會出現(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è)置方式請參考:

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