【问题标题】:Windows ODBC driver - retrieved emoji data rendered as?Windows ODBC 驱动程序 - 检索到的表情符号数据呈现为?
【发布时间】:2019-11-23 18:19:41
【问题描述】:

重复线程注释

我已经针对这个问题提出了类似的问题 (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 的数据截图:

测试网页

这是我的测试网页:

<!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>

关于该问题的更多说明

问题不在于 emoji 数据无法在网页上显示,因为直接从 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 驱动程序的错误吗?

【问题讨论】:

  • 请看这个并正确编码你的mysql回复stackoverflow.com/questions/18186741/…
  • 感谢@nbk 的回复。回覆。您评论中的链接 - 这不是更多地与数据如何存储在数据库中有关吗?存储在 MySQL 中的字符串格式正确,我的问题是当它通过 ODBC 连接器从数据库中检索时,输出不正确,尽管连接字符串或 DSN 设置为使用正确的字符集utf8mb4。谢谢
  • 你应该尝试 DecodeFromUtf8,它将 utf8 从 mysql “解码”为 microft 使用的代表 unicode 的东西
  • 这能回答你的问题吗? Emoji data retrieved via ODBC Connection appears as question mark。请不要发布重复的问题,说它“相似”有点牵强。
  • 看,我为 vb 6 回答了一个类似的问题,而不是一周,它总是与语言无关,在连接字符串中使用 utf8 连接。并将 utf8 转换为 unicode,反之亦然。当这在 vb 6 中工作时,它将在 asp net asp、c# vb net .....

标签: mysql asp-classic odbc adodb


【解决方案1】:

据我所知,使用 ADODB 和 MySQL 连接器/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

【讨论】:

  • ADODB 是否存在 MySQL 提供程序限制?
  • @Lankymart - 是的。当 Unicode 字符在 BMP 中时,ADODB 和 MySQL 连接器/ODBC Unicode 驱动程序可以“很好地”一起使用,但当涉及到 emoji 等补充字符时,它们似乎无法相处。
  • 请注意,最新版本的 MySQL ODBC 8 驱动程序 (8.0.27) 现在可以正确转换此类字符(请参阅 dev.mysql.com/doc/relnotes/connector-odbc/en/news-8-0-27.html)。我已经测试过了,它可以正常工作。
【解决方案2】:

最新版本的 MySQL ODBC 连接器已修复此错误!

MySQL 连接器/ODBC 驱动程序 8.0.27 现在可以正确转换此类字符(请参阅 https://dev.mysql.com/doc/relnotes/connector-odbc/en/news-8-0-27.html)。

您需要将MySQL ODBC 8.0 Unicode Driver 指定为 ODBC 驱动程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多