set-names utf8?

czq61nw1  于 2021-06-23  发布在  Mysql
关注(0)|答案(8)|浏览(367)

我经常在使用mysql的php脚本中看到类似的内容

query("SET NAMES utf8");

我从来没有为任何项目做过这个,所以我有几个基本的问题。
这只是pdo做的事情吗?
如果这不是pdo特有的事情,那么做的目的是什么?我知道这是为mysql设置编码,但我的意思是,我从来没有使用过它,所以为什么我要使用它?

2nbm6dog

2nbm6dog1#

根据手册:
set names指示客户端将使用哪个字符集向服务器发送sql语句。
更细致地说(再一次,从手册中无缘无故地提出来):
set names指示客户端将使用哪个字符集向服务器发送sql语句。因此,集合名称“cp1251”告诉服务器,“来自此客户机的未来传入消息位于字符集cp1251中。”它还指定服务器应用于将结果发送回客户机的字符集(例如,如果使用select语句,它将指示要用于列值的字符集。)

yqlxgs2m

yqlxgs2m2#

解决办法是

$conn->set_charset("utf8");
63lcw9qa

63lcw9qa3#

正确编码真的很棘手-层太多了:
浏览器
页码
PHP
mysql数据库
php中的sql命令“set charset utf8”将确保客户端(php)将以utf8格式获取数据,无论这些数据如何存储在数据库中。当然,它们首先需要正确存储。

ddl定义与真实数据

为表/列定义的编码实际上并不意味着数据采用该编码。如果碰巧有一个表定义为 utf8 但是存储为不同的编码,那么mysql将把它们当作 utf8 你有麻烦了。这意味着你必须先解决这个问题。

要检查的内容

您需要检查每个层的数据流编码是什么。
检查http头,头。
检查请求正文中真正发送的内容。
别忘了mysql几乎无处不在:
数据库
table

整个服务器
客户
确保每个地方都有合适的。

转换

如果您收到数据,例如。 windows-1250 ,并希望存储在 utf-8 ,然后在存储之前使用此sql:

SET NAMES 'cp1250';

如果数据库中有数据 windows-1250 想重新获得 utf8 ,使用:

SET CHARSET 'utf8';

其他注意事项:

不要依赖太“聪明”的工具来显示数据。e、 phpmyadmin(在我使用它的时候)编码非常糟糕。它穿过了所有的层所以很难找到。
另外,InternetExplorer有一种非常愚蠢的行为,即根据奇怪的规则“猜测”编码。
使用可以切换编码的简单编辑器。我推荐mysql workbench。

2vuwiymt

2vuwiymt4#

使用php函数mysqli::set\u charset mysqli\u set\u charset,而不是通过sql查询执行此操作

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字符集概念部分。
从http://www.php.net/manual/en/mysqli.set-charset.php

ff29svar

ff29svar5#

每当您想向服务器发送数据时,需要使用纯ascii无法表示的字符,如'ñ' 或'ö'.
如果mysql示例没有配置为在默认情况下从客户机连接期望utf-8编码(根据您的位置和平台,很多都是这样)
阅读http://www.joelonsoftware.com/articles/unicode.html 以防您不知道unicode是如何工作的。
阅读是否使用“集合名称”来查看集合名称替代方案,以及它到底是关于什么的。

gwbalxhn

gwbalxhn6#

不仅仅是pdo。如果sql的回答像“????”符号,您的预设字符集(希望utf-8)真的建议:

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

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

6bc51xsx

6bc51xsx7#

谢谢大家!
不使用:query(“set names utf8”);这是安装程序,不是查询。用setcharset()或类似的方法启动连接后,将其放在右边
帕蒂斯的一些小事:
状态:
mysql服务器默认为1
你的洞应用程序是utf8
连接没有任何额外的(so:latin1)(没有集合名utf8…,没有集合\u charset()方法/函数)
只要mysql能够处理字符,存储和读取数据就没有问题。如果你查看数据库,你会发现里面有垃圾(例如使用phpmyadmin)。
直到现在这还不是问题(错误,但经常(在欧洲)起作用。。
..除非另一个正常工作的客户机/程序或更改的库将读取/保存数据。那你就有大麻烦了!

bmp9r5qi

bmp9r5qi8#

此查询应在创建或更新数据库中数据的查询之前写入,此查询如下所示:

mysql_query("set names 'utf8'");

请注意,您应该在头中编写您正在使用的编码,例如,如果您正在使用utf-8,您可以这样将其添加到头中,否则会导致internetexplorer出现问题
所以你的页面看起来像这样

<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>

相关问题