在 MySQL 中设置名称 utf8? ?

我经常在使用 MySQL 的 PHP 脚本中看到类似的东西

query("SET NAMES utf8");

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

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

无论何时,只要您希望向服务器发送具有不能用纯 ASCII 表示的字符的数据,比如‘ ñ’或‘ ö’,就需要使用它。

如果 MySQL 实例没有配置为默认情况下期望从客户端连接获得 UTF-8编码(根据您的位置和平台,许多连接都是 UTF-8编码)

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

阅读 Whether to use "SET NAMES"以查看 SETNAMES 备选方案以及它到底是关于什么的。

From the 手动操作:

SETNAMES 指示什么字符集 客户端将用于发送 SQL 语句发送到服务器。

更详细地说(再一次无缘无故地从 手动操作中提取出来) :

SET NAMES indicates what character set 客户端将用于发送 SQL 语句发送到服务器。因此,SET 名称‘ cp1251’告诉服务器, ”未来来自这里的信息 client are in character set cp1251.” It also specifies the character set 服务器应该用来发送 results back to the client. (For 例子,它指示什么字符 设置为用于列值 使用 SELECT 语句。)

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

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>

Getting encoding right is really tricky - there are too many layers:

  • 浏览器
  • 翻页
  • PHP
  • MySQL

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

DDL 定义与实际数据

为表/列定义的编码并不意味着数据就在那种编码中。如果您有一个定义为 utf8但存储为不同编码的表,那么 MySQL 将把它们视为 utf8,这样您就有麻烦了。也就是说你得先解决这个问题。

检查什么

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

  • 检查 HTTP 头,头。
  • 检查请求主体中真正发送的内容。
  • 不要忘记 MySQL 的编码几乎无处不在:
    • 数据库
    • 桌子
    • 柱子
    • Server as a whole
    • 客户
      Make sure that there's the right one everywhere.

转换

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

SET NAMES 'cp1250';

如果数据库中的数据为 windows-1250,并且希望检索 utf8,请使用:

SET CHARSET 'utf8';

还有几点注意事项:

  • 不要依赖过于“智能”的工具来显示数据。例如,phpMyAdmin 的编码非常糟糕。它穿过所有的层,所以很难发现。
  • 此外,Internet Explorer 还有一种非常愚蠢的行为,就是根据奇怪的规则“猜测”编码。
  • 在可以切换编码的地方使用简单的编辑器。

谢谢大家!

don't use: query("SET NAMES utf8"); this is setup stuff and not a query. put it right afte a connection start with setCharset() (or similar method)

实际上是一件小事:

状况:

  • mysql server by default talks latin1
  • 你的洞应用程序在 utf8
  • 没有任何额外的连接(如: latin1)(没有 SETNAMES utf8... ,没有 SET _ charset ()方法/函数)

只要 mysql 能够处理字符,存储和读取数据就没有问题。 if you look in the db you will already see there is crap in it (e.g.using phpmyadmin).

until now this is not a problem! (wrong but works often (in europe)) ..

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

使用 php 函数: mysqli: : set _ charset 代替通过 SQL 查询执行此操作 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");

不仅仅是 PDO。如果 sql 回答像“ ? ? ? ?”符号,预设你的字符集(希望是 UTF-8)真的推荐:

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

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