MySQL for Windows + .Net

本來啦,我是不想用 MySQL ,去年還 7 月還當面向某個xx技術組組長直接面報,在 9 月以電子郵件專門說明,在政府招標的計畫中,若是直接使用 MySQL 的話,會有授權問題,這樣的情況符合 MySQL 官方網站定義商用授權的第二種情況,故應取得商用授權:
  1. Selling software that includes MySQL to customers who install the software on their own machines.
  2. Selling software that requires customers to install MySQL themselves on their own machines.
  3. Building a hardware system that includes MySQL and selling that hardware system to customers for installation at their own locations.
若要免費使用 MySQL ,依據官方網站的說明:

Under the Open Source License, you must release the complete source code for the application that is built on MySQL. You do not need to release the source code for components that are generally installed on the operating system on which your application runs, such as system header files or libraries.

亦即政府網站若使用到 MySQL 的應用程式須釋放完整原始碼才可免費使用 MySQL ,我所開發專案或其他網站,目前似乎沒有釋放相關應用程式原始碼,而且釋放原始碼可能導致廠商或學校單位開發存取時,若有少許漏洞,反而導致資料外洩或系統遭受攻擊,又目前開發之資料販售系統,似乎明顯違反免費授權的基礎,故委辦單位宜取得商用授權。

商用授權每套每年在每台 Server 起跳為 595 美金:
https://shop.mysql.com/product.php?c=1&rz=1
由於 MySQL 國內無正式代理商,學校單位及政府採購可能無法網路下單,可能有採購困難,或者需要開國際標,此外其所販售的授權需每年購買,建議非必要時,MySQL 的應用系統開發可能要多加琢磨。

