9/27/2008 2:04:00 AM

令人火大的 SQL 字元編碼...

SQL | TROUBLE SHOOTING | 不爽

今天同事有個問題搞不定,就找我去處理,越弄越火... 嘖嘖,這裡就來還原一下現場,記錄一下這個鳥問題...。

最討厭處理這種問題了。現在客戶 IT 都委外,結果就變成 IT 本身不大管事,什麼事就交給外包商就好... 而這種 A 包商跟 B 包商之間的問題,往往就變成踢皮球... 除非有明確證據指出人就是他殺的,不然? 出問題的一方自己摸摸鼻子吧。幾年來吃了不少這種虧,這就是小廠的悲哀啊。

這次碰到的例子是客戶 A 系統建的資料,需要整理後匯到我們負責維護的 B 系統。而中間資料需要作些修正,所以建了一個中繼資料庫,透過 LINKED SERVER,從 A 系統的 DB 把整個 TABLE SELECT 一份到中繼資料庫,然後再進行一連串的修正...

 

image

一開始問題很單純,就兩邊碰到中文字編碼不同,直接 SELECT 就碰到這樣的亂碼..

 

image

看起來是個小問題,請對方 IT 確認了編碼的問題後,我在中繼資料庫作了點調整,convert 成 ntext 就搞定了。已經可以跑出正確的中文資料了。

正想把程式弄一弄就收工,然後很得意的回報問題搞定時,發現不大對勁,怎麼整個 BATCH 跑下來結果還是錯的? 還錯的不一樣? 真是奇了... 原本轉 UNICODE 問題,再怎麼樣也應該只是變亂碼,或是變 ? 而以,結果這次看到的是資料錯亂,跑出其它的字出來...

 

image

這張圖是我把問題簡化後抓到的,原本是有上百行的 SQL SCRIPT ... @_@ 被我抽絲撥繭剩這段。第 33 筆資料是有問題的,不過出現的資料不是原本 "馥瑈" 啊,原本是第二個字變成 ? 而以... 現在竟然變成上一筆資料 (第32筆) 的內容,而第三個字 '榮' 則是由前面好幾筆的 "XX榮" 留下來,第四個字 "子" 就真的不曉得從那裡來了...

 

好怪的問題,如果是程式碰到這種 BUG,一看就像某個 BUFFER 沒清掉就一直重複被使用,後面的值直接蓋掉前面的值,字串長一點沒被蓋掉,就這樣留下來了。而到了第 33 這筆不知為什麼原因,整個 BUFFER 的內容就跑出來... 這段 SQL SCRIPT 跟本沒作什麼事,不過是前面的 SELECT 指令,改 SELECT INTO 到 TEMP TABLE,然後再撈出來而以。直接 SELECT 沒問題,沒道理 SELECT INTO 就掛掉啊! 不過還真的被我碰到了,see the ghost ..

 

我沒有直接拼下去 GOOGLE 或是試各種解法,而是想了一下問題是怎麼回事? SQL / DB 的東西我只算外行人,沒本事跟他硬碰硬,我也不知道有啥工具可以看 SQL NATIVE CLIENT 的 TRACE INFO 之類的,只能靠想像,猜一下問題會在那。一開始我就否定掉是不是什麼編碼或是定序的問題,因為我可以正確的 SELECT 出來啊,而且如果 SELECT INTO 是變成 ?? 的話我也許還會頭痛一點,不過竟然是上一筆的資料跑過來了? 這個問題很明顯的,跟本就是 overflow (緩衝區溢位) 之類的 BUG。八成是什麼地方應該填個 0x00 作字串結尾的 CODE 錯掉,結果 SQL 就抓過頭,抓到不該抓的舊資料才會這樣。

 

拿我寫了十幾年程式的經驗,跟它賭下去了!!  於是我就沒再去跟一堆編碼定序之類的設定搏鬥了,因為我認定這是 SQL SERVER 或是 SQL NATIVE CLIENT 的 BUG。我採的方案是找可以繞過去的方式,於是我把我想的到的 COPY TABLE 都用上了,最後試出來的是笨方法...

 

