【问题标题】:How to solve Illegal mix of collations (latin1_general_ci,IMPLICIT) error如何解决排序规则的非法混合(latin1_general_ci,IMPLICIT)错误
【发布时间】:2014-01-05 00:43:49
【问题描述】:

我正在尝试更新 MySQL 表中的记录,但遇到以下错误。

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='' 

这是我的查询

$db->processQuery('UPDATE account_mids SET price_sheet_file = ? WHERE mid = ? AND price_sheet_file IS NULL', array($filename, $mid));   

我尝试添加整理但没有成功。这就是我所做的

$db->processQuery('UPDATE account_mids SET price_sheet_file = ?  COLLATE utf8_general_ci    WHERE mid = ? COLLATE latin1_general_ci AND price_sheet_file IS NULL', array($filename, $mid)); 

但我收到以下错误

Syntax error or access violation: 1253 COLLATION 'latin1_general_ci' is not valid for CHARACTER SET 'utf8''

这是我的节目创建表

CREATE TABLE `account_mids` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `program_name` varchar(60) DEFAULT NULL,
 `mid` char(16) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
 `stage` enum('Engaged','Pricing','Application Sent','Application Incomplete','No Sale','Pending Admin Approval','Admin Rejected','Admin Approved','Submit to PTC','Waiting PTC Decision','Approved','Declined','On Hold','Withdrawn','Cancelled','Change of Program') NOT NULL,
 `type` enum('Existing Business','New Business','New Prospect','Change of Ownership','Program Transfer') NOT NULL,
 `chapter_name` varchar(80) DEFAULT NULL,
 `account_id` int(11) unsigned NOT NULL,
 `agent_code` varchar(8) DEFAULT NULL COMMENT 'the 10th and 11th char in mid value plus 00 it will equal out 4 chars',
 `prin_code` varchar(8) DEFAULT NULL COMMENT 'the 7th 8th and 9th char in the mid plus 0 on the right which is equal to 4 chars',
 `price_sheet_file` varchar(30) DEFAULT NULL,
 `created_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
 `status` tinyint(1) NOT NULL DEFAULT '1',
 `closed_reason` varchar(1000) DEFAULT NULL,
 `closed_on` datetime DEFAULT NULL,
 `approved_on` datetime DEFAULT NULL,
 `enrolled_on` date DEFAULT NULL,
 `training_requested_on` datetime DEFAULT NULL,
 `first_sale_on` datetime DEFAULT NULL,
 `speciality` varchar(255) DEFAULT NULL,
 `created_by` int(11) unsigned NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `mid` (`mid`),
 KEY `account_id` (`account_id`,`status`),
 CONSTRAINT `am_account_id` FOREIGN KEY (`account_id`) REFERENCES `accounts` (`account_id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=384010 DEFAULT CHARSET=utf8

我该如何解决这个问题?

谢谢

【问题讨论】:

  • mid 有不同的排序规则 (latin1) 有什么特别的原因吗?
  • @peterm 因为 latin1 比 utf8 快。并且中间列是唯一标识符。

标签: mysql


【解决方案1】:

我花了半天时间寻找可怕的“非法混合排序规则”错误的答案。我发现我的数据库中的某些列没有专门整理utf8_unicode_ci。似乎 mysql 隐式整理了这些列 utf8_general_ci

具体来说,运行“SHOW CREATE TABLE table1”查询会输出如下内容:

|表1 |创建表table1 ( id int(11) 非空, col1 varchar(4) 字符集 utf8 非空, col2 int(11) 非空, 主键 (photo_id,tag) ) ENGINE=InnoDB 默认字符集=utf8 COLLATE=utf8_unicode_ci |

注意 'col1' varchar(4) CHARACTER SET utf8 NOT NULL 行没有指定排序规则。然后我运行了以下查询:

ALTER TABLE table1 CHANGE col1 col1 VARCHAR(4) CHARACTER SET utf8 整理 utf8_unicode_ci NOT NULL;

这解决了我的“非法混合排序规则”错误。希望这可能对其他人有所帮助。

【讨论】:

    【解决方案2】:

    如果可能,我建议通过 Sequel Pro 查看表结构,因为它更容易调试/比较。我创建了一个新表,并没有使用以前创建的表中使用的 CHARSET 和 COLLATE 值...

    所以这导致了我们在使用具有不同 CHARSET 和 COLLATE 值的两个表运行查询时在上面看到的错误...

    通过“表信息”或“结构”选项卡比较设置,并确保 CHARSET 和 COLLATE 的值匹配。

    要调试更深入的运行 SHOW CREATE TABLE tablename 并比较表 CHARSET/COLLATE 值和表列 COLLATE 值。

    示例:column1 varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,

    如果您不能使用 sequel pro,请查看此 mysql 文档并运行更改... https://dev.mysql.com/doc/refman/5.7/en/charset-column.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-03
      • 2023-03-21
      • 2012-06-27
      相关资源
      最近更新 更多