在MySQL中设置名称utf8?
我经常在使用MySQL的PHP脚本中看到类似下面的内容
query("SET NAMES utf8");
我从来没有这样做的任何项目,所以我有一些基本的问题。
- 这只是用PDO完成的吗?
- 如果这不是一个PDO特定的事情,那么做这个的目的是什么? 我意识到这是设置MySQL的编码,但我的意思是,我从来没有使用它,所以我为什么要使用它?
只要你想发送数据到服务器的字符不能用纯ASCII表示,就像'ñ'或'ö'一样。
如果MySQL实例没有被配置为默认来自客户端连接的UTF-8编码(很多是根据您的位置和平台而定)。
如果您不知道Unicode是如何工作的,请阅读http://www.joelonsoftware.com/articles/Unicode.html 。
阅读是否使用“SET NAMES”来查看SET NAMES选项,以及它究竟是什么。
从手册 :
SET NAMES表示客户端将用于发送SQL语句到服务器的字符集。
更精细地(再次从手册中无偿地撤销):
SET NAMES表示客户端将用于发送SQL语句到服务器的字符集。 因此,SET NAMES'cp1251'告诉服务器,“来自这个客户端的未来传入消息是字符集cp1251”。它还指定了服务器应该用来将结果发送回客户端的字符集。 (例如,如果您使用SELECT语句,则表示用于列值的字符集。)
正确获取编码是非常棘手的 – 有太多的图层:
- 浏览器
- 页
- PHP
- MySQL的
PHP中的SQL命令“SET CHARSET utf8”将确保客户端(PHP)将以utf8格式获取数据,而不管它们是如何存储在数据库中的。 当然,他们需要先保存正确。
DDL定义与真实数据
为表格/列定义的编码并不意味着数据是在该编码中。 如果你碰巧有一个表定义为utf8
但存储为不同的编码,那么MySQL将把它们视为utf8
,你有麻烦。 这意味着你必须先解决这个问题。
要检查什么
您需要检查每层的数据流的编码。
- 检查HTTP头,头。
- 检查请求的真正内容。
- 不要忘记,MySQL几乎无处不在:
- 数据库
- 表
- 列
- 服务器作为一个整体
- 客户
确保每个地方都有正确的。
转变
如果你在例如windows-1250
接收数据,并且想要存储在utf-8
,那么在存储之前使用这个SQL:
SET NAMES 'cp1250';
如果你在数据库中的数据为windows-1250
并想要检索utf8
,请使用:
SET CHARSET 'utf8';
最后说明:
不要依赖太“聪明”的工具来显示数据。 例如phpMyAdmin(当我使用它时)正在做的编码非常糟糕。 它贯穿所有的层次,所以很难找出答案。 此外,Internet Explorer有一个愚蠢的行为,根据奇怪的规则“猜测”编码。 使用简单的编辑器,您可以切换编码。 另外,我推荐MySQL Workbench。
这个查询应该写在创建或更新数据库中的数据的查询之前,这个查询看起来像:
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查询来使用这个函数: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字符集概念部分。
解决方案是
$conn->set_charset("utf8");
谢谢@all!
不要使用:query(“SET NAMES utf8”); 这是安装的东西,而不是一个查询。 在setCharset()(或类似方法)开始连接之后,
一些小事在parctice:
状态:
- MySQL服务器默认讲拉丁1
- 你的洞应用程序是在UTF8
- 连接没有任何额外的(所以:latin1)(没有SET NAMES utf8 …,没有set_charset()方法/函数)
只要mysql可以处理这些字符,存储和读取数据就没有问题了。 如果你在数据库中看,你会看到它有废话(例如使用phpmyadmin)。
直到现在这不是一个问题! (错误,但经常(欧洲))..
..除非另一个客户端/程序或更改的库,它的工作是正确的,将读取/保存数据。 那你就麻烦大了!