重复线程注释

我已经针对这个问题问过一个类似的问题(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上运行。这两个系统上都存在此问题。

问题

问题是,当我使用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的数据的屏幕截图:

mysql - Windows ODBC驱动程序-检索的表情符号数据呈现为?-LMLPHP

测试网页

这是我的测试网页:



<!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 - Windows ODBC驱动程序-检索的表情符号数据呈现为?-LMLPHP

我知道表情符号数据在页面上看起来很好,因为从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连接并在启用了正确字符集的情况下设置Connection属性,并在支持使用该字符集的旧版ODBC驱动程序上设置了Initial Statement。

我现在没主意了!

使用ODBC驱动程序可能会很大吗?

最佳答案

据我所知,使用ADODB和MySQL Connector / ODBC检索Unicode补充字符(例如,表情符号)的唯一方法是将它们检索为字节(SELECT CAST(column_name AS BINARY)),然后对其进行解码。下面的示例实际上是VBA,但是对其进行微调以实现VBScript是微不足道的。

Option Explicit

Sub demo_retrieve_utf8mb4_value()
    Dim conn As New ADODB.Connection
    conn.Open _
        "DRIVER=MySQL ODBC 8.0 Unicode Driver;" & _
        "SERVER=localhost;PORT=3307;" & _
        "UID=root;PWD=(whatever);" & _
        "DATABASE=mydb;" & _
        "charset=utf8mb4;"
    Dim rst As New ADODB.Recordset
    rst.Open "SELECT CAST(emoji AS BINARY) FROM emoji_tbl WHERE id=1", conn
    Dim s As Variant
    s = decode_utf8(rst.Fields(0).Value)
    '
    ' do stuff with the string value

End Sub

Private Function decode_utf8(field_value As Variant) As Variant
    If IsNull(field_value) Then
        decode_utf8 = Null
    Else
        Dim strm As New ADODB.Stream
        With strm
            .Type = adTypeBinary
            .Open
            .Write field_value
            .Flush
            .Position = 0
            .Type = adTypeText
            .Charset = "UTF-8"
            decode_utf8 = .ReadText
            .Close
        End With
        Set strm = Nothing
    End If
End Function

关于mysql - Windows ODBC驱动程序-检索的表情符号数据呈现为?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59010774/

10-13 08:26