【问题标题】:MySql change collation in viewMySql 在视图中更改排序规则
【发布时间】:2012-06-10 03:19:09
【问题描述】:

我在mysql中有一个视图“name_all”是哪个结构

colName     varchar(30)  utf8_general_ci

date    varchar(76)     utf8_general_ci

name  varchar(43)   latin1_swedish_ci

当我尝试运行查询时:

SELECT CONCAT(`colname`,' of Mr. ',`name`,' Expire on ',`date`) FROM name_all

报错:

 #1271 - Illegal mix of collations for operation 'concat'

"colName" is basically a Column Name which is used as a row in this View

"date" is mysql Date which is converted in this format '%a %D %b, %Y'

"name" is concatenation of firstname, middlename, lastname from a table

我该如何解决这个问题,我的错误是什么?

当我运行查询 SHOW VARIABLES LIKE 'collat​​ion%' 结果是

  Variable_name         Value
  collation_connection  utf8_general_ci
  collation_database    latin1_swedish_ci
  collation_server      latin1_swedish_ci

【问题讨论】:

    标签: mysql collation concat


    【解决方案1】:

    对于遇到此线程的任何其他人,视图列的排序规则由基础表列确定,除非该列是视图中定义的硬编码字符串(例如,定义某些字符串值的 CASE)。在这些情况下,排序规则由视图创建期间指定的字符集确定。在视图定义期间,像 HeidiSQL 这样的导出客户端可能包含可执行的 cmets,这些 cmets 将字符集设置为默认值,而不是您的预期设置。当您重新运行定义时,您现在已经保存了不匹配的集合。运行“show full columns from viewName”进行检查。

    【讨论】:

    • 谢谢,这节省了我一些时间。所以在创建视图之前基本上运行SET collation_server = 'utf8_unicode_ci'
    • @JairusMartin - 没错。无论该集合排序规则是什么,都将由定义显式字符串值的列使用,而不是从基础表中检索值。
    【解决方案2】:

    即使您说“所有表格和列都在 latin1_swedish_ci 中”,但您发布的是:

    colName   varchar(30)   utf8_general_ci
    
    date   varchar(76)   utf8_general_ci
    
    name   varchar(43)   latin1_swedish_ci
    

    将 colName 和 date 排序规则更改为 latin1_swedish_ci 可能会解决您的问题。

    【讨论】:

    • 但我如何在“视图”中做到这一点
    • 好问题。您必须在数据库的表中执行此操作,View 就像使用一些已定义的规则集查看数据表 [正如名称暗示“VIEW”]。所以视图不会改变你的模式的任何底层设计。尝试在数据库级别更改 collotion。
    猜你喜欢
    • 1970-01-01
    • 2011-03-29
    • 2020-02-13
    • 2011-02-13
    • 2021-01-28
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    相关资源
    最近更新 更多