【问题标题】:MySQL query returning non UTF8 charactersMySQL 查询返回非 UTF8 字符
【发布时间】: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 问题:stackoverflow.com/questions/8906813/…stackoverflow.com/questions/1294117/…
  • 非常相关但不直接:您不应该在数据库中存储明文密码...!?!
  • 我的行使用相同的字符集。我打算稍后在密码上使用 MD5,我只需要先解决这个 UTF8 问题,因为我会将其他内容存储在数据库中,这些内容将是并且应该是纯文本的。不过感谢您的提醒:)
  • @Bartdude,感谢这些链接,它们非常有帮助!

标签: php mysql utf-8


【解决方案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)虽然不太清楚为什么..
猜你喜欢
  • 1970-01-01
  • 2020-12-22
  • 2014-11-09
  • 2014-05-19
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
相关资源
最近更新 更多