重复的线程注释
我已经对此问题(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 Server的服务器,都使用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的数据的屏幕截图:
测试网页
这是我的测试网页:
<!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连接器有关,但是我已经尝试了所有可以想到的方法,但是没有任何效果。
我尝试了以下驱动程序:
我尝试使用连接字符串和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驱动程序可能会很大吗?
答案 0 :(得分:0)
据我所知,使用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