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

图一 





对于Excel VBA → MySQL ODBC → 字符集报错这类问题属字符集问题, 往往 隐藏比较深, 这类问题一般不是代码写错,而是"两端约定不一致"。 对于本文场景(ODBC + MySQL), 重点应注意以下问题:
#VBA匠人 #vba编程 #左手Excel右手Vba 猜您喜欢 往期精选▼ 

导读
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)


| 配置项 | 正确值 | 说明 |
|---|---|---|
| 驱动 | MySQL ODBC 8.0 **Unicode** Driver | 别用 ANSI 版 |
| 连接串 | 加 CHARSET=utf8mb4 | 显式声明客户端字符集 |
| 参数类型 | adVarWChar | 不要用 adVarChar |



识别二维码
关注视频号
VBA匠人




长按
关注
立即添加星标

每天学好教程