在MySQL中设置名称utf8?

时间:2010-01-29 02:06:03

标签: php mysql utf-8

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

query("SET NAMES utf8");   

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

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

8 个答案:

答案 0 :(得分:69)

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

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

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

阅读Whether to use "SET NAMES"以查看SET NAMES替代方案及其具体内容。

答案 1 :(得分:43)

来自manual

  

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

更精心地,(再一次,无偿地从manual中解除):

  

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

答案 2 :(得分:30)

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

  • 浏览器
  • PHP
  • MySQL的

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

DDL定义与实际数据

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

检查什么

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

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

转换

如果您收到例如windows-1250,并希望存储在utf-8中,然后在存储之前使用此SQL:

SET NAMES 'cp1250';

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

SET CHARSET 'utf8';

几点注释:

  • 不要依赖过于“智能”的工具来显示数据。例如。 phpMyAdmin做(当我使用它时正在做)编码真的很糟糕。它贯穿所有层次,因此很难找到。
  • 此外,Internet Explorer根据奇怪的规则进行“猜测”编码的行为非常愚蠢。
  • 使用简单的编辑器切换编码。我推荐使用MySQL Workbench。

答案 3 :(得分:17)

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

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>

答案 4 :(得分:8)

解决方案是

 $conn->set_charset("utf8");

答案 5 :(得分: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.
     

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

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

答案 6 :(得分:1)

谢谢@all!

不要使用:query(“SET NAMES utf8”);这是设置的东西而不是查询。在使用setCharset()(或类似方法)

的连接开始后正确使用 在pctice中有一些小事情:

状态:

  • mysql服务器默认会说latin1
  • 你的洞穴应用程序是在utf8
  • 连接是没有任何额外的(所以:latin1)(没有SET NAMES utf8 ...,没有set_charset()方法/功能)

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

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

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

答案 7 :(得分:0)

不仅是PDO。如果sql回答像'????'符号,预设你的charset(希望UTF-8)真的值得推荐:

if (!$mysqli->set_charset("utf8")) 
 { printf("Can't set utf8: %s\n", $mysqli->error); }

或通过程序样式mysqli_set_charset($db,"utf8")