Mysql 如果触发器和视图的字符集与数据库的其余部分不匹配,会产生什么后果?
我们最近完成了将应用程序的所有MySQL表、列和.ini设置转换为utf8编码的工作。但是,我们发现在此更改之前创建的视图和触发器仍然引用拉丁字符集,即以下查询返回记录: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
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
除非需要在不同格式之间转换,否则不同的字符集不应该造成问题。然后,您需要确保没有多余或缺少的字符。我找到的一个解决方案是将表中的所有数据转换为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,即使从那以后角色集发生了变化,我给你赏金是因为这有很多有用的信息。我们最终还是找到了一个