why mysql execute sql need convert character set several times - mysql

I mean that when the Mysql excute a sql,the fist step is to convert character_set_client to character_set_connection, then character_set_connection will be converted to a specific character_set(beside on table character set)。
mysql execute sql need convert character set several times, why it is designed like this.

Related

MySQL error 3988 Conversion from collation utf8mb4_general_ci into latin1_swedish_ci impossible for parameter

I am getting this error when doing a big insert query into a table on MySQL 8:
Error 3988: Conversion from collation utf8mb4_general_ci into latin1_swedish_ci impossible for parameter
The data originally comes from a table with the utf8mb4 character set and then after processing it is inserted into a table with the latin1 character set.
It's getting stuck on this two-byte character: ż.
Is there an easy way for me to get MySQL to replace or strip out these characters, or a way for me to sanitise the input without sacrificing characters like ä which it seems to be able to handle?
If you use PHP framework like Laravel try to find file called database.php in config directory anf change mysql configs to latin1_swedish_ci

Save emojis to MYSQL DB

I am trying to save emojis to my MYSQL database, I have followed these steps
3 STEPS
ALTER TABLE TABLE CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE COLUMN modify Comment text charset utf8mb4;
SET NAMES utf8mb4;
From the above steps I am able save emojis to DB, but after some time I am not able to see those again, I have to execute the following command
SET NAMES utf8mb4;
Then it works
Is it nessary to use the following statement?
SET NAMES utf8mb4;
Can't we have a permanent fix or way to this?
The reason that you have to execute the SET NAMES again sometimes, is that the command only modifies configuration for the current session.
According to the documentation:
13.7.5.3 SET NAMES Syntax
This statement sets the three session system variables character_set_client, character_set_connection, and character_set_results to the given character set.
If you want to permanently set it you need to set define it when the mysql service starts, or add it to your MySQL conf file.
Check out https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html
Alternatively (depending on which MySQL client you use for node) you might be able to define the connection character set directly from your client.

What happens when SET NAMES does not match a table's character set?

I have a database with tables set as CHARACTER SET=utf8mb4, however I've discovered that the mysql connection (SET NAMES) has been latin1.
My questions are:
What happens to that data? Has MySQL been converting it to utf8mb4 to store it, or has it stored the data as latin1?
If I need to convert it, should I connect as SET NAMES latin1 to take the data out, convert it, and put it back in, or connect as utf8mb4 to pull the data out?
Data is stored in the character set defined in the table, so in your case all the data will be stored in utf8mb4.
Every connection to the database uses a character set for sending and receiving data. That character set might be different, so mysql converts between the storage character set and the connection character set.
So, to answer your questions:
1) mysql converts it.
2) you don't need to convert it. But you need to make sure that if you use set names, you actually are sending data using the character set you claim.
More here: http://dev.mysql.com/doc/refman/5.7/en/charset-connection.html

How to save a Chinese character 𥚃 in MySQL

I am unable to save the character 𥚃 on mySQL 5.5. I have tried collation utf8mb4 and utf32. I have to store both Chinese and English characters in the same table.
I was able to save this charecter by using utf8mb4 charecterset on mysql server. So the output of show variables like 'char%'; should be all utf8mb4 except for perhaps system charset.
Try utf8 general, and also, don't change to execute
SET NAMES utf8;
beore the actual query, which is quite an important part

import utf-8 mysqldump to latin1 database

I have a dump file of a phpnuke site somehow in utf8. I'm trying to reopen this site on a new server. But nuke uses latin1.
I need a way to create a latin1 database using this utf-8 dump file.
I tried everything I could think of. iconv, mysql replace, php replace...
Add the SET NAMES 'utf8'; statement at the beginning of your dump.
This will indicate to MySQL that the commands it is about to receive are in UTF8.
It will store the data in whatever character set your tables are currently set in; in this case if your database is in latin1, data will be stored in latin1.
From http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html:
SET NAMES indicates what character set the client will use to send SQL statements to the server. Thus, SET NAMES 'cp1251' tells the server, “future incoming messages from this client are in character set cp1251.” It also specifies the character set that the server should use for sending results back to the client. (For example, it indicates what character set to use for column values if you use a SELECT statement.)
One last thing is that latin1 has much less characters available than utf8. For anything other than the western European languages, you will lose data.
For instance, assuming column test is latin1. The first entry will appear correctly (the French accent is within latin1); however the second entry in Korean will show as question marks.
SET NAMES 'utf8';
INSERT INTO TESTME(test) VALUES ('Bienvenue sur Wikipédia');
INSERT INTO TESTME(test) VALUES ('한국어 위키백과에 오신 것을 환영합니다!');