夜雨聆风学习资料网

ARTICLE · 1126927

Excel联网版VBA系统:Excel VBA → MySQL ODBC → 字符集报错问题

Excel联网版VBA系统:Excel VBA → MySQL ODBC → 字符集报错问题
。

导读

VBA 连接 MySQL 报字符集错,根因是客户端与库两端 utf8mb4/utf8mb3 不一致。改 ODBC 为 Unicode 驱动、连接串加 CHARSET=utf8mb4、参数改用 adVarWChar 即可解决。

当选中某条记录的时候报如上错误: MySQL 数据库字符集不匹配。一般指尝试存入的数据格式与数据库里某处(可能是字段定义)规定的格式不一致,因此无法转换.

首先排除数据库的字符集,确实与数据库本身的字符集不一致

图一

图二

修改每个表的字符集, 使之与数据库保持一致.

问题依旧在, 不过保持一致还是有必要的, 也算是发现了一个潜在问题, 继续排查...

开启调试模式, 定位出错代码行发现停留在下图处:

目视分析, 构建sql语句没有什么特殊的逻辑, 应该可以排除.

于是定位到了构建对象上, 因为为了安全起见, 使用了参数化构建的方式, 其中有个参数adVarChar对应的是 ANSI 字符串(单字节/多字节),而数据库是 utf8mb4。

当参数值包含 4 字节字符(Emoji、生僻字、某些特殊符号)时:CStr(pData(1)) 把值转成 VBA 字符串(内部是 Unicode), ADO 按 adVarChar(ANSI)把参数传给 ODBC 驱动要把它从 Unicode 转成 ANSI,但 4 字节字符在 ANSI 里没有对应表示, 于是报:

Conversion fromcollation utf8mb4_0900_ai_ci into utf8mb3_general_ci impossible forparameter

找到问题原因后进行如下修改并测试, 问题解决

把 adVarChar 换成 adVarWChar(宽字符/Unicode)

对于Excel VBA → MySQL ODBC → 字符集报错这类问题属字符集问题, 往往 隐藏比较深, 这类问题一般不是代码写错,而是"两端约定不一致"。
对于本文场景(ODBC + MySQL), 重点应注意以下问题:
配置项正确值说明
驱动MySQL ODBC 8.0 **Unicode** Driver别用 ANSI 版
连接串加 CHARSET=utf8mb4显式声明客户端字符集
参数类型adVarWChar不要用 adVarChar
#VBA匠人 #vba编程 #左手Excel右手Vba
猜您喜欢
往期精选▼

VBA工具合集,复杂工作一键搞定

Excel VBA伙同Mysql把专业仓储系统逼到墙角

Excel + MySQL 混搭,竟搭出钢轨探伤"黑科技"

花50万买的科研平台,不如我Excel+MySQL 

MySQL+Excel+VBA让我卸载了所有金融终端

小团队根本不用买系统,Excel VBA反而更管用

我用Excel VBA,手搓了一套中英泰三语种ERP

别笑我用Excel记账,你的财务软件未必比我快

Excel VBA+ MySQL炼成的薪资管理神器

Excel VBA搭上MySQL,跑出一套生产管理ERP

这个绿油油的Excel界面,让老板放弃进销存软件

识别二维码

关注视频号

VBA匠人

长按

关注

立即添加星标

每天学好教程

相关学习资料