用... 用... 用 CURSOR 一筆一筆的跑... @_@

 

哈哈,各位看倌請笑小聲一點,我這貴州的驢子就只會這種把戲而以.... 果然這樣就正確了。CURSOR 的 FETCH 指令,把欄位的值抓到 nvarchar 的變數,就一切 OK,然後再把這變數的值 update 回我的暫存 TABLE,就什麼問題都沒了 -_-

 

真是它ㄨㄨㄨㄨ的,最後的 SOLUTION 細節我就不一一的貼出來了,反正只是換個方式 COPY TABLE 而以。既然我賭是 M$ 的問題,而換條路的方式 (完全沒改任何定序 OR 編碼) 也成功了,我就不跟它奮鬥下去了,客戶的 IT 既然懶的上 UPDATE / SERVICE PACK,我也只好避掉問題了事... 咳咳。特地貼出來記念一下,如果你們也碰到一樣的問題,切記切記,別跟它硬碰硬啊... :D



9/1/2008 2:11:00 AM

請正確的引用文章內容!

543 | 不爽

在開始講 "為什麼" 之前,先講一下該如何正確的引用我的文章。

  1. 明確的提供本站及該文的網址。例如:

    ........ 網路上有個叫安德魯的寫過一篇文章: "任意放大/縮小網頁的內容" ...........


  2. 若要轉貼,請以不超過 1/3 內容為原則 (程式碼及檔案下載不算),同時也要包含第一點的資訊。引用的部份請在格式上跟你的原文有所區隔,用斜體或是改顏色都可以。例如:

    ........ 網路上有個叫安德魯的寫過一篇文章: "任意放大/縮小網頁的內容" ,他提到一個用法:
    把“放網頁大 200%”的功能直接加在我的最愛

    只要把這個 link 加到書籤, 就大功告成了!

    javascript:document.body.style.zoom="150%";void(0);

    之後看到任何網頁, 覺的看不過癮想放大看, 再點一下這個 Bookmark 就好了.
    覺的固定 150% 不好用, 那可以把 link 改成這樣:

    javascript:document.body.style.zoom=prompt('縮放比例 (%):','100%');void(0);

  3. 如果要轉貼的部份超過 1/3,或是會牽扯到商業行為,請務必取得我的同意
    聯絡方式很簡單,在這裡留言我會看的到。

    如果你要透過 RSS 自動轉貼,我也很歡迎! 不過一樣要符合前面兩點要求,請勿轉貼超過 1/3 的內容。如果你的 RSS 轉貼系統只能轉貼整篇,很抱歉,只好請你停止 RSS 轉貼。

    另外,所謂的商業行為,不只是拿去投稿出書賺稿費之類的,如果你轉載的網頁有刊登廣告,就已經算是商業行為了。

 

 

--------------------------------------------------------------------------------------------------------------------------------

引用說明結束。以下為本文內容,純發洩用。

 

為什麼突然要貼這篇? 該說是 "一回生二回熟" 嘛? 沒錯,每次一時興起,到 GOOGLE 找一下我自己的資訊,總是會發現有人沒經過我同意轉貼我的文章...。轉貼對我實質上的影響並不大,畢竟我寫東西是興趣,不是拿還養家糊口的,所以被轉貼除了心理不大爽之外,其它都還好。不過這樣會大大的降低我寫東西的意願。

舉例來說,最不滿的就是像上次在對岸的入口網站碰到的案例,原文照貼,沒註明出處,留 comment 提醒還被砍掉!? 回報站方也是一副不理不睬的樣子... 這種沒什麼好說的了,直接用我的方式表達我的不滿。

