在MySQL中设置名称utf8?

Jas*_*vis 108 php mysql utf-8

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

query("SET NAMES utf8");   
Run Code Online (Sandbox Code Playgroud)

我从来没有为任何项目做过这个,所以我有几个关于它的基本问题.

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

Vin*_*vic 71

每当您想要将数据发送到具有无法用纯ASCII表示的字符的服务器时,就需要它,例如'ñ'或'ö'.

如果MySQL实例未配置为默认情况下从客户端连接预期UTF-8编码(许多是,取决于您的位置和平台.)

如果您不了解Unicode的工作原理,请阅读http://www.joelonsoftware.com/articles/Unicode.html.

阅读是否使用"SET NAMES"查看SET NAMES替代品以及它究竟是什么.

  • 'ö'和'ñ'是扩展的ASCII.你还需要为他们"设置NAMES UTF8"吗? (3认同)
  • 我发现我经常要添加utf8_decode($ my_text); 在PHP中,当从MySQL查询数据时,可以正确地在网站上显示特殊的UTF-8字符.我的表和列在MySQL中设置为UTF-8,所以这是否必要? (2认同)

kar*_*m79 43

手册:

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

更精心的是,(再一次,无意中从手册中解除了):

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

  • 我爱你.刚做完我的晚上! (6认同)
  • 刚给你100k先生!:d (5认同)

Ond*_*žka 32

正确编码是非常棘手的 - 层数太多了:

  • 浏览器
  • PHP
  • MySQL的

PHP中的SQL命令"SET CHARSET utf8"将确保客户端(PHP)将获取utf8中的数据,无论它们如何存储在数据库中.当然,首先需要正确存储它们.

DDL定义与实际数据

为表/列定义的编码并不真正意味着数据处于该编码中.如果您碰巧将表定义为utf8存储为differtent编码,那么MySQL会将它们视为utf8并且您遇到麻烦.这意味着你必须先解决这个问题.

怎么检查

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

  • 检查HTTP标头,标头.
  • 检查请求正文中发送的内容.
  • 不要忘记MySQL几乎到处都有编码:
    • 数据库
    • 服务器整体
    • 客户
      确保到处都是正确的.

转变

如果您在例如windows-1250,并且想要存储中接收数据utf-8,则在存储之前使用此SQL:

SET NAMES 'cp1250';
Run Code Online (Sandbox Code Playgroud)

如果您在数据库中有数据windows-1250并希望进行检索utf8,请使用:

SET CHARSET 'utf8';
Run Code Online (Sandbox Code Playgroud)

最后说明:

不要依赖太"智能"的工具来显示数据.例如,phpMyAdmin(当我使用它时正在做)编码真的很糟糕.它遍历所有层次,因此很难找到.此外,Internet Explorer实际上是基于奇怪的规则"猜测"编码的愚蠢行为.使用简单的编辑器可以切换编码.另外,我推荐MySQL Workbench.


usa*_*man 19

此查询应在创建或更新数据库中的数据的查询之前编写,此查询如下所示:

mysql_query("set names 'utf8'");
Run Code Online (Sandbox Code Playgroud)

请注意,您应该在标题中编写您正在使用的编码,例如,如果您使用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>
Run Code Online (Sandbox Code Playgroud)

  • 您不应该使用PHP mysql库,而应该使用MySQLi或PDO. (8认同)

nur*_*urp 8

解决方案是

 $conn->set_charset("utf8");
Run Code Online (Sandbox Code Playgroud)


小智 5

而不是通过SQL查询执行此操作使用php函数: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.
Run Code Online (Sandbox Code Playgroud)

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

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