我经常在使用MySQL的PHP脚本中看到类似的内容
query("SET NAMES utf8");
我从来没有为任何项目都这样做,所以我对此有两个基本问题。
- 这仅是通过PDO完成吗?
- 如果不是PDO特定的事情,那么这样做的目的是什么?我意识到它正在为mysql设置编码,但是我的意思是,我从未使用过它,所以为什么要使用它?
我经常在使用MySQL的PHP脚本中看到类似的内容
query("SET NAMES utf8");
我从来没有为任何项目都这样做,所以我对此有两个基本问题。
Answers:
每当您要将数据发送到服务器时,如果字符中不能用纯ASCII表示的字符(如“ñ”或“ö”),都需要使用该属性。
如果MySQL实例未配置为默认情况下期望来自客户端连接的UTF-8编码(很多取决于您的位置和平台)。
如果您不了解Unicode的工作原理,请阅读http://www.joelonsoftware.com/articles/Unicode.html。
阅读是否使用“ SET NAMES”来查看SET NAMES的替代方案以及其确切含义。
SET NAMES UTF8
它们吗?
SELECT
语句。
从手册:
SET NAMES指示客户端将使用什么字符集将SQL语句发送到服务器。
更详细地讲((再一次从手册中免费提出):
SET NAMES指示客户端将使用什么字符集将SQL语句发送到服务器。因此,SET NAMES'cp1251'告诉服务器,“将来来自此客户端的传入消息使用字符集cp1251。” 它还指定服务器用于将结果发送回客户端的字符集。(例如,如果使用SELECT语句,它指示要用于列值的字符集。)
正确地进行编码确实很棘手-层太多了:
来自PHP的SQL命令“ SET CHARSET utf8”将确保客户端(PHP)可以在utf8中获取数据,无论它们如何存储在数据库中。当然,它们需要首先正确存储。
为表/列定义的编码实际上并不意味着数据在该编码中。如果您碰巧将一个表定义为,utf8
但存储为不同的编码,那么MySQL会将它们视为utf8
,这会给您带来麻烦。这意味着您必须先解决此问题。
您需要检查每层数据流的编码方式。
如果您在例如中接收数据windows-1250
,并且想要存储在中utf-8
,则在存储之前使用此SQL:
SET NAMES 'cp1250';
如果您在DB中有数据windows-1250
并且想要检索utf8
,请使用:
SET CHARSET 'utf8';
此查询应在创建或更新数据库中数据的查询之前编写,该查询如下所示:
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查询来执行此操作,请使用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字符集概念部分。
谢谢@all!
不要使用:query(“ SET NAMES utf8”); 这是安装程序的内容,而不是查询。在以setCharset()(或类似方法)开始的连接之后,将其正确放置
场地上的一些小东西:
状态:
只要mysql可以处理字符,就可以存储和读取数据。如果您查看数据库,您将已经看到其中有废话(例如,使用phpmyadmin)。
到现在为止这不是问题!(错误,但经常(在欧洲)有效。)
..除非可以正常工作的另一个客户端/程序或更改的库将读取/保存数据。那就麻烦大了!
不仅是PDO。如果SQL回答像'???? 符号,字符集的预设(希望UTF-8),真的建议:
if (!$mysqli->set_charset("utf8"))
{ printf("Can't set utf8: %s\n", $mysqli->error); }
或通过程序样式 mysqli_set_charset($db,"utf8")