碰過另一個例子,也是很令人厭惡,就是到處轉貼文章,不管有沒有註明出處。落落長的一整篇文章就被 COPY / PASTE 過去,最後加個小小的 "出處" 就算免責了? 如果他的網頁還放了廣告,那就等於是不當的取得利益。講的難聽一點,這跟盜版沒兩樣,不都是用別人的作品去賺取利益? 最後是通知 BLOGGER,站方停權結束這件事。

 

看過 Jedi 的文章,我很認同他在這篇 [引用不能祇是引用] 文章裡的看法。很多人好像以為只要加了 trackback 就是盡到道義上的責任了? Trackback 太方便了,之前用的 CS 甚至方便到連 trackback 的 URL 都不需要點,一切全都無腦化自動的進行。方便到好像原本該尊重作者的動作都不用作了,直接貼了就好。所以我的網站刻意不放 trackback,因為我不喜歡這樣的結果。

我自己認為尊重作者的引用方式,要有兩個前題。一個是清楚的讓你的讀者知道,這段引用的內容出自那個人的那一篇文章。另外就是轉貼的部份。如果你不能只提供 LINK,而需要轉貼它人的內容到你的文章內,請把握好 "片段" 的原則。轉貼幾句話是合理的,轉貼一整篇就是白目了。這跟書本只影印一部份 (好像是 1/3 以內?) 是合法的,整本影印就侵害到原作者版權了。網路上的內容,複製更容易了,也讓人更容易忽略掉這些問題。

 

所謂 "不教而殺謂之虐",就藉著這個機會說明一下,怎樣作我才不會認為我的權益被侵害。我很歡迎同好轉貼我的文章,不過我既然是我自己的文章,我會保有這幾項權益:

  1. 個人形象
    我會發佈的東西都是在 internet 上代表我這個人。要幫我散佈可以,不過請務必讓讀者知道我的網址及該篇文章的網址。
  2. 讀者 feedback
    收到有人看了我的文章有 feedback, 對我是一大鼓勵。如果你引用的方式違背了第一點,就有可能讓想給我 feedback 的讀者找不到管道。
  3. 點閱率 / 廣告
    很實際的一點,如果你不當的引用會影響我的點閱率 (如同那些全文照貼的),不論你有沒有註明出處,在這個層面上就已經侵犯到我的權益了。雖然我不靠廣告過日子,不過我把它當作打電動的經驗值看待,看著點閱次數增加也是一種成就感。
  4. 原作者要知道作品如何被利用
    如果你有不得以的理由 (比如要發布在內部,不能連到 internet, 或是發部在平面媒體、報章雜誌) 必需原文照貼,沒有辦法滿足上面三點...,或是你要拿去賣錢等等之類的商業應用,請務必取得我本人的同意。

 

這篇不是合約,也不是在訂什麼法律條文...。我只是想表達出我對於 "轉貼" 及 "引用" 的看法而以。其實任何方式的引用我都歡迎,只要不違背上面四點原則為前題就好。只是一直碰到類似的事件,我不想成為處理盜文事件的老手啊啊啊...。希望打了這篇,可以讓那些沒有惡意的轉貼行為,不會被我誤認為又是盜文事件。



8/14/2008 2:09:16 AM

話題人物?

543 | 不爽

之前因為被盜文,除了被弄的不大爽之外,倒也沒什麼事,不過有人給我個 link,無意間發現對岸竟然有這麼篇文章...

(最原始的網頁不知為何被下架了,底下提供的 LINK 是目前還連的到的...)

URL: http://www.cnblogs.com/hullfqaz/archive/2008/07/28/1254315.html

 

image

 

看了又好氣又好笑... 沒想到對岸有網友在討論我碰到的事件啊,底下還真的有人回應批評百度...。前同事 在 MSN 跟我打屁,說這篇引用我的事例來討論的網站,也一樣沒有經過我的同意就轉貼,我的言論可能會引起兩岸對立,引發第三次世界大戰... Orz...

這次好一點,雖然也是原文照貼我的文章,至少是全文照貼,頭尾都留著,LINK 也留著,沒有很 "自動" 的翻成簡體中文...後來好奇用相關關鑑字再去 GOOGLE 找看看,多找到一篇:

