Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如果触发器和视图的字符集与数据库的其余部分不匹配,会产生什么后果?_Mysql - Fatal编程技术网

Mysql 如果触发器和视图的字符集与数据库的其余部分不匹配,会产生什么后果?

Mysql 如果触发器和视图的字符集与数据库的其余部分不匹配,会产生什么后果?,mysql,Mysql,我们最近完成了将应用程序的所有MySQL表、列和.ini设置转换为utf8编码的工作。但是,我们发现在此更改之前创建的视图和触发器仍然引用拉丁字符集,即以下查询返回记录: SELECT * FROM information_schema.triggers WHERE trigger_schema=SCHEMA() AND (collation_connection != 'utf8_general_ci' OR character_set_client != 'utf8') ; SELE

我们最近完成了将应用程序的所有MySQL表、列和.ini设置转换为utf8编码的工作。但是,我们发现在此更改之前创建的视图触发器仍然引用拉丁字符集,即以下查询返回记录:

SELECT * FROM information_schema.triggers
WHERE trigger_schema=SCHEMA() 
AND    (collation_connection != 'utf8_general_ci' OR character_set_client != 'utf8')
;
SELECT * FROM information_schema.views
WHERE table_schema=SCHEMA()
AND   (collation_connection != 'utf8_general_ci' OR character_set_client != 'utf8')
;
我需要担心这个吗?

MySQL文档上只显示了“创建触发器时character_set_client系统变量的会话值”。如果这就是存储的所有值,那么有没有理由尝试修复它们?(听起来没什么关系。)但另一方面,我不得不认为数据库开发人员出于某种原因选择将其存储在information_schema表中


生产已经在utf8上运行了一段时间,视图和触发器仍然引用latin1,我们并没有看到任何问题(尽管我们并没有非常大的非英语用户群)。我用不同的测试字符串进行了一些测试,没有发现任何字符损坏。

请参阅下面引用的粗体文本。如果在触发器/视图中使用了
非ASCII
字符,例如用于与
UTF-8
列之一进行比较,则最好重新创建它们。如果不是,那也没关系,因为这些变量用于设置对象的上下文,以便以后使用/重新创建

引自

已修复错误

不兼容更改:已确定存储的更改存在多个问题 程序(存储过程和函数、触发器和事件)和 包含非ASCII符号的视图。这些问题涉及转换 翻译时由于字符集信息不完整而导致的错误 这些对象与存储格式之间的转换,例如:

  • 解析原始对象定义以便可以存储它

  • 当对象 被调用

  • 从信息架构表中检索对象定义

  • 在SHOW语句中显示对象定义。这个问题也 受影响的mysqldump使用SHOW

解决问题的方法是存储来自 对象创建上下文,以便在 该对象需要以后使用。上下文包括客户端 字符集、连接字符集和排序规则,以及 与对象关联的数据库的排序规则

修补程序的结果是,几个表有了新的列:

在mysql数据库中,proc和event表现在有 列:字符集客户端、排序规则连接、数据库排序规则、, 车身_utf8

在信息模式中,视图表现在有以下列: 字符集客户端,排序规则连接。例行程序,触发器, 事件表现在有以下列:CHARACTER\u SET\u CLIENT, 排序规则\连接、数据库\排序规则

这些列存储字符集和客户端的会话值 排序规则\连接系统变量,以及 与对象关联的数据库。这些值是中的值 效果在对象创建时生效。(保存的数据库排序规则不正确。) collation_数据库系统变量的值,适用于 默认数据库;包含该对象的数据库不是 必须使用默认数据库。)


除非需要在不同格式之间转换,否则不同的字符集不应该造成问题。然后,您需要确保没有多余或缺少的字符。我找到的一个解决方案是将表中的所有数据转换为BLOB,然后更改字符集并转换回文本。如果您需要更多详细信息,有一个从拉丁文1转换为utf8的方法的解释。

我不确定这对您有多大帮助,但这是我们今天得到的(是的!!)。但我们也在升级数据库以支持utf8字符。与我们使用的新utf8格式相比,我们在流上创建的一个临时表没有正确的错误排序规则,因此我们遇到了一个新错误

Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '=', 
幸运的是,我们有:

我认为,如果比较两个字符串,并且它们的排序不正确,就会出现这种问题。需要对所有可能的输入进行广泛的测试


另外,我想听到更多关于你从拉丁语到UTF8的经历。我们两人都会面临类似的问题:-)

我不是这方面的专家,但根据我的经验,如果存在波浪形,mysql操作中的字符集转换可能会创建错误的字符,因此,最好将所有排序规则和字符集设置为相同的utf-8或utf-8-spanish-ci(如果记录为西班牙语)。我对主题了解不够,因此编辑起来不舒服,但当我单击此按钮时,我注意到标题听起来非常主观。您是否同意“不同字符集对触发器和视图的影响”听起来更像是一个话题?“问题本身就在主题上,伊姆霍,但标题没有做到这一点,再说一遍,我不确定我是否掌握了正确的想法。@麦卡达姆331说得好,我已经更改了标题。谢谢你的建议@Kip没问题,我不想把这件事交给我自己,因为你给了我很多答案哈哈。所以听起来如果你的视图或触发器包含非ascii字符,系统会存储这些值,这样它就知道如何读取视图/触发器SQL,即使从那以后角色集发生了变化,我给你赏金是因为这有很多有用的信息。我们最终还是找到了一个