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;你需要确保:
- 表的默认字符集是
utf8或更推荐的utf8mb4(支持完整Unicode,MySQL 5.7+优先选这个) 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注入。
总结
按这个顺序操作:
- 把数据库表/字段改成utf8mb4(或utf8)字符集
- 在ODBC连接字符串里添加
CHARSET=utf8 - 替换SQL拼接为参数化查询
这样就能解决瑞典字符插入数据库的报错问题了。
内容的提问来源于stack exchange,提问作者Claes Gustavsson

