如何在 SELECT 语句中即时更改编码?

Posted

技术标签:

【中文标题】如何在 SELECT 语句中即时更改编码?【英文标题】:How to change encoding on fly in SELECT statement? 【发布时间】:2021-11-19 01:55:23 【问题描述】:

我有一个包含一列的表,其中包含 cp1251_general_ci 排序规则。我不想更改列排序规则,但我想获取 utf8 编码的数据。

有没有办法以某种方式选择任何数据,使其看起来就像带有 utf8_general_ci 排序规则的数据?

即我需要这样的东西

SELECT CONVERT_TO_UTF8(weirdColumn) FROM weirdTable

【问题讨论】:

"ЂЃЉЌ" 是西里尔字母。在 cp1251 中是十六进制 80818A8D; utf8 或 utf8mb4 中的十六进制 D082D083D089D08C。为什么要更改编码?也就是说,下一步的行动是什么?许多操作可以在没有明确要求转换编码的情况下完成。33 【参考方案1】:

这是一个使用 cp1251 编码的演示表。我将在其中插入一些西里尔字符。

mysql> CREATE TABLE weirdTable (weirdColumn text) ENGINE=InnoDB DEFAULT CHARSET=cp1251;

mysql> insert into weirdTable values ('ЂЃЉЌ');

mysql> select * from weirdTable;
+-------------+
| weirdColumn |
+-------------+
| ЂЃЉЌ        |
+-------------+

使用 MySQL 的 CONVERT() function 将字符强制为不同的编码:

mysql> select convert(weirdColumn using utf8) as weirdColumnUtf8 from weirdTable;
+-----------------+
| weirdColumnUtf8 |
+-----------------+
| ЂЃЉЌ            |
+-----------------+

这是结果已转换为 utf8 的证明。我使用查询结果中的元数据创建了一个表:

mysql> create table w2 
    as select convert(weirdColumn using utf8) as weirdColumnUtf8 from weirdTable;
Query OK, 1 row affected (0.07 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> show create table w2\G
*************************** 1. row ***************************
       Table: w2
Create Table: CREATE TABLE `w2` (
  `weirdColumnUtf8` longtext CHARACTER SET utf8
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

mysql> select * from w2;
+-----------------+
| weirdColumnUtf8 |
+-----------------+
| ЂЃЉЌ            |
+-----------------+

在我的 MySQL 实例中,utf8mb4 是默认的字符编码。没关系;它是utf8的超集,utf8编码足以存储这些字符。但是,我一般建议如果你使用 utf8,没有理由不使用 utf8mb4。


如果更改字符编码,则无法保留 cp1251 排序规则。排序规则特定于编码。但是您可以使用与 utf8 或 utf8mb4 关联的排序规则之一。您可以查看给定字符编码的可用排序规则:

mysql> SHOW COLLATION WHERE Charset = 'utf8';
+--------------------------+---------+-----+---------+----------+---------+---------------+
| Collation                | Charset | Id  | Default | Compiled | Sortlen | Pad_attribute |
+--------------------------+---------+-----+---------+----------+---------+---------------+
...
| utf8_general_ci          | utf8    |  33 | Yes     | Yes      |       1 | PAD SPACE     |
| utf8_general_mysql500_ci | utf8    | 223 |         | Yes      |       1 | PAD SPACE     |
...

【讨论】:

要获得所需的排序规则和编码转换,可以使用:SELECT CONVERT(weirdColumn using utf8) COLLATE utf8_general_ci FROM weirdTable utf8_general_ci 是 utf8 的默认排序规则,因此没有必要。但是,是的,这是正确的语法。

以上是关于如何在 SELECT 语句中即时更改编码?的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP3:如何即时更改关联策略?

在 SELECT 语句中更改 Oracle 中的列名

如何在 Oracle 循环中的 select 语句中执行 alter 命令?

如何在 mySQL 的 SELECT 语句中使用 If 语句和关系运算符? [复制]

如何在预脚本中更改 SSDT SQLCMD 变量?

Magento 2:如何在 Paypal Express 中即时更改付款方式