如何在 SELECT 语句中动态更改编码?
How to change encoding on fly in SELECT statement?
我有一个 table 的列,其中有 cp1251_general_ci 排序规则。我不想更改列排序规则,但我想获取 utf8 编码的数据。
有没有办法以某种方式 select 任何数据,使其看起来就像具有 utf8_general_ci 排序规则的数据?
即我需要这样的东西
SELECT CONVERT_TO_UTF8(weirdColumn) FROM weirdTable
这是一个使用 cp1251 编码的演示 table。我将在其中插入一些西里尔字符。
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。我使用查询结果中的元数据创建 table:
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 |
...
我有一个 table 的列,其中有 cp1251_general_ci 排序规则。我不想更改列排序规则,但我想获取 utf8 编码的数据。
有没有办法以某种方式 select 任何数据,使其看起来就像具有 utf8_general_ci 排序规则的数据?
即我需要这样的东西
SELECT CONVERT_TO_UTF8(weirdColumn) FROM weirdTable
这是一个使用 cp1251 编码的演示 table。我将在其中插入一些西里尔字符。
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。我使用查询结果中的元数据创建 table:
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 |
...