是否需要“设置字符集utf8”?

2023-12-27

我正在重写我们的数据库类(基于 PDO),并陷入困境。我被教导要同时使用SET NAMES utf8 and SET CHARACTER SET utf8在 PHP 和 MySQL 中使用 UTF-8 时。

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

Is SET CHARACTER SET utf8必要的?


Using SET CHARACTER SET utf8使用后SET NAMES utf8实际上会重置character_set_connection and collation_connection to
@@character_set_database and @@collation_database分别。

The manual http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html指出

  • SET NAMES x相当于

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

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

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

所以本质上你正在重置character_set_connection to @@character_set_database and collation_connection to @@collation_database。手册解释了这些变量的用法:

服务器应该使用什么字符集 将语句翻译为 after 收到了吗?

为此,服务器使用 字符集连接和 collat​​ion_connection 系统变量。 它转换由发送的语句 客户端从character_set_client到 字符集连接(除了 具有一个的字符串文字 介绍人,例如 _latin1 或 _utf8)。 collat​​ion_connection 很重要 文字字符串的比较。为了 字符串与列的比较 值, collat​​ion_connection 不 很重要,因为列有自己的 排序规则,具有较高的 排序规则优先级。

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

  1. MySQL 将传入的查询视为已编码character_set_client.
  2. MySQL 将语句转码为character_set_client into 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.

  • Step 3:鉴于您的查询以 UTF-8 编码并包含无法用latin1,这些字符在转码时将会丢失utf8 to latin1(默认数据库字符集)使您的查询失败。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否需要“设置字符集utf8”? 的相关文章

随机推荐

  • 正则表达式 - 查找所有不以特定前缀开头的匹配单词

    如何构造正则表达式来查找以字符串结尾但不以字符串开头的所有单词 例如查找以下句子中所有以 friend 结尾但不以 girl 开头的单词 A 男朋友 and 女朋友获得了friend当他们要求befriend them 中的项目bold应该
  • 在 NextJS 中添加自动单位的 Google Ads 代码

    我正在开发一个 nextjs 项目 我必须实现用于自动广告的 google AdSense 代码 所以 我的谷歌广告代码就是这样的 没有特定的广告单元代码 根据此脚本加载 Google 将自动添加广告 在这种情况下 我将如何在我的 Next
  • 通过 Torque 将 Julia 文件提交到集群时导入 PyPlot 时出现问题

    我正在学校的集群上运行一些 Julia 代码 调用 test julia jl 的 bps 文件如下 1 bin tcsh 2 3 PBS l walltime 24 00 00 4 PBS l nodes 1 ppn 1 5 PBS N
  • Haskell $ 运算符是否存在逆操作?

    一个简单的问题是 Haskell 中是否有一个运算符 其工作方式类似于美元符号 但优先考虑左侧 IE 代替 f x 1 被写成 f x 1 我想把它写成 x 1 f 这纯粹是一个风格问题 我正在按顺序运行一系列函数 如果我可以从左到右编写它
  • Ada - 提出可访问性检查

    我从Github下载了这个程序 https github com raph amiard ada synth lib https github com raph amiard ada synth lib 我尝试了第一个例子 但遇到了一个例外
  • Maven 父 POM 与 BOM 依赖管理

    假设我有一个 Maven 父 POMroot它定义了foo bar 1 0 0在依赖管理中 我有另一个父 POMparent它使用root作为父级 只是为了向示例添加另一个层 最后我有一份材料清单bom它使用root作为其父级但重新定义fo
  • 如何使“Enter”键的行为类似于 JFrame 上的“提交”

    我正在构建一个客户端 服务器应用程序 我想让用户在身份验证框架上变得轻松 I want to know how to make enter key submits the login and password to the Database
  • 您需要使用不同的包名称,因为“com.example”受到限制

    我已经在这里找到了很多关于这个问题的线程 但没有一个对我有用 我使用的是Android Studio 2 1 2 并且我仍然有com example域名 在清单或任何其他文件中更改它会导致出现大量错误 而我的 build gradle 仅显
  • SwiftUI:两指滑动(滚动)手势

    我对 2 指滑动 滚动 手势感兴趣 不是两指拖动 而是两指滑动 无需按下 就像在 Safari 中用来向上和向下滚动一样 据我所知 没有一个基本手势可以用于此目的 TapGesture 不是 LongPressGesture 不 DragG
  • 防止多次登录

    我试图在我的应用程序中阻止同一用户的多次登录 我的想法是在用户登录时更新安全标记并将其添加为声明 然后在每个请求中将 cookie 中的标记与数据库中的标记进行比较 这就是我的实现方式 public virtual async Task
  • 滚动条没有出现?

    我正在为 Tumblr 开发主题 但由于某种原因滚动条没有出现 这是博客的网址 http infinitethemedewitt tumblr com 主题的代码可以通过右键单击在页面源代码中找到 除了 html 之外的所有代码 因为它被
  • fopen 不显示内容

    不知道为什么我的即时通讯页面出现空白 txt 中有数据 php 中没有错误 这是 txt Product txt ID OID Title Description Option Price 01 01JAP Japanese Mod
  • CarrierWave + RMagick 方形裁剪?

    我正在尝试使用 Ruby on Rails CarrierWave 和 RMagick 制作固定的方形图像裁剪 我尝试过以下两种方法 但没有运气 version thumb do process resize to fit gt 200 2
  • C# 十进制格式化查询

    我正在尝试格式化小数 以便它显示如下 14 5 应显示为 14 50 14 50 应显示为 14 50 14 05 应显示为 14 05 14 00 应显示为 14 是否可以使用单一字符串格式 即不使用条件格式 我尝试过 0 不满足第一个示
  • 水平滚动列表

    我希望将图像显示在水平列表中 这就是我到目前为止所做的 var list Ext create Ext List store store itemTpl new Ext XTemplate img src icon inline true
  • 设置解析注册的默认个人资料图片

    我试图在注册时在解析中设置默认的个人资料图片 该图片位于我的项目文件夹中 有什么办法可以设置不上传照片吗 var user new Parse User user set username username val user set pas
  • 在 HyperLedger Composer 查询中获取资产计数?

    我想在 HyperLedger Composer 中编写一个查询 返回我在超级账本中拥有的资产数量 我有数千条记录 我不想将它们全部获取并计算计数 数据传输会很慢 我希望查询返回计数 不幸的是 这儿没有count使用作曲家查询语言 您必须创
  • cocos2d 计算给定起点、角度和距离的目的地点

    我想快点吧 Cocos2d 和 xcode 中的 2d 问题 I have CGPoint currPoint float lineLength float angle 现在 我需要找到距离 currPoint 角度为 lineLength
  • 大量数据的数据库设计[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在开展一个项目 涉及来自美味网站的大量数据 可用数据为 日期 用户 ID 网址 标签 针对每个书签 我将数据库规范化为 3NF 并且由于我们
  • 是否需要“设置字符集utf8”?

    我正在重写我们的数据库类 基于 PDO 并陷入困境 我被教导要同时使用SET NAMES utf8 and SET CHARACTER SET utf8在 PHP 和 MySQL 中使用 UTF 8 时 在 PDO 中我现在想使用PDO M