ChatGPT解决这个技术问题 Extra ChatGPT

在 MySQL 中设置名称 utf8?

我经常在使用 MySQL 的 PHP 脚本中看到类似下面的内容

query("SET NAMES utf8");   

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

这是仅使用 PDO 完成的事情吗?如果它不是 PDO 特定的事情,那么这样做的目的是什么?我意识到它正在为 mysql 设置编码,但我的意思是,我从来没有使用过它,那我为什么要使用它呢?

由于 SQL 注入,应避免使用“SET NAMES utf8”。有关详细信息,请参阅 php.net/manual/en/mysqlinfo.concepts.charset.php。
@masakielastic我看不出设置'set names utf8'对sql注入有威胁吗?使用正确的 MySQL API 线程在哪里?
对不起我的不友善。见ircmaxell的回答:stackoverflow.com/a/12118602/531320Althogh "SET NAMES" 只要使用UTF-8就没有问题,未来你使用GBK或Big5(中文)或Shift_JIS(日文)的可能性是不可否认的。

C
Community

每当您想向服务器发送包含无法用纯 ASCII 表示的字符(如“ñ”或“ö”)的数据时都需要它。

如果 MySQL 实例未配置为默认来自客户端连接的 UTF-8 编码(许多是,取决于您的位置和平台。)

如果您不了解 Unicode 的工作原理,请阅读 http://www.joelonsoftware.com/articles/Unicode.html

阅读 Whether to use "SET NAMES" 以查看 SET NAMES 替代方案及其具体内容。


'ö' 和 'ñ' 是扩展的 ASCII。您还需要为他们SET NAMES UTF8吗?
我发现我经常要添加 utf8_decode($my_text);在 PHP 中获取特殊的 UTF-8 字符以在从 MySQL 查询数据时正确显示在网站上。我的表和列在 MySQL 中设置为 UTF-8——所以这是否必要?
@ Vinko Vrsalovic:不一定......我的所有文件都保存在 utf8 中,但我以前的主机已将 mysql 字符集设置为 latin1,并且因为我没有告诉 mysql 我在 utf8 中发送字符(因此设置名称 utf8)它存储了它们在拉丁字符集中,我所有的特殊字符(斯洛文尼亚语 čšž)看起来像是被汽车碾过 - 还有一件事:当你在 phpmyadmin 中进行搜索时,你不会找到结果,因为 č 就像 Å 等等
请注意,它还指定了服务器用于将结果发送回客户端的字符集,因此在接收此数据时也需要使用,例如使用 SELECT 语句。
@蒂姆。实际上并没有“扩展的 ASCII”之类的东西。有一大堆不同的编码都可以称为扩展 ASCII(任何前半部分与 ASCII 相同的单字节字符集,并且有很多)。
k
karim79

manual

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

更详细地说,(再一次,无偿地从 manual 中删除):

SET NAMES 指示客户端将使用什么字符集将 SQL 语句发送到服务器。因此,SET NAMES 'cp1251' 告诉服务器,“来自该客户端的未来传入消息在字符集 cp1251 中。”它还指定服务器用于将结果发送回客户端的字符集。 (例如,如果您使用 SELECT 语句,它指示用于列值的字符集。)


我爱你。刚刚度过了我的夜晚!
C
Community

正确编码真的很棘手 - 层太多:

浏览器

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。


u
usama sulaiman

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

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>

您不应该使用 PHP mysql 库,而应该使用 MySQLi 或 PDO。
很好的答案,谢谢你的例子。这是帮助我想象我需要做什么的一个答案,它解决了我的问题!
最后一个标签应该是 而不是
n
nurp

解决方案是

 $conn->set_charset("utf8");

u
user1783273

不要通过 SQL 查询执行此操作,而是使用 php 函数: mysqli::set_charset mysqli_set_charset

注意:这是更改字符集的首选方法。不推荐使用 mysqli_query() 设置(如 SET NAMES utf8)。有关更多信息,请参阅 MySQL 字符集概念部分。

来自http://www.php.net/manual/en/mysqli.set-charset.php


u
user3162905

谢谢@所有人!

不要使用:query("SET NAMES utf8");这是设置的东西,而不是查询。将其放在以 setCharset() (或类似方法)开始的连接之后

一些小事:

地位:

mysql 服务器默认会说 latin1

你的洞应用程序是 utf8

没有任何额外的连接(所以:latin1)(没有 SET NAMES utf8 ...,没有 set_charset() 方法/函数)

只要mysql可以处理字符,存储和读取数据就没有问题。如果您查看数据库,您将已经看到其中有废话(例如使用 phpmyadmin)。

直到现在这都不是问题! (错误但经常工作(在欧洲))..

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


d
dmitry_podyachev

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

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

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