Skip to content

Fix Collation Mismatch in JOIN ON Clause ​

When joining tables with different collations in MySQL, you can directly force the collation conversion in the ON clause without subqueries or aliases.

This is the MySQL official standard syntax - the simplest and most commonly used approach.

Final Syntax (Copy and Use Directly in ON) ​

sql
ON 
t1.col COLLATE utf8mb4_0900_ai_ci 
= 
t2.col COLLATE utf8mb4_0900_ai_ci

Complete Runnable Example ​

sql
SELECT * 
FROM table1 t1 
JOIN table2 t2 
ON 
  t1.user_code COLLATE utf8mb4_0900_ai_ci 
  = 
  t2.user_code COLLATE utf8mb4_0900_ai_ci

Convert Only One Side (Simpler) ​

If only t1 is utf8mb4_unicode_ci and t2 already has the target collation, just convert one side:

sql
ON t1.col COLLATE utf8mb4_0900_ai_ci = t2.col

Core Knowledge Points ​

  • COLLATE = Force specify collation
  • utf8mb4_unicode_ci → Convert to → utf8mb4_0900_ai_ci
  • Write directly after the field name, no CONVERT needed, no subquery needed, no AS needed

One-Sentence Summary ​

field_name COLLATE target_collation

sql
t1.col COLLATE utf8mb4_0900_ai_ci

Common Use Cases ​

Case 1: Different Collations Between Tables ​

sql
-- Table1 uses utf8mb4_unicode_ci
-- Table2 uses utf8mb4_0900_ai_ci
SELECT * 
FROM table1 t1
INNER JOIN table2 t2 
ON t1.code COLLATE utf8mb4_0900_ai_ci = t2.code

Case 2: LEFT JOIN with Collation Conversion ​

sql
SELECT *
FROM users u
LEFT JOIN orders o
ON u.user_code COLLATE utf8mb4_0900_ai_ci = o.user_code

Case 3: Multiple JOIN Conditions ​

sql
SELECT *
FROM table1 t1
JOIN table2 t2 
  ON t1.code COLLATE utf8mb4_0900_ai_ci = t2.code
  AND t1.status = t2.status

Available Collations in MySQL 8.0+ ​

  • utf8mb4_0900_ai_ci - Default for MySQL 8.0+, accent-insensitive, case-insensitive
  • utf8mb4_unicode_ci - Legacy Unicode collation
  • utf8mb4_bin - Binary collation (case-sensitive)
  • utf8mb4_general_ci - Legacy general collation

To check available collations:

sql
SHOW COLLATION LIKE 'utf8mb4%';

Performance Tips ​

  • Converting collation in ON clause may prevent index usage
  • For better performance, consider altering table collation:
    sql
    ALTER TABLE table1 
    MODIFY COLUMN code VARCHAR(255) 
    COLLATE utf8mb4_0900_ai_ci;
  • Use one-side conversion when possible for cleaner queries