php 读取utf8mb4,关于php:使用带有utf8表的SET NAMEs utf8mb4

在基于Mysql 5.5.57 Php 5.6.37的大型系统中

当前,整个系统都在utf8中运行,包括在每个数据库连接开始处的SET NAMEs utf8。

我需要在其中一张表中支持表情符号,因此需要将其切换为utf8mb4。 我不想切换其他表格。

我的问题是-如果我将所有连接(utf8和utf8mb4)的设置名称更改为utf8mb4,并将特定表仅切换到utf8mb4(并且仅将mb4数据写入此表)。 系统的其余部分会像以前一样工作吗?

使用utf8表/数据/连接中的SET NAMEs utf8mb4会不会有任何问题?

可能一直复制UTF-8

不是重复的。我询问utf8和utf8mb4的混合用法

就个人而言,Id建议您完全切换到utf8mb4。甚至MySQL团队也声称utf8mb4现在比utf8快得多。参考:mysqlserverteam.com/mysql-8-0-when-to-use-utf8mb3-over-utf8mb4 PS:不是我的作品:-)

PSA:可能需要时间更新到5.6.38,因为5.6.37中存在漏洞。

您应该问的是:"如果这行得通,我希望这成为系统前进的方式吗?刚离开utf8并继续使用utf8mb4会更好吗?如果实现,开发工作和安全性将受到怎样的损害?混合计划?有什么好处?最坏的情况是什么?"

我不想切换所有表的原因是它需要对表进行优化-这是一个大型生产系统。对这种阻止操作不满意。比将所有内容切换到一张桌子更可行

我认为对所有连接使用SET NAMES utf8mb4应该没有问题。

(utf8mb3是MySQL中utf8的同义词;为清楚起见,我将使用前者。)

utf8mb3是utf8mb4的子集,因此您的客户端字节将以两种方式都令人满意(Emoji除外,后者需要utf8mb4)。 当字节到达(或来自)仅声明的列时,将进行检查以确认您没有存储表情符号或某些中文字符,但是否则,它会以最小的麻烦进行。

我建议

ALTER TABLE ... CONVERT TO utf8mb4

作为转换表的"正确"方法。 但是,它将转换所有varchar / text列。 可能不好

如果您将转换后的表JOIN转换为未转换的表,则将尝试将utf8mb3字符串与utf8mb4字符串进行比较。 MySQL将举手并把所有行从一个转换为另一个。 那不是INDEX有用的。

所以...确保至少与JOINs中涉及的任何列保持一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是使用PHP连接MySQL数据库的示例。可以进行以下优化: 1. 使用mysqli或PDO代替mysql扩展,mysql扩展已经被废弃。 2. 将连接信息和数据库名放入配置文件中,方便修改和管理。 综上,以下是优化后的代码示例: ```php <?php // 读取配置文件 $config = parse_ini_file('config.ini'); // 创建连接 $conn = new mysqli($config['hostname'], $config['username'], $config['password'], $config['database']); // 检测连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } // 设置连接编码为UTF-8 $conn->set_charset('utf8'); // 执行SQL查询 $sql = "SELECT * FROM users"; $result = $conn->query($sql); // 检测查询结果 if ($result->num_rows > 0) { // 输出数据 while($row = $result->fetch_assoc()) { echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Age: " . $row["age"]. "<br>"; } } else { echo "0 结果"; } // 关闭连接 $conn->close(); ?> ``` 优化后的代码首先读取配置文件,将连接信息和数据库名放入配置文件中。然后使用`mysqli`类创建了一个连接对象`$conn`。如果连接失败,会输出错误信息。 接着,使用`$conn->set_charset('utf8')`设置连接编码为UTF-8,避免中文乱码。 执行了一个`SELECT`查询,将查询结果存储在`$result`变量中。使用`$result->num_rows`获取查询结果的行数,如果大于0,则循环遍历查询结果,输出每行数据;否则输出"0 结果"。 最后,使用`$conn->close()`关闭了数据库连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值