我经常在使用MySQL的PHP脚本中看到类似下面的内容
query("SET NAMES utf8");
我从来没有为任何项目做过这个,所以我有几个关于它的基本问题。
答案 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中的SQL命令“SET CHARSET utf8”将确保客户端(PHP)将获取utf8中的数据,无论它们如何存储在数据库中。当然,首先需要正确存储它们。
为表/列定义的编码并不意味着数据在该编码中。如果您碰巧将表定义为utf8
但存储为differtent编码,那么MySQL会将它们视为utf8
并且您遇到了麻烦。这意味着你必须先解决这个问题。
您需要检查每层的数据流编码。
如果您收到例如windows-1250
,并希望存储在utf-8
中,然后在存储之前使用此SQL:
SET NAMES 'cp1250';
如果您的数据库中的数据为windows-1250
,并想要检索utf8
,请使用:
SET CHARSET 'utf8';
答案 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字符集概念部分。
答案 6 :(得分:1)
谢谢@all!
不要使用:query(“SET NAMES utf8”);这是设置的东西而不是查询。在使用setCharset()(或类似方法)
的连接开始后正确使用 在pctice中有一些小事情:状态:
存储和读取数据没有问题,因为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")