MySql 在视图中更改排序规则

Shu*_*ali 4 mysql concat collation

我在 mysql 中有一个视图“name_all”,它的结构是

colName     varchar(30)  utf8_general_ci

date    varchar(76)     utf8_general_ci

name  varchar(43)   latin1_swedish_ci
Run Code Online (Sandbox Code Playgroud)

当我尝试运行查询时:

SELECT CONCAT(`colname`,' of Mr. ',`name`,' Expire on ',`date`) FROM name_all
Run Code Online (Sandbox Code Playgroud)

它给出错误:

 #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
Run Code Online (Sandbox Code Playgroud)

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

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

  Variable_name         Value
  collation_connection  utf8_general_ci
  collation_database    latin1_swedish_ci
  collation_server      latin1_swedish_ci
Run Code Online (Sandbox Code Playgroud)

Car*_*rth 5

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

  • @JairusMartin - 这是正确的。无论设置的排序规则是什么,都将是定义显式字符串值的列使用的排序规则,而不是从基础表中检索值。 (4认同)

Shi*_*ham 1

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

colName   varchar(30)   utf8_general_ci

date   varchar(76)   utf8_general_ci

name   varchar(43)   latin1_swedish_ci
Run Code Online (Sandbox Code Playgroud)

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