无法使用 ODBC 从 Mysql 中正确读取表情符号

问题描述

我在 Stack 和其他论坛上阅读了许多主题,但仍然不知道如何让它发挥作用。

配置

  • 我有一个名为 testMysqL 8.0 数据库,并使用认的 CHaraCTER SET utf8mb4 COLLATE utf8mb4_0900_as_ci 对其进行配置。
  • 里面有一个创造性地命名为table的表,它也被配置为utf8mb4utf8mb4_0900_as_ci
  • 唯一的字段名为 field 并且是 blob 类型,我使用 AES_ENCRYPT/DECRYPT 写入和读取编码数据
  • VBScript classic 使用最后一个 ODBC 8 UNICODE 驱动程序连接到它
  • 我已经尝试了 SET NAMES 语句,但在此 ODBC 版本中不受支持。相反,charset 直接包含在连接字符串中。

按照其他线程,我做了一个测试文件

  • 没有任何外部包含
  • 另存为 UTF8
  • 文件开头指定了所有可能的 Vbscript CodepageCharset
  • 连接字符串指定了一个字符集,我尝试了 ucs2utf8mb4
  • html 段在内容类型和表单中指定了 utf 字符集
  • 数据库读取时,我指定CONVERT USING utf8mb4

页面被设置为最简单的测试,顶部有一个表单,结果列在下面。

所有简单文本都被正确处理,而任何表情符号都被读作?

For example,if this is the text passed through the form -> hello ? ? ? ? ? ? ?
this is what is returned -> hello ? ? ? ? ? ? ?

Workbench 8 中执行相同的 SELECT 查询显示带有 emoji 的正确文本,因此这不是与 Codepage 或 Charset 直接相关的问题,也不是写入数据时的问题,但仅在它读了它们。
VarType 将 RS("Field") 报告为一个简单的字符串 / 8.

我花了最后几天研究和测试所有可能的解决方案,但无法解决它:/

<%@Language="VBScript" CodePage="65001"%>
<% Option Explicit %>
<%
' THE PAGE ENCODING
Response.ContentType = "text/html;charset=UTF-8"
Session.CodePage = 65001
Response.CodePage = 65001
Response.CharSet = "UTF-8"

'----------------------------------------------------------------

dim dbConn,sql,RS

' SIMPLE CONNECTION STRING
' NOTE THAT I'VE TRIED BOTH charset=ucs2 AND charset=utf8mb4
Set dbConn = Server.CreateObject ("ADODB.Connection")
dbConn.Open "DRIVER={MysqL ODBC 8.0 UNICODE Driver}; SERVER=127.0.0.1; PORT=3306; DATABASE=test; Uid=user; Pwd=password; charset=ucs2;"

'----------------------------------------------------------------

%>
<!DOCTYPE html>
<html>
  <head>
    <Meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>test MysqL UTF-8</title>
  </head>
  <body>
  <form action="?action=insert" method="post" accept-charset="utf-8">
    <textarea name="text"></textarea>
    <input type="submit" value="Insert">
  </form>
<%

'----------------------------------------------------------------

' INSERT THE STRING WHEN THE FORM IS SUBMITTED
If Request.Querystring("action") = "insert" Then

    sql = "INSERT INTO table (Field) VALUES(AES_ENCRYPT('" & Request.Form("text") & "','AES_Key'))"
    Response.Write(sql & "</br>")
    dbConn.execute(sql)

End If

'----------------------------------------------------------------

' LIST ALL THE RECORDS FROM THE TABLE
sql = "SELECT CONVERT(AES_DECRYPT(Field,'AES_Key') USING utf8mb4) AS Field FROM table"
Set RS = dbconn.execute(sql)

Do Until RS.EOF

    Response.Write(RS("Field") & "</br>")
    RS.MoveNext

Loop
RS.close

dbConn.close

%>
  </body>
</html>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)