mysql - 无法使用 ODBC 从 Mysql 正确读取表情符号
问题描述
我在 Stack 和其他论坛上阅读了许多主题,但仍然不知道如何使其工作。
配置
- 我有一个名为test的MySQL 8.0数据库,并使用默认CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_ci 对其进行了配置。
- 里面有一个创造性地命名为 table 的表,它也被配置为utf8mb4和utf8mb4_0900_as_ci。
- 唯一的字段名为field并且是 blob 类型,我在其中使用AES_ENCRYPT/DECRYPT写入和读取编码数据
- VBScript classic使用最后一个ODBC 8 UNICODE驱动程序连接到它
- 我尝试了SET NAMES语句,但此 ODBC 版本不支持。相反,字符集直接包含在连接字符串中。
在其他线程之后,我制作了一个测试文件
- 没有任何外部包含
- 保存为 UTF8
- 在文件开头指定了所有可能的 Vbscript Codepage和Charset
- 连接字符串指定了一个字符集,我已经尝试过ucs2和utf8mb4
- 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 查询,会显示带有表情符号的正确文本,因此这不是与代码页或字符集直接相关的问题,也不是在写入数据时出现的问题,而只是在读取数据时出现的问题。
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>
解决方案
推荐阅读
- java - 如何使用 java 中的 org.json 包获取 json 对象内部的数组?
- jupyter-notebook - PyDrake SNOPT 打印日志
- javascript - 如何在 javascript 中创建一个随机化器,它将重定向到一个随机网页?
- reactjs - ReactJS 根据子组件更改按钮的可见性
- html - 如何将常用的html标签正确转换为纯文本格式?
- java - 从对象的arrayList中删除重复的行,但在不同的列中有重复的行项
- javascript - 从成员函数对对象所做的更改不会持续存在。范围/参考问题?
- javascript - 错误连接 ECONNREFUSED websocket
- javascript - $location 更改路径但不拾取 .html
- python - 使用默认值代替 argparse 中的用户输入