不管怎樣,今年已經強制採用 MySQL ,說實在的,MySQL 並不是最好的選擇,而且是 Server 型的資料庫,有些小需求只需要檔案型的,例如說 Access ,資料庫並非只有唯一選擇,強制採用 MySQL 實在是不當的策略,甚至產生指廠的問題,既然是公開招標的案子,廠商依據標單或進度報告規劃採用對應的資料庫,經主席核可後,應無必要堅持轉換成 MySQL 。既然要求下來了,也只好去做。
原先我採用的是 Access / SQL Server ,這兩種資料庫都支援 Unicode ,可處理簡繁體及罕用字,別的不說,光是游錫堃的堃字,能不能處理就差很多。早期 MySQL 4.0 以前版本,怕碰上 字元,常會碰到的關鍵字都成為專有名詞:「許功蓋」,可由 google 搜尋到千篇以上的討論:
http://www.google.com.tw/search?hl=zh-TW&q=MySQL+%E8%A8%B1%E5%8A%9F%E8%93%8B&meta=lr%3Dlang_zh-TW
直到 MySQL 4.1 以後才以 utf8 方式解決這個問題。但是這個問題並非是澈底解決,雖然在 4.1 以後的版本裡面有 ucs2 (Unicode) 編碼,但是在線上手冊明確表示,不能使用 ucs2 作為 client 端:
Note: Currently, UCS-2 cannot be used as a client character set, which means that SET NAMES ‘ucs2’ does not work.
此外,真正允許用 utf8 編碼連線的只有 Linux 及 jdbc for Windows ,而在 Windows 最直接的 MyODBC 3.51.13 Driver 卻不支援,只能用 ANSI 來傳輸,變成罕用字還是不能處理,此問題在官方網站已經被使用者回報為 bug 超過一年以上,仍然未解決,成為懸案。以 utf8 為關鍵字,可以找到一堆未 Close 的 bug :
在官方網站的論壇,也可以找得到很多相關討論:
網路上能找到少有號稱能支援簡繁共用的,除了透過 jdbc 外,凡是透過 ODBC 跟 .Net Connector 的,都語焉不詳,沒有明確的說明。
為了解這個問題,分別跟小朱、好手等 MVP 交流,似乎仍無明確解決方案。故目前只好暫時放棄罕用字,以繁中 (big5) 為限。
再繼續下去,先討論 ucs2 及 utf8 兩種編碼,基本上 utf8 是西方國家愛用的選項,因為平時不太用得到遠東文字,所以維持英數 1 byte,而遠東文字經過 utf8 編碼後,會由原先 2 bytes 放大到 3 ~ 4 bytes ,純粹以中文為主的資料庫,應該採用 ucs2 ,而非 utf8 ,ucs2 即是 Unicode ,所以全球所有的文字都採用 2bytes ,當然,英數也是 2 bytes 。採用 ucs2 也有利於 VarChar(nn) 的設定,若是採用 utf8 ,以姓名欄位來說,假定含複姓下可能有四個字,4×4 = 16 ,則應保留 16 bytes 來儲存姓名,在計算字串所需位元組上,十分的不便,用 ucs2 則固定 2 bytes 的量計算。
原先想將 MySQL 安裝成預設 ucs2 的資料庫,無奈,不管怎樣安裝,若是預設為 ucs2 ,就會發生無法連線,再檢視官方網站的論壇與錯誤回報,可以推定 ucs2 目前還有 bug ,並無法作為預設字碼頁,只好退而求其次,資料庫安裝為 utf8 ,資料表則設定為 ucs2 。
假定將 Access 資料庫匯入 MySQL ,以附圖來說明操作步驟,先使用工具軟體:
MySQL Migration Toolkit
圖片跳過只需要按下 Next 鍵的頁面,順序請參閱檔名。特別注意在 Object Mapping 這邊改成 ucs2 ,當然也可以先用 utf8 ,事後再轉,不過先前經驗發現,有些表格會無法轉換,所以最好在匯入時轉換,匯入時轉換也可以直接使用中文欄名,不受影響。
完成後就可以使用工具軟體:
MySQL Query Browser
觀看匯入的資料。如附圖。
在透過 MyODBC 3.51 連線時,由於 ucs2/utf8 皆無法作用,所以請在連線參數加上 stmt=SET NAMES ‘big5’ (在 VB6/ASP/.NET 下,單引號可省略) ,則可正常連線,即使在 SQL 語法內出現中文欄名都不受影響,在這邊用 VS.NET 2005 伺服器總管為範例。伺服器總管以先建立一個 DSN 比較方便,設定好後直接滑鼠右鍵,顯示資料表即可編修資料,如附圖。
當然,可以建立連線對應到 mysql 及 information_schema ,這樣就可以直接插入新使用者帳號、密碼,設定權限了。
這邊有個奇怪的小問題,有時用 VS.NET 看,欄名順序會由小到大重排 (Select * Form table) ,但是直接用 .Net Odbc.Data 來連接又正常,這邊可能還要再查原因。網頁顯示如附圖。
補充:
由於 MySQL 可以 client / Server / Table 分別採用不同的編碼,所以我懷疑先前網路上看到的可以在 VB6/VBA/ASP/VBScript/.NET 中,討論到可以簡繁並用的狀況可能是下列兩種,這兩種狀況都會導致 MySQL Query Browser 無法正確瀏覽,但 client 端程式可以正常顯示:
1.存取資料庫前後事先編碼。我有看過這種範例,比如說 .NET 用 Text.Encoding.utf8 再讀出、存入都編碼,個人以為這不是正道,有點類似要將密碼寫入資料庫前後,以自定編解碼處理。
2.連線端用跟 Server 端都用 utf8 ,也就是連線端不指定 SET NAMES ‘big5’ ,這樣 client 端的 MyODBC 送出去的文字會被轉成 big5 再當成英數轉 utf8 ,在 MySQL Query Browser 裡面看到的字就是 big5 當成英數顯示,也就是有規則的亂碼…
當然,1, 2 項應該可以結合出在 client 端程式經手動編碼後,當成 utf8 傳給 MySQL ,讓 MySQL Query Browser 可以瀏覽的方式,這會造成程式碼不一致,在無解決方案時,可能可以考慮這個。
而 MySQL Query Browser 無法正確瀏覽,就表示另一種情況,這個資料庫不能跟其他應用程式交換資料。 MySQL Query Browser 是用 jdbc 連的,所以表示 jdbc 連線的應用程式都會讀成亂碼,未來新增或更新的模式也必須採用 1, 2 項方式處理,資料庫的存在並非是為了單一 client 端使用而設計,而是將資料以標準公開的方式保存,使得資料保存不受應用程式開發、更新、維護改變而改變,亦即,若是目前正在測試的 MyODBC Connector/Net v5 alpha 若已改進 MyODBC 的連線方式可使用 utf8/ucs2 時,原先的應用程式只需變更連線 driver 及連線字串,即可支援日韓繁簡罕,但是 1 則涉及程式碼全面改寫,故此應變應在沒有方法的情況下,採用來作暫時解決方案,不適宜作標準方案來看待,當然,網頁程式可說是只有唯一 client 端在使用,但是考慮到未來升級、變更、重新開發下,此暫時解決方案仍不宜當作標準解決方案看待。
註:目前測試 MyODBC Connector/Net v5 alpha ,只要一牽扯到編碼就無回應
Categories: 資料庫 | 6 則迴響

文章導覽

