MySQL 查询返回非 UTF8 字符

Posted

技术标签:

【中文标题】MySQL 查询返回非 UTF8 字符【英文标题】:MySQL query returning non UTF8 characters 【发布时间】:2013-05-20 00:00:32 【问题描述】:

我有一个登录屏幕,可以根据 mysql 数据库检查输入的用户名和密码。 我的问题是它不能识别像“ÅÄÖ”这样的瑞典字符。

例如,密码“lösenord”在数据库中但不被接受,但“losenord”却是。

数据库具有“utf8_general_ci”连接排序规则,我在 index.html 中将字符集设置为 UTF-8,但在我的 php 脚本中没有。 我已经阅读了解决此类 UTF 8 问题的一百万种不同方法,但我无法让它发挥作用。

如果有人至少可以为我指明正确的方向,我将不胜感激。 我是否需要对每个 mysql 查询进行编码,设置一些 META 标记?

干杯

【问题讨论】:

您的行是否也使用utf8_general_ci 作为字符集? 这是一篇关于该主题的非常完整的文章:kunststube.net/frontback,以及 2 个可能有帮助的 SO 问题:***.com/questions/8906813/… 和 ***.com/questions/1294117/… 非常相关但不直接:您不应该在数据库中存储明文密码...!?! 我的行使用相同的字符集。我打算稍后在密码上使用 MD5,我只需要先解决这个 UTF8 问题,因为我会将其他内容存储在数据库中,这些内容将是并且应该是纯文本的。不过感谢您的提醒:) @Bartdude,感谢这些链接,它们非常有帮助! 【参考方案1】:

连接 MySQL 后尝试使用SET NAMES 'UTF8'

$con=mysqli_connect("host", "user", "pw", "db");   
if (!$con)

    die('Failed to connect to mySQL: ' .mysqli_connect_errno());


/* change character set to utf8 */
if (!$con->set_charset("utf8")) 
    printf("Error loading character set utf8: %s\n", $con->error);

正如manual 所说:

SET NAMES 表示客户端将使用什么字符集发送 SQL 对服务器的语句...它还指定了服务器应该使用的字符集 用于将结果发送回客户端。

还要在你的表中使用 utf8_swedish_ci,否则字符串比较会出错,MySQL 会将 'ö' 和 'o' 视为同一个字符。

【讨论】:

不建议在 PHP 中设置名称。见:php.net/manual/en/mysqli.set-charset.php @Evert 非常感谢。答案固定。 我已经有一段时间没有做任何主要的 PHP 工作了,但我在理解您的代码时遇到了一些麻烦。 if (!$con->set_charset("utf8")) 如果无法建立连接,请将charset设置为utf8? @FelixHindemo 意思是:如果他不能将charset切换为utf8,打印错误信息。但大多数情况下它不会在这里失败。你有没有尝试过? @user4035 是的,我得到了部分工作。 $db_charset = mysql_set_charset('utf8', $db_connect);它现在接受这两个示例作为正确的密码(lösenord 和 lostnord)虽然不太清楚为什么..

以上是关于MySQL 查询返回非 UTF8 字符的主要内容,如果未能解决你的问题,请参考以下文章

MySQL连表查询练习题

mysql 设置 utf8mb4 怎么查询

Lumen MySQL 查询未按预期处理 UTF8 值

非英语不支持来自 $.post jquery codeigniter 的 mysql 查询

MySQL查询不到中文的问题

mysql 8 pivot 查询应该返回一个非空值