URL: http://blog.const.net.cn/news/20080728/ec3b4ba924bde2b4.htm

 

不過這次運氣差了點,我的 IP 被封鎖不能看... 我應該沒有偉大到讓對方直接封我的 IP 吧?

image

 

不過人氣好像不大夠,搜了半天才搜到這兩篇... 看來要上頭條新聞還久的很.. 哈哈..



6/28/2008 12:50:00 AM

很抱歉,本站不歡迎來自 [百度] (Baidu.com) 的訪客 !!

543 | 不爽 | 技術隨筆

沒什麼特別的,只是針對這次的盜文事件,我很不滿意百度 (Baidu.com) 的處理方式而以。

幾個月前曾發生過 BLOGGER.COM 有人直接把我的文章一字不漏的貼在他的 BLOG 上,沒有標示文章出處,最後用我破破的英文跟 GOOGLE 反映之後,GOOGLE 立即作了處理,關閉那位使用者的網頁

這次碰到類似的情況,有耐心的人就聽我講完這無聊的故事吧。無意間我在對岸的入口網站 [百度知道] (類似奇摩知識+的網站),發現有人拿我的文章,一字不漏的貼上去回答問題賺點數,一樣沒有標示文章出處,感到非常的不滿,馬上註冊了帳號,留下回應表示該文侵犯了我的權益,要求引用文章要註明出處,同時也跟站方反應了這個情況,要求站方作妥善的處理。

原本以為事情會像上次一樣,跟 GOOGLE 一樣的處理方式結束。沒料到...

  1. 隔天,發現我的留言被刪了? 嗯... 再補一次。
  2. 跟站方反應的結果? 竟然說這個不尊重智財權的使用者沒有違反規定???? 所以不做任何處理。
  3. 另一方面,留言留了不斷的被刪除,到現在已經被刪了第五次了,第六次的留言不知道會留到什麼時後...。

很無聊的戲就這樣一直演下去... 就是不斷的抗議又被刪除,跟站方反應卻又不理睬...。看來小蝦米是對抗不了大鯨魚的,也只能這樣了。其實我除了文章被盜貼之外沒有什麼具體的損失,就是心理很不爽而以,而更離譜的是百度站方處理的態度...。

資訊隨手可得,不代表資訊是可以任意踐踏的。免費的資訊,不用付費不代表就不需要尊重,也許對岸還有很多使用者沒建立起這樣的觀念,但是百度站方的處理方式也令我跌破眼鏡,有這樣的站方難怪會縱容這樣的使用者... :@

身為渺小不起眼 BLOG 主人,我也只能用消極的抗議,來表示我的不滿。除了寫這篇文章以外,也順帶來個 ASP.NET HttpModule 教學...。針對這次事件,我特地在本站加上了這個 HttpModule,只要查出使用者是透過任何由百度提供的 LINK 而連到本站的話,都會顯示這頁抗議的畫面,如下:

image

顯示了 60 秒抗議畫面後,就會自動進如原本要連結的頁面。在透過正規的管道而得不到妥善的處置,我也只能用消極的抗意來表達我的不滿。請看到的人留個 MESSAGE 支持一下吧,或是有推推王帳號的人也幫忙推一下,一起對不重視智慧財產權的百度表答不滿 & 抗議!

 

抗議之餘,本站再怎樣也是討論進階 .NET 技術的網站,就拿這次的案例,看看這樣的 HttpModule 該怎麼處理! 未來如果你也不幸碰到這樣的事件 (最好不要碰到),可以拿出來用一用! 要替網站加上這樣的功能很簡單,只要在 Web.config 把你寫的 HttpModule 掛上就好。一旦掛上,所有針對這個網站的 Http Request 都會經過你的 HttpModule 處理,任何一個 LINK 都跑不掉!

 

