gpt4 book ai didi

php - 如何在没有 SET NAMES 的情况下使用 PDO 指定排序规则?

转载 作者:可可西里 更新时间:2023-11-01 07:00:08 25 4
gpt4 key购买 nike

我们可以在初始化PDO时显式设置字符集为utf8,只需要在dsn字符串中加上“charset=utf8”即可。但是如何在使用 PDO 时显式指定 MySQL 连接中使用的排序规则呢?

我不想使用额外的查询来执行此操作:

SET NAMES utf8 COLLATE utf8_unicode_ci;

有什么办法不用求助于“SET NAMES”吗?或者,如果我不指定排序规则会有什么问题吗?

最佳答案

这是一个二合一的答案。

您可以在 DSN 中将其设置为 MYSQL_ATTR_INIT_COMMAND(连接选项)。

我认为 DSN 更好。

$connect = new PDO(
"mysql:host=$host;dbname=$db;charset=utf8",
$user,
$pass,
array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
)
);

如果您指定 UTF-8,您将使用 utf8_general_ci 的默认排序规则,除非您的数据库表或字段使用不同的东西。

如果您希望整个服务器使用此默认排序规则进行响应,请使用配置指令:

collation_server=utf8_unicode_ci 
character_set_server=utf8

因此您不必每次都在连接时指定它。

排序规则影响字符的排序,并在数据库中的表和字段上设置。查询表时会遵守这些设置。确保它们已设置好。使用 UTF-8 名称和数据库中的排序规则集。


您的评论:

"People should know char set and collation are 2 different things."

让我们引用 MySQL Manual证明这一点:

A SET NAMES 'charset_name' statement is equivalent to these three statements:

SET character_set_client = charset_name;
SET character_set_results = charset_name;
SET character_set_connection = charset_name;

Setting character_set_connection to charset_name also implicitly sets collation_connection to the default collation for charset_name.

我的回答:它隐含地工作,除非你的表明确地改变它。


来自评论的问题:

How to make sure I don't mess things up as my tables are not the default collation utf8_general_ci?

示例:列排序规则覆盖表排序规则

CREATE TABLE t1
(
col1 CHAR(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci
) CHARACTER SET latin1 COLLATE latin1_bin;

如果在列上指定了 CHARACTER SET X 和 COLLATE Y,则使用字符集 X 和排序规则 Y。该列具有表列中指定的字符集 utf8 和排序规则 utf8_unicode_ci,而表在 latin1 + latin1_bin 中。

示例:一般使用表排序规则

如果未在列/字段上明确指定排序规则,则使用表排序规则:

CREATE TABLE t1
(
col1 CHAR(10)
) CHARACTER SET latin1 COLLATE latin1_bin;

col1 具有排序规则 latin1_bin。

如果您需要 utf8_unicode_ci 排序规则,请将其设置为常规表或列/字段。

关于php - 如何在没有 SET NAMES 的情况下使用 PDO 指定排序规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25807202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com