使用 Zeos 批量处理SQL脚本和Zeos的中文数据问题
目的:程序启动运行时,可以在启动过程中将默认数据库创建。
方向:使用Zeos 的 TZSQLProcessor,处理批量SQL脚本,其他的组建也是有相关的类。
为了批量方便,这里定义了两种类型的的SQL,虽然都是DDL 但,后者与存储过程相关。
zDDLScript : TZSQLProcessor;
zDDLScriptSP: TZSQLProcessor;
- 关于中文和连接协议版本
项目测试用的数据库是 MariaDB,这里附带提一下,数据库的驱动还是用的mysql-5,使用MariaDB-10总提示找不到驱动,虽然明确指明驱动位置。
zCon := TZConnection.Create(nil); try with zCon do begin HostName := _DBserver; Database := _database; // Protocol := 'MariaDB-10'; Protocol := 'mysql-5'; User := _UserName; Password := _Password; ControlsCodePage := TZControlsCodePage.cCP_UTF8; ClientCodepage := 'utf8'; AutoCommit := true; end;
中文数据是乱码,需要用到 ControlsCodePage := TZControlsCodePage.cCP_UTF8;这一句是关键。
我尝试在代码中比如遇到中文用 Utf8Endoce,或 AnsiToUtf8 或Utf8toAnsi 等若干尝试均无效,当配置了ControlsCodePage 属性,Delphi下不用做任何转换中文正常,包括注释中文均正常,但翻看Lazarus的实现,还是用了UTF8ToConsole 、 UTF8ToSys 和UTF8ToWinCP做转换的。
- 数据库表格部分
用可视化工具导出构建好的SQL是很方便的事情,自带的HeidiSQL和Navicat for MariaDB 均可以很好的导出(当然还有好多其他的工具比如EMS SQL Manager,它其实是以前最喜欢用的工具)。
但HeidiSQL、Navicat 这两个产品导出的SQL还是有些不同,细节撇开,Zeos因为组件功能的限制(也许是我没用好),含存储过程的很难处理。HeidiSQL将导出的SQL按字母顺序杂糅在一起,Navicat 可以将存储过程放到一起(它是根据功能树顺序)。
这里将导出的文件分成两半一部分叫“TabNew.sql”保存表格建立, 一部分叫“ProcNew.sql” 保存存储过程相关,因为它会重新定义SQL结束符号。如下图上半部分是表格,下半部部分是存储过程。
对于非存储过程类的SQL直接zDDLScript : TZSQLProcessor,执行即可。
- 对于存储过程相关,需要特别指明
zDDLScriptSP.DelimiterType := TZDelimiterType.dtDelimiter;
zDDLScriptSP.Delimiter := ';;';
对应的存储过程文件的内容也要做处理,我用的是Notepad2-mod,直接查找替换
- ”;\r\ndelimiter ;;” 替换成 ”\r\n;;”
- ”delimiter ;\r\n” 替换成 ””
- 一定要确保 Delimiter 定义的字符串在一行!否则TZSQLProcessor不能正常处理!
至此功能完成。
如果有更好的方法,请各位指正。
- 后记:
这里Navicat能很好做到导出结束符号“;;”在单独一行,HeidiSQL的结束符号是 “//” 就在语句的最末尾,需要再次利用文本工具替换,增加了复杂度,而且可以看到表格和存储过程在一起如下图。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库