ASP.NET HttpModule開發範例: 把所有來自百度的使用者,引導到抗議的畫面![copy code]
public class SiteBlockerHttpModule : IHttpModule{    public void Init(HttpApplication context)    {        context.AuthenticateRequest += new EventHandler(context_AuthenticateRequest);    }    void context_AuthenticateRequest(object sender, EventArgs e)    {        HttpApplication application = sender as HttpApplication;        string referer = application.Context.Request.ServerVariables["HTTP_REFERER"];        if (string.IsNullOrEmpty(referer) == false)        {            Uri refererURL = new Uri(referer);            if (refererURL.Host.ToUpperInvariant().Contains("BAIDU.COM") == true)            {                application.Context.Server.Transfer("~/Blogs/ShowBlockedMessage.aspx");            }        }    }}
   1:  public class SiteBlockerHttpModule : IHttpModule
   2:  {
   3:      public void Init(HttpApplication context)
   4:      {
   5:          context.AuthenticateRequest += new EventHandler(context_AuthenticateRequest);
   6:      }
   7:   
   8:      void context_AuthenticateRequest(object sender, EventArgs e)
   9:      {
  10:          HttpApplication application = sender as HttpApplication;
  11:          string referer = application.Context.Request.ServerVariables["HTTP_REFERER"];
  12:   
  13:          if (string.IsNullOrEmpty(referer) == false)
  14:          {
  15:              Uri refererURL = new Uri(referer);
  16:              if (refererURL.Host.ToUpperInvariant().Contains("BAIDU.COM") == true)
  17:              {
  18:                  application.Context.Server.Transfer("~/Blogs/ShowBlockedMessage.aspx");
  19:              }
  20:          }
  21:      }
  22:  }

 

 

 

 

--

後記: 針對這次事件的記錄:

  1. 2008‎年‎6‎月‎22‎日, ‏‎下午 11:59:16,第一次張貼抗議的回應 
  2. 2008‎年‎6‎月‎23‎日, ‏‎上午 11:44:50,第二次張貼抗議的回應 
  3. 2008‎年‎6‎月‎23‎日, ‏‎下午 04:53:44,第三次張貼抗議的回應 
  4. ‎2008‎年‎6‎月‎23‎日, ‏‎下午 11:32:05,第四次張貼抗議的回應 
  5. ‎2008‎年‎6‎月‎25‎日, ‏‎下午 08:08:14,第五次張貼抗議的回應 
  6. 2008‎年‎6‎月‎26‎日, ‏‎下午 07:26:36,第六次張貼抗議的回應 
  7. ‎2008‎年‎6‎月‎28‎日, ‏‎上午 12:58:54,百度站方的回應
     


6/22/2008 10:58:19 PM

又被盜文了... :@

Microsoft.NET | 543 | 不爽 | 我的作品 | 技術隨筆

該說人紅嘛? 看起來也不是,就是正好我貼的文章又被盜用了。除了上次 [這篇文章] 被盜貼到 BLOGGER 上之外,這次又發現另一篇被盜貼了。這次被盜貼的是我之前發表一篇 [原來 System.Net.Mail 也會有 Bug ] 的文章,說明我碰到 Microsoft .NET Framework 的 BUG 及我挖掘問題真相的技術文章...。

 

 

image

這次無意間用 GOOGLE 找相關文章找到的,兩篇都是在對岸的網站,一個是照文全貼,唯獨 "忘" 了註明出處。至少他還很忠實原味,範例程式中出現吳小皮吳小妹,還有他們在 chicken-house.net 的 EMAIL 都沒有改掉... 只是把它去頭去尾,翻成簡體中文就貼了上去..

 

 

 

image

另一篇不是貼在他自己的 BLOG,而是貼在 "百度知道" 上面賺點數... 什麼是 "百度知道" ? 就是有點像台灣的奇魔知識+,在上面回答解決問題,賺分數用的。有人碰到了同一個 BUG 解不出來,對岸也有同胞很熱心的找到我的文章可以解決他的問題,就貼了上去... 一樣不小心 "忘" 了註明出處...。這位對岸同胞比較好一點,除了翻成簡體中文之外,其它就都照貼,沒有幫我去頭去尾...。

 

