瀏覽天

13 12 月, 2017

Delphi + ZeosLib + Tnt + MySQL 使用 UTF-8 編碼


首先要確實做好 MySQL 安裝設定與檢查
檢查 MySQL Server 的設定檔 my.ini (my.cnf) 內容
確認在 [mysql] 與 [mysqld] 兩個區段內都要有 default-character-set=utf8 的設定。
如果沒有就請在兩個區段都加上後,重新啟動 MySQL Server 一次讓有變更的設定生效。

然後用 MySQL 命令列工具連線檢查系統變數的狀況,請用 show variables like ‘char%’; 命令來檢視:

MySQL-5-Character-Set-Check.png

如果得到如上方圖片中每個 character_set 除了 filesystem 為 binary 其他變數都是 utf8 的結果就可以了。

建立資料庫時需要注意必須使用 utf8 編碼。

建立資料表時也要注意必須使用 utf8 編碼。

在 MySQL 部分處理到這樣就可以了,再來進入到程式開發的部分。

開啟 Delphi 開發環境並建立一個新專案。

使用檔案總管,複製 libmysql.dll 到專案目錄下,然後回到 Delphi IDE。
(libmysql.dll 可以到 MySQL for windows 的安裝目錄下的 lib 子目錄內找到,要 32 bit 版本的)

在 Form1 上加入 TZConnection 元件並設定屬性:

Name: zConn
Protocol: 選擇 mysql-5
HostName: MySQL 資料庫伺服器的名稱
Database: 資料庫的名稱
User: 連線到 MySQL 的使用者名稱
Password: 連線到 MySQL 使用者的密碼

然後將 Connected 設為 True 進行連線
接著在 Form1 上增加 TZQuery 元件並設定屬性:

Name: zqryM
Connection: zConn
SQL: select * from product

接著在 Form1 上增加 TDataSource 元件並設定屬性:

Name: dsM
DataSet: zqryM

接著在 Form1 上增加 TTntDbGrid 元件並設定屬性:

DataSource: dsM

然後增加程式碼,使程式啟動後就開啟 ZQuery

procedure TForm1.FormCreate(Sender: TObject);
begin
zqryM.Open;
end;

複製代碼
結果文字欄位的內容卻是看到問號

zeos-mysql-utf8-1.png

再來檢查連線到 MySQL 的系統變數狀況,將 zqryM.SQL 改為 show variables like ‘char%’ 後執行程式:

zeos-mysql-utf8-2.png

可以看到 character_set_client 與 character_set_connection 以及 character_set_results 居然是 latin1 的狀況,當然有問題。

這個狀況有兩個解決方案,Zeos 設定參數方法與 MySQL 命令的方法。

Zeos 設定參數方法:
在 TZConnection 設定 Properties 屬性加入一行 codepage=utf8 就可以了

MySQL 命令的方法:
在網站開發環境最常用的解決方案就是執行 set names utf8 命令,所以在 OnAfterConnect 事件加入程式碼:

procedure TForm1.zConnAfterConnect(Sender: TObject);
var
qy: TZReadOnlyQuery;
begin
qy := TZReadOnlyQuery.Create(nil);
qy.Connection := zConn;
qy.SQL.Text := ‘SET NAMES UTF8’;
qy.ExecSQL;
qy.Free;
end;

複製代碼
選擇一種解決方案應用之後,再次執行程式看一下連線的系統變數狀況:

zeos-mysql-utf8-3.png

解決了連線參數的問題,再將 zqryM.SQL 改回 select * from product 後執行程式,居然這次變成顯示亂碼:

zeos-mysql-utf8-4.png

這又怎麼了?
因為此時的 TZQuery 元件內的欄位是基於 SQL 內容而動態產生的,所以是用 TStringField 元件來處理,遇上 UTF8 編碼當然就不支援了。

現在開啟 zqryM 的 Fields Editor 後 Add all fields 就會看到文字欄位都是用 TStringField 元件

type
TForm1 = class(TForm)
zConn: TZConnection;
dsM: TDataSource;
zqryM: TZQuery;
TntDBGrid2: TTntDBGrid;
zsqlmntr: TZSQLMonitor;
Panel1: TPanel;
dbnvgr: TDBNavigator;
zqryShowVar: TZQuery;
dsShowVar: TDataSource;
zqryMproduct_id: TIntegerField;
zqryMprod_num: TStringField;
zqryMprod_name: TStringField;
procedure FormCreate(Sender: TObject);
procedure zConnAfterConnect(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

複製代碼
進入 unit 檔手動將 TStringField 改成 TTntStringField 元件,然後還要同時修改 .dfm 內也就是 Form 原始碼的部分

object zqryM: TZQuery
Connection = zConn
SQL.Strings = (
‘select * from product’)
Params = <>
Left = 164
Top = 300
object zqryMproduct_id: TIntegerField
FieldName = ‘product_id’
Required = True
end
object zqryMprod_num: TStringField
FieldName = ‘prod_num’
Size = 135
end
object zqryMprod_name: TStringField
FieldName = ‘prod_name’
Size = 300
end
end

複製代碼
同樣手動將 TStringField 改成 TTntStringField 元件,然後儲存後執行程式:

zeos-mysql-utf8-5.png

經過幾番波折,終於看到正常的中文字了。

【Hit AI】鄭嘉慶:大數據就是,在對的時間做對的事!

首圖 富邦證券數位金融部資深協理鄭嘉慶,台大經濟系、台大經濟研究所畢業的他,於2015年獲富邦金控推薦到MIT美國麻省理工史隆管理學院進修,而後回國重新加入富邦。對於這個海外留學的機會,鄭嘉慶說「態度積極」是自己能獲金控重金培育的關鍵。   鄭嘉慶更以蘋果創辦人賈伯斯的「Stay hungry, stay foolish」(求知若飢,虛心若愚)態度來勉勵年輕人,他說,現在任…


Softorino YouTube Converter 如何 3 個步驟內,把 Youtube 影片轉移到 iPhone 離線觀看?(Windows、Mac)

首圖 Softorino YouTube Converter 簡化了大部份 Youtube 的影片、音樂下載流程,一般來說在 Youtube 看到喜歡的影片或音樂後,下載到手機最快的流程是,在 Youtube 網址前加上 ss ,下載後拿起 USB 連接手機,開啟 iTunes 然後摸個半天可能還不知道怎麼傳,而 Softorino YouTube Converter 只要三個步驟:複…