6 thoughts on “MySQL for Windows + .Net

  1. 子璉

    長官的指教如下:

     ent: Thursday, April 27, 2006 10:16 AM 二、有關MySQL版權問題在MySQL官方網站上清楚寫明   " Our software is 100% GPL (General Public License) "請先詳讀 GPL授權的定義,不要斷章取義。            在GPL授權書上清楚的寫到 :這些要求適用於整個修改過的作品。如果能夠確定作品的一部分並非本程式的衍生產品,且可以合理地單獨考慮並將它與原作品分開的話,則當您將它作為獨立的作品發佈時,它不受此許可證和其條款的約束。但是當您將這部分與基於本程式的作品一同發佈時,則整個套件將受到本許可證條款約束,因為本許可證對於其他許可證持有人的授權擴大到整個產品,也就是套件的每個部分,不管它是誰寫的。 因此,本條款的意圖不在於剝奪您對完全由您自身完成作品的權利,而是履行權利來控制基於本程式的集體作品或衍生作品的發佈。 
    此外,將與本程式無關的作品和本程式 (或本程式的衍生作品) 一起放在貯存媒體或發佈媒體的同一卷上,並不導致將其他作品置於此許可證的約束範圍之內。  試問貴單位,你們的程式碼中有用到MySQL的程式碼,或去修改MySQL的程式碼,如果沒有,相信也沒有,未何會牽扯到什麼版權問題,什麼要 "政府網站若使用到 MySQL 的應用程式須釋放完整原始碼才可免費使用 MySQL  " ,什麼要 "取得商用授權" 呢?

     
    個人回覆如下:

    MySQL 採用兩種授權方式,在授權的選取上,應以官方網站回覆為主,授權常見問題網址為:http://www.mysql.com/company/legal/licensing/faq.html 註:此授權仍有解釋與認定上的爭議

    How do I know which license to use?
    The overall guiding business principle of MySQL’s dual licensing is one of fair exchange or "Quid pro Quo" which means "something for something."
    So if you use MySQL with GPL-licensed software (or a license that is GPL-compatible) we encourage you to use the GPL license. For all other users of MySQL, we recommend that you purchase a MySQL commercial license
    For more complete guidelines on the GPL and commercial license from MySQL, please read our licensing overview or contact a MySQL representative online.
     GPL 授權中提及使用上是否可獨立分割,牽扯主觀認定。 個人以為 MySQL 公司 在判讀上頃向認定為不可獨立分割,亦即承辦單位開發出來之若使用到對應產品時,應採用 GPL 或是商用授權。例如下面位置為下載 MyODBC Driver 3.51,是連線資料庫必需的元件:http://dev.mysql.com/downloads/connector/odbc/3.51.html 
    NOTE: By downloading the software from this page, you acknowledge that the software available from here is licensed under the GPL. We advise that you review the GPL before downloading.

    If you need commercial, non-GPL, licenses, you can order them online.
    Support, training, and certification are also available.
     
    以驅動程式而言,一般來說,除驅動程式有 bug ,而原廠又不修復的情形下,沒人會去改 Driver ,而在 MySQL 商用授權網頁特別寫到:http://www.mysql.com/company/legal/licensing/commercial-license.html

    The Commercial License is an agreement with MySQL AB for organizations that do not want to release their application source code. Commercially licensed customers get a commercially supported product with assurances from MySQL. Commercially licensed users are also free from the requirement of making their own application open source.
    When your application is not licensed under either the GPL-compatible Free Software License as defined by the Free Software Foundation or approved by OSI, and you intend to or you may distribute MySQL software, you must first obtain a commercial license to the MySQL product.
    Typical examples of MySQL distribution include:

    Selling software that includes MySQL to customers who install the software on their own machines. (例如承辦單位提供系統及MySQL軟體給政府單位安裝在政府單位的機器上)

    Selling software that requires customers to install MySQL themselves on their own machines. (例如承辦單位提供系統並要求政府單位在政府單位的機器上安裝MySQL軟體)

    Building a hardware system that includes MySQL and selling that hardware system to customers for installation at their own locations.
    Specifically:

    If you include the MySQL server with an application that is not licensed under the GPL or GPL-compatible license, you need a commercial license for the MySQL server.

    If you develop and distribute a commercial application and as part of utilizing your application, the end-user must download a copy of MySQL; for each derivative work, you (or, in some cases, your end-user) need a commercial license for the MySQL server and/or MySQL client libraries. (例如承辦單位提供開發之系統給政府單位,並要求政府單位下載並安裝MySQL軟體,需要商業授權。註一)

    If you include one or more of the MySQL drivers in your non-GPL application (so that your application can run with MySQL), you need a commercial license for the driver(s) in question. The MySQL drivers currently include an ODBC driver, a JDBC driver and the C language library.

    GPL users have no direct legal relationship with MySQL AB. The commercial license, on the other hand, is MySQL AB’s private license, and provides a direct legal relationship with MySQL AB.
    With a commercial non-GPL MySQL server license, one license is required per database server (single installed MySQL binary). There are no restrictions on the number of connections, number of CPUs, memory or disks to that one MySQL database server. The MaxDB server is licensed per CPU or named user.
     
    由註一可看出MySQL是由使用者端下載安裝,並非使用到MySQL原始碼或其他部分在系統中,僅使用到MySQL連線軟體跟MySQL伺服器,此處應屬回文指出廠商開發軟體應可視為獨立開發之部分,但MySQL原廠認為這種狀況須採用商業授權,故此應用易生爭議。 僅使用 MySQL 連線軟體及伺服器軟體時,是否可視為獨立開發而脫離 GPL 授權,為彼此認定上最重要的差異點,個人以為 MySQL 是否應採商用授權之疑慮,應以 MySQL 原廠解釋為主,除有法院判例可援引外,不宜自行解釋,而 MySQL 官方網站明顯可以看出,官方網站傾向僅使用 MySQL 連線軟體及伺服器軟體時,承辦單位開發之系統仍應遵循 GPL 授權,否則應購買商業授權。 

    喜歡

  2. Fish

    商用授權每套每年在每台 Server 起跳為 595 美金:https://shop.mysql.com/product.php?c=1&rz=1
    ———-
     
    照這樣來說
    mysql比sql server 2005貴太多了
     
    sql server2005買一次
    下一次升級大概就是5年以後了
    而且不一定要升級
     
    595 * 5 = 2975耶..
    mysql 如果用個五年的話
    一套要10萬, 我的媽呀….= =

    喜歡

  3. 子璉

    關於:
    有時用 VS.NET 看,欄名順序會由小到大重排 (Select * Form table) ,但是直接用 .Net Odbc.Data 來連接又正常
    這個測試的結果是,當欄位太多時,VSNET 伺服器總管那邊會自動的變成 Select xxx,xxx,xxx Form table ,可參考 VSNET 內的 SQL 命令視窗,所以只要重調 SQL 命令視窗內原先欄位的順序即可。

    喜歡

  4. 子璉

    關於商用授權部分,前些日子跟小朱、德瑞克討論暫定結論為:
    若是開發單位所開發的系統支援多種資料庫產品,非僅限單一資料庫產品時,則屬於非必要 MySQL 情況,且開發單位在散佈系統時,不提供 MySQL 安裝檔及資料庫檔時,則開發單位不需商用授權。
    若委辦單位自行下載,由於原先開發之系統非僅限於 MySQL 才能執行,故屬於資料庫產品競爭情況,則委辦單位亦無需取得 MySQL 商用授權。
     
    亦即,透過支援兩套以上的資料庫產品來規避需要購買商用授權的情況。
     
    這是我們覺得暫時可行的方案,若是有其他意見,歡迎指教。

    喜歡

  5. 子璉

    剛剛看了這篇:
    [保留] 【疑惑】mysql在商業上到底怎麼用?需要付費麼?別人告怎麼辦http://www.chinaunix.net/jh/17/814671.html
     
    一位自稱 MySQL 中國研發中心的行銷經理 (http://www.greatlinux.com/) 說到,只要不開放原始碼的前提下,即使是公司內部的 MySQL 系統,都必須採用商業授權,否則 MySQL 公司可以提告。
     
    不過這邊有網友提到 GPL 裡面無修改不需公開原始碼的疑問,這位行銷經理並沒有做很明確的答覆,只宣稱 MySQL 擁有 MySQL 完整原始碼版權,所以對於 GPL 的解釋權由他們定義…
     
    當然眾網友也有不同的意見,有興趣可以去看看。

    喜歡

  6. 子璉

    關於 MySQL 的使用與免費授權範圍,德瑞克整理了一篇值得參考的內容:
    MySQL 的 GPL 之討論
    http://sharedderrick.blogspot.com/2007/11/mysql-gpl.html
    建議參考一下。
    我認為對開發者比較重要的部分是:
    進一步說明上述可以免費使用 MySQL 情境:

    要免費使用 MySQL ,就需要符合 GPL 的授權。
    您是軟體設計師,在設計於資料庫連線時,採用 ODBC 連結到 MySQL,使用 ANSI SQL 來存取 MySQL ,沒有使用任何到 MySQL 的程式物件(例如:預存程序、MySQL 才有支援的函數等等),也就是您的應用程式,可以連接任何資料庫。
    在公司內部開發的應用程式,使用 MySQL 做資料庫,但沒有散發應用程式。
    相關內容是依據官方網站上的討論緒摘出來的,討論緒連結請參閱德瑞克這篇說明。

    喜歡

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s

在WordPress.com寫網誌.

%d 位部落客按了讚: