I want to insert arabic data that contains diacritics in my database but I got
this exception
I have already added this to the my.ini file
[client] default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
and I also added this to my hibernate.cfg.xml
<property name="hibernate.connection.properties">useUnicode=yes;
characterEncoding=utf8;
</property>
<property name="hibernate.connection.useUnicode">true</property>
<property name="hibernate.connection.characterEncoding">utf-8</property>
but in vain
In my case. I used to set the coding to utf-8. my.ini file has the following config
[client]
default-character-set = utf8
[mysql]
default-character-set = utf8
[mysqld]
character-set-server = utf8
collation-server = utf8_unicode_ci
I use the following url
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false
cloud work fine.
Related
I have mysql server 8.0.21 with configuration
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server utf8
character_set_system utf8
And a table with charset utf8mb4
CREATE TABLE `test` (`c0` TEXT) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
This code is working with mysql-connector-java 5.1.18
Connection conn = DriverManager.getConnection("jdbc:mysql://hostxxxx/test?" +
"user=userxxx&password=passxxx");
String sql = "INSERT INTO test(c0) value ('🚘💕🚘💕🚘')";
conn.createStatement().execute(sql)
But when I use mysql-connector-java-5.1.44 (or higher) -> get the error java.io.IOException: Incorrect string value: '\xF0\x9F\x9A\x98\xF0\x9F...'
I am able to get this code to work with version 5.1.44++ by changing the server config character_set_server to utf8mb4, But because backward compatible, I could not change it
Anyone know how this code working with the old version (mysql-connector-java-5.1.18) but not work with the version (5.1.44 and later)
I found some related topics to this error but could not resolve my issue
I've been working with a UTF-8 encoded MySQL DB that now needs to be able to store 4-byte emojis, so I decided to change from utf8 encoding to utf8mb4:
ALTER DATABASE bstdb CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE HISTORY CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE HISTORY CHANGE SOURCE_CONTEXT SOURCE_CONTEXT VARCHAR(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
And changed mysql.conf.d "character-set-server = utf8" to "character-set-server = utf8mb4"
After these steps, I am able to store emojis (as 💢),but only when the SQL query is executed in the MySQL console: When I try to launch the query from MySQL Workbench or from a Wildfly webapp, I am getting this error:
Error Code: 1366. Incorrect string value: '\xF0\x9F\x92\xA2' for column 'SOURCE_CONTEXT' at row 1
I assume I need to change the way the clients are connecting to the DB, but I have no clue on how. I've read something on using "useUnicode=yes" in JDBC, but does not work.
${bdpath:3306/bstdb?useUnicode=yes}
Edit:
As suggested in comments, I tried with:
${bdpath:3306/bstdb?characterEncoding=UTF-8}
but no luck, I am getting the same "Incorrect string value: '\xF0\x9F\x92\xA2'" error.
Also tried
${bdpath:3306/bstdb?useUnicode=true&characterEncoding=utf8mb4&}
but it refuses to stablish a connection.
Any idea on how to configure MySQL workbench and/or JDBC/Wildfly?
MySQL version is 5.7.18
MySQL WorkBench version is 6.0.8
JDBC driver version is 5.1.34
Thanks!
Use characterEncoding=utf8 for jdbc url
jdbc:mysql://x.x.x.x:3306/db?useUnicode=true&characterEncoding=utf8
Also check that you have configured MySQL to work with utf8mb4
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
See here
Starting from MySQL Connector/J 5.1.47,
When UTF-8 is used for characterEncoding in the connection string, it maps to the MySQL character set name utf8mb4.
You can check docs here
Finally, it works. It was an issue with stored procedures, that was still utf8 instead of utf8mb4 after the migration.
It was a 2-steps solution.
As suggested by #mike-adamenko set my.cnf to have the following
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
Execute in mysql:
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
Drop procedures involved, and create them again. They will be in utf8mb4.
Can be checked with
SHOW PROCEDURE STATUS where name LIKE 'procedure_name';
You can follow the documentation available for MySQL to resolve your problem. Here's the MySQL documentation, that you could refer to.
Basically, your ALTER TABLE scripts can be changed as per the documentation mentioned above and then you could use the following parameter in your connection string for the changes to take effect.
jdbc:mysql://localhost/yourdatabasename?useUnicode=true&characterEncoding=UTF-8
Please don't forget to restart your MySQL services after making the character set and the encoding changes.
I have a column in the database which has been defined as follows in the entity class:
#Column(name="lastlogindate", columnDefinition ="TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
private Timestamp lastlogindate;
The create table command that is being generated is as follows:
create table usermaster (
lastlogindate `TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`)
while what works is
create table usermaster (
lastlogindate TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)
Hibernate reports the following error while creating tables:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
Unable to understand why extra ticks are being added and how to avoid it.
The version details are as follows:
HIBERNATE VERSION: 4.3.8.Final
MySQL version:5.6.26
MySQL Dialect information:
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="transaction.factory_class">
org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="current_session_context_class">thread</property>
<property name="show_sql">true</property>
<property name="hibernate.connection.autocommit ">false</property>
<property name="hibernate.globally_quoted_identifiers">true</property>
Please remove the following config line:
<property name="hibernate.globally_quoted_identifiers">true</property>
This is likely not needed and almost surely causing the problem you experience.
UPDATE:
The issue was finally solved by changing the dialect to MySQL5 from generic MySQL:
org.hibernate.dialect.MySQL5Dialect
I have this user_model.java below:
public class User_Model implements Serializable {
#Id #GeneratedValue
private Long id;
#ColumnTransformer(
read="AES_DECRYPT(username, 'Hf7p4u6e') USING utf8))",
write="AES_ENCRYPT(?, 'Hf7p4u6e')")
The above code is working when I remove USING utf8) but when I put it again I get this error
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.USING user_mo0_.UTF-8).
I don't want to remove the utf8 because I used it for korean language.
I also put a utf8 setting in my hibernate.xml
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydb?UseUnicode=true&characterEncoding=utf8</property>
<property name="hibernate.connection.CharSet">utf8</property>
<property name="hibernate.connection.characterEncoding">utf8</property>
<property name="hibernate.connection.useUnicode">true</property>
But still, it's not work at all.How can I make my query work? any help
Two things:
Maybe you ned to use 'USING utf8' with CONVERT function (https://dev.mysql.com/doc/refman/5.0/en/charset-convert.html)
CONVERT(_latin1 AES_DECRYPT(username, 'Hf7p4u6e') USING utf8)
utf8 has nothing to do with your already created tables if they are not in UTF-8. This only forces newly created tables to use UTF-8. Existing tables remain as they are.
I m having a tomcat server having a connection pool to mysql.
In the connection settings i can see all the character set encodings set to utf8mb4 in *this page except for character_set_results.
My connection string being -
jdbc:mysql://:3306/abc?character_set_server=utf8mb4&useOldAliasMetadataBehavior=true&character_set_connection=utf8mb4&characterEncoding=utf-8&character_set_results=utf8mb4
In the mysql server i can see character_set_results showing utf8mb4.
But in the jsp page it is not shown anyway.
The mysql version is 5.6.16 and connector version is 5.1.22
Regards
connection settings need not characterEncoding and character_set_server, mysql connectorJ will auto check.
make sure character_set_database=utf8mb4,character_set_server=utf8mb4,
Table character set=utf8mb4, some columns use varchar character set=utf8mb4;
tip: character_set_server=utf8mb4 need config my.ini
Exemple:
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
loose-default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
loose-default-character-set = utf8mb4
https://dev.mysql.com/doc/refman/5.6/en/charset-unicode-utf8mb4.html?spm=5176.2020520165.110.53.AlPmXp