SqlServer base64函數(shù)

今天碰到了一個很有趣的bug修復赎瞎,在這里記錄一下怔毛。

這個bug是由于接收訂單推送接口沒有記錄住一個打印物流面單的API地址独悴,每一個訂單有一個物流追蹤號和對應打印物流面單的地址骗灶,需要修復沒有記錄到的數(shù)據(jù)艘策。API地址大概長這樣:


留意到唯一的不同是data_param中的某一段不一樣就可展示不同的物流面單

看著很有規(guī)律但是又一頭霧水况褪,總感覺是一個可反向解碼的編碼撕贞。運氣很好的是拿其中一段去各種試,最后發(fā)現(xiàn)這種是base64的編碼测垛,而不一樣的那一段就是追蹤號捏膨,那就有戲了。下面是反向解碼:


于是有了思路食侮,數(shù)據(jù)庫有追蹤號号涯,那就只需要把追蹤號轉換成base64碼,再把前后拼回去就好了锯七。

第一步链快,建encode函數(shù)。

發(fā)現(xiàn)sqlserver沒有直接的base64函數(shù)眉尸,于是搜了一下域蜗,然后在數(shù)據(jù)庫里建了2個函數(shù)。實際上這里只用到了encode函數(shù)噪猾。

CREATE FUNCTION [dbo].[f_base64_encode]
(@bin varbinary(max))
returns varchar(max)
as begin
return cast(N'' as xml).value('xs:base64Binary(xs:hexBinary(sql:variable("@bin")))', 'varchar(max)')
end
GO
CREATE FUNCTION [dbo].[f_base64_decode]
(@64 varchar(max))
returns varbinary(max)
as begin
return cast(N'' as xml).value('xs:base64Binary(sql:variable("@64"))', 'varbinary(max)')
end
GO
第二步霉祸,測試encode函數(shù)

很有意思的是,同一個encode函數(shù)袱蜡,轉換寫死的追蹤號和轉換數(shù)據(jù)庫中字段(這里cast和convert是同樣效果的)丝蹭,出來的結果是不一樣的。

當然第一反應是看一下坪蚁,這第三個字段解碼后是什么奔穿,發(fā)現(xiàn)居然每個都是幫我加了個空格,如下圖迅细。


這中間還出了一個小插曲巫橄,在第一個在線轉換工具上解碼后看起來和用字符串NjQwMDIyODUyODQ1解碼是一樣的淘邻,實在不信邪換了一個工具才發(fā)現(xiàn)是不一樣的茵典,上圖已經(jīng)和第一個圖中的在線解碼工具不一樣。

什么問題呢宾舅?

那當然是有問題统阿,后來發(fā)現(xiàn)是nvarchar的使用問題彩倚,nvarchar每個字符用2個字節(jié)存儲,而'640022852845'的數(shù)據(jù)類型是varchar扶平,強行被教育了一波varcahr和nvarchar的區(qū)別帆离。

解決方案

怎么解決?想了各種辦法结澄,嘗試了各種手段之后哥谷,發(fā)現(xiàn)改數(shù)據(jù)表中字段的數(shù)據(jù)類型為varchar就好了,因為存的是追蹤號麻献,不會有需要2個字節(jié)才能存的字符(如中文们妥、韓文等非Unicode字符)。

第三步勉吻,更新數(shù)據(jù)

更新語句早就寫好监婶,就是拼上去,要不是被第二步的nvarchar和varchar問題卡住齿桃,1小時也就收工了惑惶。

UPDATE ODR_OrderMain SET Prediction_ERROR = 
    'http://api.yl-scm.com:22220/yunlu-order-web/rotaPrin/rotaPrintAction!doPrint.action?data_param=eyJjdXN0b21lcmlkIjoiUzAwMDAxQzEzNiIsImJpbGxjb2RlIjoi'
    + dbo.f_base64_encode(cast(TrackingNo as varbinary(50))) + 'IiwibGFuZ3VhZ2UiOiJNWVMifQ=='   
WHERE Prediction_ERROR = 'http';

驗證后發(fā)現(xiàn)數(shù)據(jù)庫中的API能正常調用,那就OK啦~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末短纵,一起剝皮案震驚了整個濱河市带污,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌香到,老刑警劉巖刮刑,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異养渴,居然都是意外死亡雷绢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門理卑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翘紊,“玉大人,你說我怎么就攤上這事藐唠》保” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵宇立,是天一觀的道長踪宠。 經(jīng)常有香客問我,道長妈嘹,這世上最難降的妖魔是什么柳琢? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上柬脸,老公的妹妹穿的比我還像新娘他去。我一直安慰自己,他們只是感情好倒堕,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布灾测。 她就那樣靜靜地躺著,像睡著了一般垦巴。 火紅的嫁衣襯著肌膚如雪媳搪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天骤宣,我揣著相機與錄音蛾号,去河邊找鬼。 笑死涯雅,一個胖子當著我的面吹牛鲜结,可吹牛的內容都是我干的。 我是一名探鬼主播活逆,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼精刷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蔗候?” 一聲冷哼從身側響起怒允,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锈遥,沒想到半個月后纫事,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡所灸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年丽惶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爬立。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡钾唬,死狀恐怖,靈堂內的尸體忽然破棺而出侠驯,到底是詐尸還是另有隱情抡秆,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布吟策,位于F島的核電站儒士,受9級特大地震影響,放射性物質發(fā)生泄漏檩坚。R本人自食惡果不足惜着撩,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一诅福、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧睹酌,春花似錦权谁、人聲如沸剩檀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沪猴。三九已至辐啄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間运嗜,已是汗流浹背壶辜。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留担租,地道東北人砸民。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像奋救,于是被迫代替她去往敵國和親岭参。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355