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 collation_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 字符,甚至是英文字母。 utf8mb4
(UTF-8
对外)长度可变,`字节表示英文字母,2表示欧洲重音字母,3表示亚洲字符,4表示Emoji和部分中文。
此外,utf8mb4
正在演变为 标准。
ucs2
是另一种无趣的 hack。你必须使用其中的两个来处理某些事情——在 UTF-8 中需要 4 个字节的任何东西。
确实,我原本以为 ucs2 会在表大小方面比 utf8mb4 给我买点东西,但在重新审视它之后,我错了,除了 char 字段可能例外,但我可以接受。我正在切换到 utf8mb4。我将暂时保留这个问题,因为所写的特定问题似乎是 5.6 中的一个错误,并且充其量是令人困惑的。感谢您的提示!以上是关于MySQL 5.6 使用 unicode 字符集创建视图的主要内容,如果未能解决你的问题,请参考以下文章
永久修改MySQL字符集(适用Mysql5.5Mysql5.6Mysql5.7以上)