MySQL Workbench 的 Bugs

MySQL Workbench 作為 Diagram design tool 算是還不錯用的,與 Microsoft Visio 2007 for SQL Server 相比之下,個人覺得 MySQL Workbench (以下簡稱WB) 用起來比較順手、介面還OK、而且免費,但是 WB 目前仍有許多會絆倒人的 bug 存在。

本文是作為彙整紀錄這些會絆倒在下的 bug,以追蹤改進情況。

MySQL Workbench 5.2.29 仍有的 bug:
Bug #52004 View formatting problem
Bug #58238 index constantly recreated during sync

PS:
我在 MySQL 進行 diagram design 時是用 MySQL Workbench;在 Microsoft SQL Server 時則拿 SQL Server Management Studio Express 2008 來玩;但如果要 render 給其他人看的話,還是得用 Microsoft Visio 來製作會比較好看。

Bug #58238 index constantly recreated during sync
分類: 射茶包 | 標籤: | 在〈MySQL Workbench 的 Bugs〉中留言功能已關閉

WB : Synchronize Model issue

之前當進行 Databses/Synchronize Model 的時候老是發生明明 EER, live DB 兩邊一樣的 schema 卻產生需要異動的 script,今天,終於發現問題所在了!ヽ(`△´)/

MySQL Workbench 在進行兩邊比對的時候是採取 case sensitive
模式,在 live DB 是 unix like OS 的情形下這應該是不會出問題的,但是!當 live DB 是 Windows 的時候就慘了,例如:Diagram 有一個 view 叫做 vw_ProductListWithThumbnail,Forward Engineer 到了 live DB on Windows 之後就會變成 vw_productlistwiththumbnail,這樣一比對之後結果當然不一樣了... =_=

Reference:
http://dev.mysql.com/doc/refman/5.1/en/identifier-case-sensitivity.html

針對這個問題 Google 一下相關的文章發現以下文章提到許多 MySQL 運作在 Windows 平台上的問題:
Does MySQL care about Windows users?

所以,就算在 my.ini 裡設定 lower_case_table_names = 2,當使用者 CREATE 的是 view 的時候,CREATE 'ViEw' 結果還是會變成 'view';當使用 mysqldump 作 backup 的時候更慘,所有 table name, view name 一樣全部變成小寫,而且這個問題在 bugs 裡放了三年有了! (ノ ゜Д゜)ノ == ┻━┻

若是在 Windows 平台上強制將 lower_case_table_names = 0,可能會收到以下警告:

[Warning] You have forced lower_case_table_names to 0 through a command-line option, even though your file system '/mysql/data/' is case insensitive. This means that you can corrupt a MyISAM table by accessing it with different cases. You should consider changing lower_case_table_names to 1 or 2

所以當開發者會在不同平台上使用 MySQL 的狀況下,這會是個很嚴重的問題,不得不注意。

補記:
[2010/11/14]
以 Server version: 5.1.47-community MySQL Community Server (GPL) on Windows XP 的環境下測試 lower_case_table_names = 2 的影響,測試結果為:

  • 建立的 DATABASE、TABLE 的確保留了原始的大小寫,在檔案系統中也是
  • 建立的 VIEW 全部變成小寫,在檔案系統中也是
  • mysqldump 的結果,CREATE DATABASE 裡的名稱變成全部小寫,但是 USE 跟 CREATE TABLE 是正確的,CREATE VIEW 裡的名稱全部變成小寫。

結論:

  • 資料庫的名稱以全小寫建立即可
  • VIEW 就很辛苦了,不能用個 vw_GetDataFromT1andT2 之類的,得用 vw_Get_Data_From_T1_and_T2
分類: 射茶包 | 標籤: | 在〈WB : Synchronize Model issue〉中留言功能已關閉

WB Plugin : Dump column comments

之前寫的用來 Dump 欄位說明欄內容的,主要是參照 Data Dictionary Creator 的功能,在 MySQL Workbench 中實現。(當然沒像 Data Dictionary Creator 功能那樣多樣就是了)

#
#  wb_utils_dark_grt.py
#  MySQLWorkbench
#
#  Created by Dragon Chuang on 2010/09/04.
#  Creative Common License.
#

# import the wb module
from wb import *
# import the grt module
import grt

# define this Python module as a GRT module
ModuleInfo = DefineModule(name= "PyWbUtilsDark", author= "Dragon Chuang", version= "1.0")

# this is just a function used by the plugin, it's not exported
def printTableLine(fields, filler= " "):
  print "|",
  for text, size in fields:
    # DBCS在位置對齊時字數問題的修正 (WB 一個中文 len() 3, unicode 一個中文 len() 1, big5 一個中文 len() 2)
    dbcssizefix= 0
    dbcssizefix= len(text) - len(text.decode("utf-8").encode("big5"))
    #print len(text), len(text.decode("utf-8").encode("big5"))
	# 將換行取代成空白
    print text.replace("\n"," ").ljust(size + dbcssizefix, filler), "|",
  print

# @wbexport makes this function be exported by the module and also describes the return and
# argument types of the function
# @wbplugin defines the name of the plugin to "wb.catalog.util.dumpColumns", sets the caption to be
# shown in places like the menu, where to take input arguments from and also that it should be included
# in the Catalog submenu in Plugins.
@ModuleInfo.plugin("wb.catalog.util.dumpColumnComments", caption= "Dump All Table Column Comments", input= [wbinputs.currentCatalog()], pluginMenu= "Catalog")
@ModuleInfo.export(grt.INT, grt.classes.db_Catalog)

def printAllColumns(catalog):
  lines= []
  schemalen= 10
  tablelen= 10
  columnlen= 10
  typelen= 10
  commentbytes= 0
  commentlen= 10

  for schema in catalog.schemata:
    schemalen= max(schemalen, len(schema.name))
    for table in schema.tables:
      tablelen= max(tablelen, len(table.name))
      for column in table.columns:
        columnlen= max(columnlen, len(column.name))
        typelen= max(typelen, len(column.formattedType))
        #print isinstance(column.comment, unicode)
        # GRT 字串為 UTF-8 編碼,要先轉換成 Python 的 unicode,然後再轉成 big5 算長度 (bytes)
        commentbytes= len(column.comment.decode("utf-8").encode("big5"))
        commentlen= max(commentlen, commentbytes)
        lines.append((schema.name, table.name, column.name, column.formattedType, column.comment))

  printTableLine([("-", schemalen), ("-", tablelen), ("-", columnlen), ("-", typelen), ("-", commentlen)], "-")
  printTableLine([("Schema", schemalen), ("Table", tablelen), ("Column", columnlen), ("Type", typelen), ("Comment", commentlen)])
  printTableLine([("-", schemalen), ("-", tablelen), ("-", columnlen), ("-", typelen), ("-", commentlen)], "-")

  for s,t,c,dt,dc in lines:
    printTableLine([(s, schemalen), (t, tablelen), (c, columnlen), (dt, typelen), (dc, commentlen)])

  printTableLine([("-", schemalen), ("-", tablelen), ("-", columnlen), ("-", typelen), ("-", commentlen)], "-")
  print len(lines), "columns printed"

  return 0
分類: 軟體開發 | 標籤: | 在〈WB Plugin : Dump column comments〉中留言功能已關閉

研究專家發現 Android WebKit 瀏覽器的漏洞

Android 手機開始面對系統漏洞的時刻已經來臨了:「研究專家發現Android WebKit瀏覽器的漏洞」,面對手機商對於上市後產品的消極的更新政策,使用者目前只能自求多福。Microsoft 作業系統每個月有一次固定的安全性更新,而買來的手機,看到廠商對於前一款型號的更新策略(V1.5 沒得升),現在開始擔心現在手上的產品是不是會淪落到系統到處都是漏洞,要補洞得買新手機的窘境?

分類: 資訊技術相關雜記 | 標籤: | 在〈研究專家發現 Android WebKit 瀏覽器的漏洞〉中留言功能已關閉

Blog 再開

從 1995 年左右開始架設個人網頁開始至今,個人網頁也開開關關了好幾次,現在,又再開了。

其實,本來就沒有寫作的習慣,更別說分享些什麼,但愈來愈理解,人類的大腦實在不可靠,與其 refresh memory 以記住某些事情,倒不如靠外部儲存裝置 (參閱攻殻機動隊)來輔助,而且,有些事物透過分享才能使其更為完善、進步。

上一次也是用 WordPress 作為 Blog 的系統,當時,WP 也才發布沒多久所以功能上也比較單純,現在再次安裝 3.0.1 版,整個感覺就不同了,已經到了一個水準了,而且安裝完畢預設的 Theme 也恰好符合我要的感覺,那,就這樣再次開始吧。

分類: 雜記 | 在〈Blog 再開〉中留言功能已關閉