在MySQL中设置名称utf8?

我经常在使用MySQL的PHP​​脚本中看到类似下面的内容

query("SET NAMES utf8"); 

我从来没有这样做的任何项目,所以我有一些基本的问题。

  1. 这只是用PDO完成的吗?
  2. 如果这不是一个PDO特定的事情,那么做这个的目的是什么? 我意识到这是设置MySQL的编码,但我的意思是,我从来没有使用它,所以我为什么要使用它?

只要你想发送数据到服务器的字符不能用纯ASCII表示,就像'ñ'或'ö'一样。

如果MySQL实例没有被配置为默认来自客户端连接的UTF-8编码(很多是根据您的位置和平台而定)。

如果您不知道Unicode是如何工作的,请阅读http://www.joelonsoftware.com/articles/Unicode.html

阅读是否使用“SET NAMES”来查看SET NAMES选项,以及它究竟是什么。

从手册 :

SET NAMES表示客户端将用于发送SQL语句到服务器的字符集。

更精细地(再次从手册中无偿地撤销):

SET NAMES表示客户端将用于发送SQL语句到服务器的字符集。 因此,SET NAMES'cp1251'告诉服务器,“来自这个客户端的未来传入消息是字符集cp1251”。它还指定了服务器应该用来将结果发送回客户端的字符集。 (例如,如果您使用SELECT语句,则表示用于列值的字符集。)

正确获取编码是非常棘手的 – 有太多的图层:

  • 浏览器
  • PHP
  • MySQL的

PHP中的SQL命令“SET CHARSET utf8”将确保客户端(PHP)将以utf8格式获取数据,而不管它们是如何存储在数据库中的。 当然,他们需要先保存正确。

DDL定义与真实数据

为表格/列定义的编码并不意味着数据是在该编码中。 如果你碰巧有一个表定义为utf8但存储为不同的编码,那么MySQL将把它们视为utf8 ,你有麻烦。 这意味着你必须先解决这个问题。

要检查什么

您需要检查每层的数据流的编码。

  • 检查HTTP头,头。
  • 检查请求的真正内容。
  • 不要忘记,MySQL几乎无处不在:
    • 数据库
    • 服务器作为一个整体
    • 客户
      确保每个地方都有正确的。

转变

如果你在例如windows-1250接收数据,并且想要存储在utf-8 ,那么在存储之前使用这个SQL:

 SET NAMES 'cp1250'; 

如果你在数据库中的数据为windows-1250并想要检索utf8 ,请使用:

 SET CHARSET 'utf8'; 

最后说明:

不要依赖太“聪明”的工具来显示数据。 例如phpMyAdmin(当我使用它时)正在做的编码非常糟糕。 它贯穿所有的层次,所以很难找出答案。 此外,Internet Explorer有一个愚蠢的行为,根据奇怪的规则“猜测”编码。 使用简单的编辑器,您可以切换编码。 另外,我推荐MySQL Workbench。

这个查询应该写在创建或更新数据库中的数据的查询之前,这个查询看起来像:

 mysql_query("set names 'utf8'"); 

请注意,您应该在头文件中编写您正在使用的编码,例如,如果您使用的是utf-8,则将其添加到标题中,否则会导致Internet Explorer出现问题

所以你的页面看起来像这样

 <html> <head> <title>page title</title> <meta charset="UTF-8" /> </head> <body> <?php mysql_query("set names 'utf8'"); $sql = "INSERT * FROM ..... "; mysql_query($sql); ?> </body> <html> 

而不是通过SQL查询来使用这个函数:mysqli :: set_charset mysqli_set_charset

 Note: This is the preferred way to change the charset. Using mysqli_query() to set it (such as SET NAMES utf8) is not recommended. 

有关更多信息,请参阅MySQL字符集概念部分。

http://www.php.net/manual/en/mysqli.set-charset.php

解决方案是

  $conn->set_charset("utf8"); 

谢谢@all!

不要使用:query(“SET NAMES utf8”); 这是安装的东西,而不是一个查询。 在setCharset()(或类似方法)开始连接之后,

一些小事在parctice:

状态:

  • MySQL服务器默认讲拉丁1
  • 你的洞应用程序是在UTF8
  • 连接没有任何额外的(所以:latin1)(没有SET NAMES utf8 …,没有set_charset()方法/函数)

只要mysql可以处理这些字符,存储和读取数据就没有问题了。 如果你在数据库中看,你会看到它有废话(例如使用phpmyadmin)。

直到现在这不是一个问题! (错误,但经常(欧洲))..

..除非另一个客户端/程序或更改的库,它的工作是正确的,将读取/保存数据。 那你就麻烦大了!