我经常在使用 MySQL 的 PHP 脚本中看到类似下面的内容
query("SET NAMES utf8");
我从来没有为任何项目做这个,所以我有几个关于它的基本问题。
这是仅使用 PDO 完成的事情吗?如果它不是 PDO 特定的事情,那么这样做的目的是什么?我意识到它正在为 mysql 设置编码,但我的意思是,我从来没有使用过它,那我为什么要使用它呢?
每当您想向服务器发送包含无法用纯 ASCII 表示的字符(如“ñ”或“ö”)的数据时都需要它。
如果 MySQL 实例未配置为默认来自客户端连接的 UTF-8 编码(许多是,取决于您的位置和平台。)
如果您不了解 Unicode 的工作原理,请阅读 http://www.joelonsoftware.com/articles/Unicode.html。
阅读 Whether to use "SET NAMES" 以查看 SET NAMES 替代方案及其具体内容。
正确编码真的很棘手 - 层太多:
浏览器
页
PHP
MySQL
PHP 的 SQL 命令“SET CHARSET utf8”将确保客户端 (PHP) 以 utf8 格式获取数据,无论它们如何存储在数据库中。当然,首先需要正确存储它们。
DDL 定义与真实数据
为表/列定义的编码并不真正意味着数据采用该编码。如果您碰巧有一个表定义为 utf8
但存储为不同的编码,那么 MySQL 会将它们视为 utf8
并且您遇到了麻烦。这意味着你必须先解决这个问题。
检查什么
您需要检查每一层数据流的编码方式。
检查 HTTP 标头,标头。
检查请求正文中真正发送的内容。
不要忘记 MySQL 几乎到处都有编码: 数据库表 列 服务器作为一个整体 客户端 确保到处都有正确的编码。
数据库
表
列
服务器作为一个整体
客户 确保到处都有合适的人。
转换
如果您在例如 windows-1250
中接收数据,并希望存储在 utf-8
中,则在存储之前使用此 SQL:
SET NAMES 'cp1250';
如果您在 DB 中有数据为 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>
SET NAMES UTF8
吗?SELECT
语句。