You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP Classic解析JSON瑞典字符åäö及MySQL插入失败问题

问题排查与解决办法

我来帮你搞定这个问题——你已经处理好了页面端的编码,能正常显示瑞典字符,但插入MySQL时报错,核心问题出在数据库/表的字符集配置和ODBC连接的编码设置上,下面一步步拆解解决:

一、先检查数据库表及字段的字符集

MySQL报错Incorrect string value: '\xE4gen'的本质是:你的数据是UTF-8编码的ä(UTF-8中ä是两个字节C3 A4),但数据库字段的字符集是latin1(latin1中ä是单字节E4),导致存储时编码不匹配。

  • 登录MySQL控制台,查看ordrar表的字符集配置:

    SHOW CREATE TABLE ordrar;
    

    你需要确保:

    1. 表的默认字符集是utf8或更推荐的utf8mb4(支持完整Unicode,MySQL 5.7+优先选这个)
    2. adress、postadress等存储特殊字符的字段,字符集也设置为utf8/utf8mb4,排序规则可以用utf8_swedish_ci适配瑞典语
  • 如果配置不对,执行SQL修改表和字段:

    -- 修改表的默认字符集为utf8mb4
    ALTER TABLE ordrar CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_swedish_ci;
    
    -- 单独调整字段(如果表修改后字段未同步)
    ALTER TABLE ordrar MODIFY COLUMN adress VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_swedish_ci;
    ALTER TABLE ordrar MODIFY COLUMN postadress VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_swedish_ci;
    

二、配置ODBC连接的UTF-8编码

页面已经是UTF-8,但ODBC驱动默认可能用latin1和数据库通信,导致数据传输时转码错误。你需要在数据库连接字符串里明确指定字符集:

打开你的koppling.asp,找到数据库连接代码,比如:

Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "DRIVER={MySQL ODBC 3.51 Driver};SERVER=你的服务器地址;DATABASE=你的库名;UID=用户名;PWD=密码;"

在连接字符串末尾加上CHARSET=utf8(如果用utf8mb4,确认ODBC 3.51驱动支持的话可以用CHARSET=utf8mb4):

conn.Open "DRIVER={MySQL ODBC 3.51 Driver};SERVER=你的服务器地址;DATABASE=你的库名;UID=用户名;PWD=密码;CHARSET=utf8;"

这一步是关键,它确保ASP和MySQL之间的数据流以UTF-8传输,避免编码冲突。

三、验证JSON解析后的编码(可选)

虽然页面显示正常,但可以快速验证aspJSON解析后的字符串是否是UTF-8:
在插入前添加这段代码,查看adress的字节编码:

Response.Write "adress的字节编码:"
For i = 1 To LenB(adress)
    Response.Write AscB(MidB(adress, i, 1)) & " "
Next

如果是UTF-8的ä,会输出203 164(对应十六进制C3 A4);如果是164(十六进制E4),说明解析后变成了latin1,这时候需要检查aspJSON的配置,确保它以UTF-8解析响应。

四、强烈建议:用参数化查询替代SQL拼接

你现在直接把变量拼接到SQL里,不仅容易出编码问题,还存在严重的SQL注入风险!改用参数化查询,既能自动处理编码,又更安全:

Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
' 编写带占位符的SQL语句
cmd.CommandText = "INSERT INTO ordrar(userId,appusers_id,paymentId,fnamn,adress,postadress) VALUES (?,?,?,?,?,?)"

' 依次添加参数(注意匹配字段类型和长度)
cmd.Parameters.Append cmd.CreateParameter("@userId", adInteger, adParamInput, , rs("userId"))
cmd.Parameters.Append cmd.CreateParameter("@appusers_id", adInteger, adParamInput, , appusersId)
cmd.Parameters.Append cmd.CreateParameter("@paymentId", adVarChar, adParamInput, 255, dibspaymentId)
cmd.Parameters.Append cmd.CreateParameter("@fnamn", adVarChar, adParamInput, 100, fnamn)
cmd.Parameters.Append cmd.CreateParameter("@adress", adVarChar, adParamInput, 255, adress)
cmd.Parameters.Append cmd.CreateParameter("@postadress", adVarChar, adParamInput, 100, postadress)
' 其他字段的参数同理添加...

' 执行插入
cmd.Execute
Set cmd = Nothing

参数化查询会自动处理字符编码,不需要手动转义,同时彻底杜绝SQL注入。

总结

按这个顺序操作:

  1. 把数据库表/字段改成utf8mb4(或utf8)字符集
  2. 在ODBC连接字符串里添加CHARSET=utf8
  3. 替换SQL拼接为参数化查询

这样就能解决瑞典字符插入数据库的报错问题了。

内容的提问来源于stack exchange,提问作者Claes Gustavsson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:03:13