mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 13:32:33 +01:00
ed1696f6b9
we store 7 bytes (1 + 2*3) in every Query_log_event. In the future if users want binlog optimized for small size and less safe, we could add --binlog-no-charset (and binlog-no-sql-mode etc): charset info is something by design optional (even if for now we don't offer possibility to disable it): it's not a binlog format change. We try to reduce the number of get_charset() calls in the slave SQL thread to a minimum by caching the charset read from the previous event (which will often be equal to the one of the current event). We don't use SET ONE_SHOT for charset-aware repl (we still do for timezones, will be fixed later). No more errors if one changes the global value of charset vars on master or slave (as we log charset info in all Query_log_event). Not fixing Load_log_event as it will be rewritten soon by Dmitri. Testing how mysqlbinlog behaves in rpl_charset.test. mysqlbinlog needs to know where charset file is (to be able to convert a charset number found in binlog (e.g. in User_var_log_event) to a charset name); mysql-test-run needs to pass the correct value for this option to mysqlbinlog. Many result udpates (adding charset info into every event shifts log_pos in SHOW BINLOG EVENTS). Roughly the same job is to be done for timezones :)
247 lines
9.1 KiB
Text
247 lines
9.1 KiB
Text
stop slave;
|
||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||
reset master;
|
||
reset slave;
|
||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||
start slave;
|
||
set timestamp=1000000000;
|
||
drop database if exists mysqltest2;
|
||
drop database if exists mysqltest3;
|
||
create database mysqltest2 character set latin2;
|
||
set @@character_set_server=latin5;
|
||
create database mysqltest3;
|
||
|
||
--- --master--
|
||
show create database mysqltest2;
|
||
Database Create Database
|
||
mysqltest2 CREATE DATABASE `mysqltest2` /*!40100 DEFAULT CHARACTER SET latin2 */
|
||
show create database mysqltest3;
|
||
Database Create Database
|
||
mysqltest3 CREATE DATABASE `mysqltest3` /*!40100 DEFAULT CHARACTER SET latin5 */
|
||
|
||
--- --slave--
|
||
show create database mysqltest2;
|
||
Database Create Database
|
||
mysqltest2 CREATE DATABASE `mysqltest2` /*!40100 DEFAULT CHARACTER SET latin2 */
|
||
show create database mysqltest3;
|
||
Database Create Database
|
||
mysqltest3 CREATE DATABASE `mysqltest3` /*!40100 DEFAULT CHARACTER SET latin5 */
|
||
set @@collation_server=armscii8_bin;
|
||
drop database mysqltest3;
|
||
create database mysqltest3;
|
||
|
||
--- --master--
|
||
show create database mysqltest3;
|
||
Database Create Database
|
||
mysqltest3 CREATE DATABASE `mysqltest3` /*!40100 DEFAULT CHARACTER SET armscii8 COLLATE armscii8_bin */
|
||
|
||
--- --slave--
|
||
show create database mysqltest3;
|
||
Database Create Database
|
||
mysqltest3 CREATE DATABASE `mysqltest3` /*!40100 DEFAULT CHARACTER SET armscii8 COLLATE armscii8_bin */
|
||
use mysqltest2;
|
||
create table t1 (a int auto_increment primary key, b varchar(100));
|
||
set character_set_client=cp850, collation_connection=latin2_croatian_ci;
|
||
insert into t1 (b) values(@@character_set_server);
|
||
insert into t1 (b) values(@@collation_server);
|
||
insert into t1 (b) values(@@character_set_client);
|
||
insert into t1 (b) values(@@character_set_connection);
|
||
insert into t1 (b) values(@@collation_connection);
|
||
|
||
--- --master--
|
||
select * from t1 order by a;
|
||
a b
|
||
1 armscii8
|
||
2 armscii8_bin
|
||
3 cp850
|
||
4 latin2
|
||
5 latin2_croatian_ci
|
||
|
||
--- --slave--
|
||
select * from mysqltest2.t1 order by a;
|
||
a b
|
||
1 armscii8
|
||
2 armscii8_bin
|
||
3 cp850
|
||
4 latin2
|
||
5 latin2_croatian_ci
|
||
set character_set_client=latin1, collation_connection=latin1_german1_ci;
|
||
truncate table t1;
|
||
insert into t1 (b) values(@@collation_connection);
|
||
insert into t1 (b) values(LEAST("M<>ller","Muffler"));
|
||
set collation_connection=latin1_german2_ci;
|
||
insert into t1 (b) values(@@collation_connection);
|
||
insert into t1 (b) values(LEAST("M<>ller","Muffler"));
|
||
|
||
--- --master--
|
||
select * from t1 order by a;
|
||
a b
|
||
1 latin1_german1_ci
|
||
2 Muffler
|
||
3 latin1_german2_ci
|
||
4 M<>ller
|
||
|
||
--- --slave--
|
||
select * from mysqltest2.t1 order by a;
|
||
a b
|
||
1 latin1_german1_ci
|
||
2 Muffler
|
||
3 latin1_german2_ci
|
||
4 M<>ller
|
||
set @a= _cp850 'M<>ller' collate cp850_general_ci;
|
||
truncate table t1;
|
||
insert into t1 (b) values(collation(@a));
|
||
|
||
--- --master--
|
||
select * from t1 order by a;
|
||
a b
|
||
1 cp850_general_ci
|
||
|
||
--- --slave--
|
||
select * from mysqltest2.t1 order by a;
|
||
a b
|
||
1 cp850_general_ci
|
||
drop database mysqltest2;
|
||
drop database mysqltest3;
|
||
show binlog events from 95;
|
||
Log_name Pos Event_type Server_id End_log_pos Info
|
||
master-bin.000001 # Query 1 # drop database if exists mysqltest2
|
||
master-bin.000001 # Query 1 # drop database if exists mysqltest3
|
||
master-bin.000001 # Query 1 # create database mysqltest2 character set latin2
|
||
master-bin.000001 # Query 1 # create database mysqltest3
|
||
master-bin.000001 # Query 1 # drop database mysqltest3
|
||
master-bin.000001 # Query 1 # create database mysqltest3
|
||
master-bin.000001 # Query 1 # use `mysqltest2`; create table t1 (a int auto_increment primary key, b varchar(100))
|
||
master-bin.000001 # Intvar 1 # INSERT_ID=1
|
||
master-bin.000001 # Query 1 # use `mysqltest2`; insert into t1 (b) values(@@character_set_server)
|
||
master-bin.000001 # Intvar 1 # INSERT_ID=2
|
||
master-bin.000001 # Query 1 # use `mysqltest2`; insert into t1 (b) values(@@collation_server)
|
||
master-bin.000001 # Intvar 1 # INSERT_ID=3
|
||
master-bin.000001 # Query 1 # use `mysqltest2`; insert into t1 (b) values(@@character_set_client)
|
||
master-bin.000001 # Intvar 1 # INSERT_ID=4
|
||
master-bin.000001 # Query 1 # use `mysqltest2`; insert into t1 (b) values(@@character_set_connection)
|
||
master-bin.000001 # Intvar 1 # INSERT_ID=5
|
||
master-bin.000001 # Query 1 # use `mysqltest2`; insert into t1 (b) values(@@collation_connection)
|
||
master-bin.000001 # Query 1 # use `mysqltest2`; truncate table t1
|
||
master-bin.000001 # Intvar 1 # INSERT_ID=1
|
||
master-bin.000001 # Query 1 # use `mysqltest2`; insert into t1 (b) values(@@collation_connection)
|
||
master-bin.000001 # Intvar 1 # INSERT_ID=2
|
||
master-bin.000001 # Query 1 # use `mysqltest2`; insert into t1 (b) values(LEAST("M<>ller","Muffler"))
|
||
master-bin.000001 # Intvar 1 # INSERT_ID=3
|
||
master-bin.000001 # Query 1 # use `mysqltest2`; insert into t1 (b) values(@@collation_connection)
|
||
master-bin.000001 # Intvar 1 # INSERT_ID=4
|
||
master-bin.000001 # Query 1 # use `mysqltest2`; insert into t1 (b) values(LEAST("M<>ller","Muffler"))
|
||
master-bin.000001 # Query 1 # use `mysqltest2`; truncate table t1
|
||
master-bin.000001 # Intvar 1 # INSERT_ID=1
|
||
master-bin.000001 # User var 1 # @`a`=_cp850 0x4DFC6C6C6572 COLLATE cp850_general_ci
|
||
master-bin.000001 # Query 1 # use `mysqltest2`; insert into t1 (b) values(collation(@a))
|
||
master-bin.000001 # Query 1 # drop database mysqltest2
|
||
master-bin.000001 # Query 1 # drop database mysqltest3
|
||
set global character_set_server=latin2;
|
||
set global character_set_server=latin1;
|
||
set global character_set_server=latin2;
|
||
set global character_set_server=latin1;
|
||
set one_shot @@character_set_server=latin5;
|
||
set @@max_join_size=1000;
|
||
select @@character_set_server;
|
||
@@character_set_server
|
||
latin5
|
||
select @@character_set_server;
|
||
@@character_set_server
|
||
latin1
|
||
set @@character_set_server=latin5;
|
||
select @@character_set_server;
|
||
@@character_set_server
|
||
latin5
|
||
select @@character_set_server;
|
||
@@character_set_server
|
||
latin5
|
||
set one_shot max_join_size=10;
|
||
ERROR HY000: The 'SET ONE_SHOT' syntax is reserved for purposes internal to the MySQL server
|
||
set character_set_client=9999999;
|
||
ERROR 42000: Unknown character set: '9999999'
|
||
set collation_server=9999998;
|
||
ERROR HY000: Unknown collation: '9999998'
|
||
use test;
|
||
CREATE TABLE t1 (c1 VARBINARY(255), c2 VARBINARY(255));
|
||
SET CHARACTER_SET_CLIENT=koi8r,
|
||
CHARACTER_SET_CONNECTION=cp1251,
|
||
CHARACTER_SET_RESULTS=koi8r;
|
||
INSERT INTO t1 (c1, c2) VALUES ('<27><>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>','<27><>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>');
|
||
select hex(c1), hex(c2) from t1;
|
||
hex(c1) hex(c2)
|
||
CDF32C20E7E020F0FBE1E0EBEAF3 CDF32C20E7E020F0FBE1E0EBEAF3
|
||
select hex(c1), hex(c2) from t1;
|
||
hex(c1) hex(c2)
|
||
CDF32C20E7E020F0FBE1E0EBEAF3 CDF32C20E7E020F0FBE1E0EBEAF3
|
||
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
|
||
SET TIMESTAMP=1000000000;
|
||
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1;
|
||
SET @@session.sql_mode=0;
|
||
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8;
|
||
drop database if exists mysqltest2;
|
||
SET TIMESTAMP=1000000000;
|
||
drop database if exists mysqltest3;
|
||
SET TIMESTAMP=1000000000;
|
||
create database mysqltest2 character set latin2;
|
||
SET TIMESTAMP=1000000000;
|
||
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=30;
|
||
create database mysqltest3;
|
||
SET TIMESTAMP=1000000000;
|
||
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=64;
|
||
drop database mysqltest3;
|
||
SET TIMESTAMP=1000000000;
|
||
create database mysqltest3;
|
||
use mysqltest2;
|
||
SET TIMESTAMP=1000000000;
|
||
create table t1 (a int auto_increment primary key, b varchar(100));
|
||
SET INSERT_ID=1;
|
||
SET TIMESTAMP=1000000000;
|
||
SET @@session.character_set_client=4,@@session.collation_connection=27,@@session.collation_server=64;
|
||
insert into t1 (b) values(@@character_set_server);
|
||
SET INSERT_ID=2;
|
||
SET TIMESTAMP=1000000000;
|
||
insert into t1 (b) values(@@collation_server);
|
||
SET INSERT_ID=3;
|
||
SET TIMESTAMP=1000000000;
|
||
insert into t1 (b) values(@@character_set_client);
|
||
SET INSERT_ID=4;
|
||
SET TIMESTAMP=1000000000;
|
||
insert into t1 (b) values(@@character_set_connection);
|
||
SET INSERT_ID=5;
|
||
SET TIMESTAMP=1000000000;
|
||
insert into t1 (b) values(@@collation_connection);
|
||
SET TIMESTAMP=1000000000;
|
||
SET @@session.character_set_client=8,@@session.collation_connection=5,@@session.collation_server=64;
|
||
truncate table t1;
|
||
SET INSERT_ID=1;
|
||
SET TIMESTAMP=1000000000;
|
||
insert into t1 (b) values(@@collation_connection);
|
||
SET INSERT_ID=2;
|
||
SET TIMESTAMP=1000000000;
|
||
insert into t1 (b) values(LEAST("M<>ller","Muffler"));
|
||
SET INSERT_ID=3;
|
||
SET TIMESTAMP=1000000000;
|
||
SET @@session.character_set_client=8,@@session.collation_connection=31,@@session.collation_server=64;
|
||
insert into t1 (b) values(@@collation_connection);
|
||
SET INSERT_ID=4;
|
||
SET TIMESTAMP=1000000000;
|
||
insert into t1 (b) values(LEAST("M<>ller","Muffler"));
|
||
SET TIMESTAMP=1000000000;
|
||
truncate table t1;
|
||
SET INSERT_ID=1;
|
||
SET @`a`:=_cp850 0x4DFC6C6C6572 COLLATE `cp850_general_ci`;
|
||
SET TIMESTAMP=1000000000;
|
||
insert into t1 (b) values(collation(@a));
|
||
SET TIMESTAMP=1000000000;
|
||
drop database mysqltest2;
|
||
SET TIMESTAMP=1000000000;
|
||
drop database mysqltest3;
|
||
use test;
|
||
SET TIMESTAMP=1000000000;
|
||
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=30;
|
||
CREATE TABLE t1 (c1 VARBINARY(255), c2 VARBINARY(255));
|
||
SET TIMESTAMP=1000000000;
|
||
SET @@session.character_set_client=7,@@session.collation_connection=51,@@session.collation_server=30;
|
||
INSERT INTO t1 (c1, c2) VALUES ('<27><>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>','<27><>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>');
|
||
drop table t1;
|