I need to be able to store characters like \xF0\x9F\x94\xA5
in my database, which, according to this post need UTF8mb4
encoding.
So I set up my database with
CREATE DATABASE `myDB` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
and verified in the MySQL shell if it was effective:
SHOW FULL COLUMNS FROM myTable;
+---------+------------------+--------------------+----
| Field | Type | Collation | ...
+---------+------------------+--------------------+-----
| id | int(10) unsigned | NULL | ...
| myColumn| text | utf8mb4_general_ci | ...
+---------+------------------+--------------------+-----
So far so good.
After running my program, I got this Exception:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'like'
Error Code: 1267
For the record: I am using the Java Persistency API (JPA) in my webapplication with GlassFish 3.1. The Exception
gets thrown when executing a named query:
@NamedQuery(name = "myTable.findByMyColumn", query = "SELECT c FROM myTable c WHERE c.myColumn LIKE :myColumn")
However, it appears that the error only occurs when the queried String actually contains those weired emoji characters (\xF0\x9F\x94\xA5
)
Call: SELECT id, myColumn FROM myDB.myTable WHERE myColumn LIKE ?
bind => [Something something Lorem Ipsum
You do not need any change in the Java side, as
utf8mb4
is justUTF-8
in Java.Instead, as you can see here:
your connection setting is still
utf8_general_ci
; to set it at the connection level, one option is to execute the (mysql specific) query:before any attempt to use the utf8mb4 collation; or, generally for the mysql server, in
/etc/my.cnf
:Another option without changing the connection string, is using a jdbc driver version >= 5.1.13: http://www.opensubscriber.com/message/java@lists.mysql.com/14151747.html