其實寫 BLOG 就是要分享用的,也不要求說要啥版稅或費用的。轉貼文章很歡迎,不過就是要求個 "尊重" 而以。同一篇文章也有幫到一位對岸同胞,他有在我 BLOG 留回應,其實這樣很好啊,幫到他我自己也很有成就感。不過這樣不註明出處的轉貼,我分享的動力完全被破壞掉了,只是簡單的尊重這麼難嘛?

 

這兩個地方我都留了 comment,請該篇文章的主人註明出處,也不曉得有沒有用。我把他們的網站都抓圖下來了,想看的請自己到圖中挖網址,我就不想貼在文章內了。不想因為我貼了這篇又增加他們網站的點擊率,我也不想要有我這邊 "引用" 他們文章的記錄,算是我無言的抗議吧。

 

沒事,發發牢騷而以。希望以後不要再有這種狀況發生了...。



1/14/2008 2:59:00 AM

遲來的正義

543 | 不爽

看來 Google 沒幾個看的懂中文的員工... 不過我的破英文倒是看的懂, 真是不簡單... [Y]

 

話說前陣子我的文章被盜連, 最初只是點了 Blogger 上面的回報不恰當內容的標幟, 嗯, 不鳥我...

後來在 Google 網站找了半天, 才找到回報 Google 所有不當內容的網頁, 看它訊息都寫中文的, 我就不客氣的用中文回報了... 等了一兩個禮拜果然沒鳥我...

上禮拜就用我的破英文再回報一次, 這次只貼了兩三句鼈腳英文, 簡單說明文章是我寫的, 他盜用我文章 blah blah... 耶! 果然有效... 現在再點那篇文章就變這樣了:

image

看來 Google 還是有在做事, 哈哈... 特別在此感謝一下..



12/21/2007 2:56:00 AM

可惡, 竟然偷貼我的文章... :@

543 | 不爽

小熊子告訴我我才發現, 竟然有其它Blog轉貼我的文章, 還在上面擺廣告... [:@] 回報 Blogger 也不知道有沒有用, 嘖嘖...

看來這網站也不是人工轉貼的, 八成 search blog 後用 RSS 自動全貼過去, 看它的內容有上千篇, 都是 canon / nikon 相機的內容... 算了, 我還介紹它幹嘛? 應該想辦法快讓它下架才對...

貼它的網址可能會幫它打廣告, 不過想一想不貼也只是讓它活更久而以... 網址就不打馬賽克了, 大家幫我點上面的 [標幟BLOG] 吧, 讓它早日下架... [:@]

http://canon-vs-nikon.blogspot.com/2007/11/canon-raw-codec-12-net-framework-30-wpf.html

image






精選文章

RUN! PC 文章及範例下載
2010/07. 結合檔案及資料庫的交易處理
2010/05. TxF讓檔案系統也能達到交易控制
2010/04. 生產者 vs 消費者 - 執行緒的供需問題
2008/11. 生產線模式的多執行緒應用
2008/09. 用ThreadPool發揮CPU運算能力
2008/06. SEMAPHORE在ASP.NET的應用
2008/04. 以ASP.NET開發同步WEB應用程式

如何學好 "寫程式" 系列
#1. 該如何學好 "寫程式" ??
#2. 為什麼 programmer 該學資料結構 ??
#3. 進階應用 - 資料結構 + 問題分析
#4. 你的程式夠 "可靠" 嗎?

#5. 善用 TRACE / ASSERT

安德魯是誰?

Andrew Wu | Create Your Badge

我喜歡鑽研物件導向、軟體工程及作業系統等相關技術。我會在這裡發表我的研究心得,也當作我自己的學習筆記。


Recent comments

Comment RSS