MySQL 5.6 使用 unicode 字符集创建视图

Posted

技术标签:

【中文标题】MySQL 5.6 使用 unicode 字符集创建视图【英文标题】:MySQL 5.6 create view with unicode character set 【发布时间】:2018-03-03 08:17:04 【问题描述】:

mysql 5.6。我无法在视图中获取字符串常量以针对具有默认 UCS2 字符集的数据库正确填充。在 5.7 上运行良好。

我在下面创建了一个可重现性极低的示例。

DROP SCHEMA IF EXISTS test3;
CREATE SCHEMA test3 CHARACTER SET ucs2;
CONNECT test3;

CREATE TABLE testtable (
testname VARCHAR(15)
);

INSERT INTO testTable( testname ) VALUES ('foo');
INSERT INTO testTable( testname ) VALUES ('bar');

CREATE OR REPLACE VIEW testview AS
SELECT * FROM testtable
WHERE testname = 'foo';

SELECT * FROM testview;

^^^ 此 select 语句不返回任何结果。

MySQL [test3]> 显示创建视图 testview \G ****************************** 1. 行 ************************ ******* 视图:测试视图 创建视图:CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `testview` AS select `testtable`.`testname` AS 来自`testtable`的`testname` where (`testtable`.`testname` = '\0\0\0f\0\0\0o\0\0\0o') character_set_client: utf8 collat​​ion_connection:utf8_general_ci

那是什么,utf32??

以下确实有效,但我不想将排序规则直接写入语句中,因为这需要是可移植代码并且语法看起来不标准:

CREATE OR REPLACE VIEW testview AS
SELECT * FROM testtable
WHERE testname = 'foo' COLLATE utf8_general_ci;

我尝试将客户端、连接和服务器字符集设置为 ucs2 和 utf16,但这没有任何改变。对于 *_general_ci 的排序规则也是如此。

有任何想法吗?

编辑:

MySQL [test3]> 显示变量,如“char%”;
+--------------------------+---------- --------------------------------------------------+
|变量名 |价值 |
+--------------------------+---------- --------------------------------------------------+
| character_set_client | utf8 |
|字符集连接 | utf8 |
|字符集数据库 | ucs2 |
|字符集文件系统 |二进制 |
|字符集结果 | utf8 |
| character_set_server |拉丁语1 |
|字符集系统 | utf8 |
|字符集目录 | C:\Program Files\MySQL\mysql-5.6.36-winx64\share\charsets\ |
+--------------------------+---------- --------------------------------------------------+

【问题讨论】:

【参考方案1】:

基本上没有理由在 MySQL 表中使用 usc2 或 utf16 或 utf32。仅使用 utf8mb4。 (如果您有旧版本的 MySQL,则为 utf8。)

请提供SHOW VARIABLES LIKE "char%";某些东西不应该改变:

mysql> SHOW VARIABLES LIKE "char%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     | <--
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       | <--
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

创建视图时,您没有设置字符集。我可以从你的SHOW 看到它说:

character_set_client: utf8

【讨论】:

谢谢。查看我的编辑;我可以将 _server 值切换为 ucs2,但它阻止尝试设置 _client 值;但我不一定认为有任何问题。为什么 utf8mb4 优于 utf32?任何一个都是每个字符 4 个字节。 ucs2 保证每个字符 2 个字节。我认为代理对将无法正确处理,或者可以通过重新编码在应用程序或客户端级别解决。 utf32 是 4 个字节的 ever 字符,甚至是英文字母。 utf8mb4UTF-8对外)长度可变,`字节表示英文字母,2表示欧洲重音字母,3表示亚洲字符,4表示Emoji和部分中文。 此外,utf8mb4 正在演变为 标准。 ucs2 是另一种无趣的 hack。你必须使用其中的两个来处理某些事情——在 UTF-8 中需要 4 个字节的任何东西。 确实,我原本以为 ucs2 会在表大小方面比 utf8mb4 给我买点东西,但在重新审视它之后,我错了,除了 char 字段可能例外,但我可以接受。我正在切换到 utf8mb4。我将暂时保留这个问题,因为所写的特定问题似乎是 5.6 中的一个错误,并且充其量是令人困惑的。感谢您的提示!

以上是关于MySQL 5.6 使用 unicode 字符集创建视图的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 5.6中的字符集

让MySQL支持Emoji表情 mysql 5.6

升级到5.6后Mysql在所有字段中搜索字符串变慢

永久修改MySQL字符集(适用Mysql5.5Mysql5.6Mysql5.7以上)

如果包含 json 文档作为字符串,如何从 MySQL(5.6) 列中获取值

1 windows MySql 5.6 安装