gpt4 book ai didi

php - "SET CHARACTER SET utf8"是必要的吗?

转载 作者:IT老高 更新时间:2023-10-28 23:42:40 25 4
gpt4 key购买 nike

我正在重写我们的数据库类(基于 PDO),但遇到了困难。我被教导在 PHP 和 MySQL 中使用 UTF-8 时同时使用 SET NAMES utf8SET CHARACTER SET utf8

在 PDO 中我现在想使用 PDO::MYSQL_ATTR_INIT_COMMAND 参数,但它只支持一个查询。

SET CHARACTER SET utf8有必要吗?

最佳答案

使用 SET CHARACTER SET utf8使用后SET NAMES utf8实际上会重置 character_set_connectioncollation_connection
@@character_set_database@@collation_database分别。

manual声明

  • SET NAMES x相当于

    SET character_set_client = x;
    SET character_set_results = x;
    SET character_set_connection = x;
  • SET CHARACTER SET x相当于

    SET character_set_client = x;
    SET character_set_results = x;
    SET collation_connection = @@collation_database;

SET collation_connection = x也在内部执行 SET character_set_connection = <<character_set_of_collation_x>>SET character_set_connection = x内部也执行SET collation_connection = <<default_collation_of_character_set_x .

所以本质上你是在重置 character_set_connection@@character_set_databasecollation_connection@@collation_database .手册解释了这些变量的用法:

What character set should the server translate a statement to after receiving it?

For this, the server uses the character_set_connection and collation_connection system variables. It converts statements sent by the client from character_set_client to character_set_connection (except for string literals that have an introducer such as _latin1 or _utf8). collation_connection is important for comparisons of literal strings. For comparisons of strings with column values, collation_connection does not matter because columns have their own collation, which has a higher collation precedence.

综上所述,MySQL 用于处理查询的编码/转码过程是一个多步骤的事情:

  1. MySQL 将传入的查询视为在 character_set_client 中编码。 .
  2. MySQL 对来自 character_set_client 的语句进行转码进入 character_set_connection
  3. 当比较字符串值和列值时,MySQL 将字符串值从 character_set_connection 转码。进入给定数据库列的字符集,并使用列排序规则进行排序和比较。
  4. MySQL 建立在 character_set_results 中编码的结果集(这包括结果数据以及结果元数据,例如列名等)

所以可能是 SET CHARACTER SET utf8不足以提供完整的 UTF-8 支持。想一想 latin1 的默认数据库字符集和用 utf8 定义的列-charset 并完成上述步骤。如latin1无法覆盖 UTF-8 可以覆盖的所有字符,您可能会在步骤 3 中丢失字符信息。

  • 步骤3:假设您的查询以 UTF-8 编码并且包含无法用 latin1 表示的字符,这些字符将在从 utf8 转码时丢失至latin1 (默认数据库字符集)使您的查询失败。

所以我认为可以肯定地说SET NAMES ...是处理字符集问题的正确方法。尽管我可能会补充说正确设置 MySQL 服务器变量(所有必需的变量都可以在您的 my.cnf 中静态设置)使您免于每次连接所需的额外查询的性能开销。

关于php - "SET CHARACTER SET utf8"是必要的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1566602/

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