重复线程注释
我已经针对这个问题提出了类似的问题(通过 ODBC 连接检索的表情符号数据显示为问号 https://stackoverflow.com/questions/58943772/emoji-data-retrieved-via-odbc-connection-appears-as-question-mark)但这更多的是关于经典 ASP 页面的设置,但我现在提出一个问题来寻求 ODBC 驱动程序的帮助,因为我认为我遇到的问题与此相关。
环境详情
我从经典 ASP 页面连接到 MySQL 版本 5.5.50-log(问题也在 5.7.28-log 和 MySQL 8 上复制)。全部运行 32 位 MySQL 服务器,使用 32 位 ODBC 驱动程序。
我在 Windows 10 PC 上运行代码,但实时站点在 Windows 2012 Server 上运行。两个系统都存在该问题。
Issue
问题是,当我使用 ODBC 驱动程序连接到 MySQL 并显示输出时,表情符号数据显示为?
而不是作为表情符号,尽管我可以看到表情符号已正确保存在数据库中。只是当通过ODBC提取并显示在页面上时,它显示为?
特点。
MySQL详细信息
MySQL数据库设置如下:
数据库字符集:utf8mb4
数据库排序规则:utf8mb4_general_ci
表和字段:
字符集:utf8mb4
排序规则:utf8mb4_general_ci
从我所看到的来看,MySQL 数据库在排序规则等方面设置正确:
Variable_name Value
------------------------ --------------------
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8mb4
character_set_filesystem binary
character_set_results utf8mb4
character_set_server latin1
character_set_system utf8
collation_connection utf8mb4_general_ci
collation_database utf8mb4_general_ci
collation_server latin1_swedish_ci
为了测试,我在表中有数据,其中包含以下字符串:????(T_T) é、è、à、ç
这是来自 SQLyog 的数据截图:
测试网页
这是我的测试网页:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Test</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
</head>
<body>
<p>Pasted directly from database field: ????(T_T) é, è, à, ç</p>
<p>Returned from SQL statement: ?(T_T) é, è, à, ç</p>
</body>
</html>
关于该问题的更多注释
问题不在于表情符号数据无法在网页上显示,因为直接从 MySQL 粘贴的内容看起来很好。
问题是,一旦数据通过 ODBC 驱动程序从 MySQL 的 SQL Select 返回,它就无法正确呈现。
关于经典 ASP 页面设置的注意事项
我在 ASP 代码的顶部设置了以下内容:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%
Response.ContentType = "text/html"
Response.AddHeader "Content-Type", "text/html;charset=UTF-8"
Response.CodePage = 65001
Response.CharSet = "UTF-8"
ASP 页面本身保存为 UTF-8 编码文件:
我知道表情符号数据在页面上显示良好,因为从 MySQL 粘贴的内容可以正确呈现。
ODBC 驱动程序注释
我认为问题与 ODBC 连接器有关,但我已经尝试了我能想到的一切,但没有任何效果。
我已经尝试过这些驱动程序:
- MySQL ODBC 3.51 驱动程序
- MySQL ODBC 5.1 驱动程序
- MySQL ODBC 5.3 Unicode 驱动程序
- MySQL ODBC 8.0 Unicode 驱动程序
- MySQL ODBC 8.0 ANSI 驱动程序
我尝试过连接字符串和 DSN 连接,但所有这些连接都会出现此问题。
连接字符串示例:
oConn.Open "DRIVER={MySQL ODBC 5.3 Unicode Driver}; port=33066; option=16387; server=localhost; database=db1083; user=cheese; password=string; option=3; charset=utf8mb4; stmt=set names 'utf8mb4';"
我尝试使用 DSN 连接并设置连接属性,并启用正确的字符集,并在支持使用该连接的旧版本 ODBC 驱动程序上设置初始语句。
我现在没有主意了!
这可能是 ODBC 驱动程序的错误吗?