Skip to content

Commit 99eae48

Browse files
author
Alexander Barkov
committed
WL#1349 Use operating system localization to send it as a default client character set
1 parent 1b26332 commit 99eae48

19 files changed

+609
-70
lines changed

client/mysql.cc

+8-12
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ static my_bool ignore_errors=0,wait_flag=0,quick=0,
141141
vertical=0, line_numbers=1, column_names=1,opt_html=0,
142142
opt_xml=0,opt_nopager=1, opt_outfile=0, named_cmds= 0,
143143
tty_password= 0, opt_nobeep=0, opt_reconnect=1,
144-
default_charset_used= 0, opt_secure_auth= 0,
144+
opt_secure_auth= 0,
145145
default_pager_set= 0, opt_sigint_ignore= 0,
146146
show_warnings= 0, executing_query= 0, interrupted_query= 0,
147147
ignore_spaces= 0;
@@ -155,7 +155,7 @@ static char * opt_mysql_unix_port=0;
155155
static int connect_flag=CLIENT_INTERACTIVE;
156156
static char *current_host,*current_db,*current_user=0,*opt_password=0,
157157
*current_prompt=0, *delimiter_str= 0,
158-
*default_charset= (char*) MYSQL_DEFAULT_CHARSET_NAME,
158+
*default_charset= (char*) MYSQL_AUTODETECT_CHARSET_NAME,
159159
*opt_init_command= 0;
160160
static char *histfile;
161161
static char *histfile_tmp;
@@ -1581,9 +1581,6 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
15811581
strmake(mysql_charsets_dir, argument, sizeof(mysql_charsets_dir) - 1);
15821582
charsets_dir = mysql_charsets_dir;
15831583
break;
1584-
case OPT_DEFAULT_CHARSET:
1585-
default_charset_used= 1;
1586-
break;
15871584
case OPT_DELIMITER:
15881585
if (argument == disabled_my_option)
15891586
{
@@ -1788,10 +1785,6 @@ static int get_options(int argc, char **argv)
17881785
connect_flag= 0; /* Not in interactive mode */
17891786
}
17901787

1791-
if (strcmp(default_charset, charset_info->csname) &&
1792-
!(charset_info= get_charset_by_csname(default_charset,
1793-
MY_CS_PRIMARY, MYF(MY_WME))))
1794-
exit(1);
17951788
if (argc > 1)
17961789
{
17971790
usage(0);
@@ -2919,7 +2912,6 @@ com_charset(String *buffer __attribute__((unused)), char *line)
29192912
charset_info= new_cs;
29202913
mysql_set_character_set(&mysql, charset_info->csname);
29212914
default_charset= (char *)charset_info->csname;
2922-
default_charset_used= 1;
29232915
put_info("Charset changed", INFO_INFO);
29242916
}
29252917
else put_info("Charset is not found", INFO_INFO);
@@ -4243,8 +4235,9 @@ sql_real_connect(char *host,char *database,char *user,char *password,
42434235
select_limit,max_join_size);
42444236
mysql_options(&mysql, MYSQL_INIT_COMMAND, init_command);
42454237
}
4246-
if (default_charset_used)
4247-
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, default_charset);
4238+
4239+
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, default_charset);
4240+
42484241
if (!mysql_real_connect(&mysql, host, user, password,
42494242
database, opt_mysql_port, opt_mysql_unix_port,
42504243
connect_flag | CLIENT_MULTI_STATEMENTS))
@@ -4259,6 +4252,9 @@ sql_real_connect(char *host,char *database,char *user,char *password,
42594252
}
42604253
return -1; // Retryable
42614254
}
4255+
4256+
charset_info= mysql.charset;
4257+
42624258
connected=1;
42634259
#ifndef EMBEDDED_LIBRARY
42644260
mysql.reconnect= debug_info_flag; // We want to know if this happens

client/mysqladmin.cc

+2-3
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
#define MAX_TRUNC_LENGTH 3
3131

3232
char *host= NULL, *user= 0, *opt_password= 0,
33-
*default_charset= NULL;
33+
*default_charset= (char*) MYSQL_AUTODETECT_CHARSET_NAME;
3434
char truncated_var_names[MAX_MYSQL_VAR][MAX_TRUNC_LENGTH];
3535
char ex_var_names[MAX_MYSQL_VAR][FN_REFLEN];
3636
ulonglong last_values[MAX_MYSQL_VAR];
@@ -348,8 +348,7 @@ int main(int argc,char *argv[])
348348
if (shared_memory_base_name)
349349
mysql_options(&mysql,MYSQL_SHARED_MEMORY_BASE_NAME,shared_memory_base_name);
350350
#endif
351-
if (default_charset)
352-
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, default_charset);
351+
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, default_charset);
353352
error_flags= (myf)(opt_nobeep ? 0 : ME_BELL);
354353

355354
if (sql_connect(&mysql, option_wait))

client/mysqlcheck.c

+8-6
Original file line numberDiff line numberDiff line change
@@ -369,12 +369,15 @@ static int get_options(int *argc, char ***argv)
369369
If there's no --default-character-set option given with
370370
--fix-table-name or --fix-db-name set the default character set to "utf8".
371371
*/
372-
if (!default_charset && (opt_fix_db_names || opt_fix_table_names))
372+
if (!default_charset)
373373
{
374-
default_charset= (char*) "utf8";
374+
if (opt_fix_db_names || opt_fix_table_names)
375+
default_charset= (char*) "utf8";
376+
else
377+
default_charset= (char*) MYSQL_AUTODETECT_CHARSET_NAME;
375378
}
376-
if (default_charset && !get_charset_by_csname(default_charset, MY_CS_PRIMARY,
377-
MYF(MY_WME)))
379+
if (strcmp(default_charset, MYSQL_AUTODETECT_CHARSET_NAME) &&
380+
!get_charset_by_csname(default_charset, MY_CS_PRIMARY, MYF(MY_WME)))
378381
{
379382
printf("Unsupported character set: %s\n", default_charset);
380383
return 1;
@@ -787,8 +790,7 @@ static int dbConnect(char *host, char *user, char *passwd)
787790
if (shared_memory_base_name)
788791
mysql_options(&mysql_connection,MYSQL_SHARED_MEMORY_BASE_NAME,shared_memory_base_name);
789792
#endif
790-
if (default_charset)
791-
mysql_options(&mysql_connection, MYSQL_SET_CHARSET_NAME, default_charset);
793+
mysql_options(&mysql_connection, MYSQL_SET_CHARSET_NAME, default_charset);
792794
if (!(sock = mysql_real_connect(&mysql_connection, host, user, passwd,
793795
NULL, opt_mysql_port, opt_mysql_unix_port, 0)))
794796
{

client/mysqlimport.c

+2-6
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,10 @@ static char *opt_password=0, *current_user=0,
5555
*current_host=0, *current_db=0, *fields_terminated=0,
5656
*lines_terminated=0, *enclosed=0, *opt_enclosed=0,
5757
*escaped=0, *opt_columns=0,
58-
*default_charset= (char*) MYSQL_DEFAULT_CHARSET_NAME;
58+
*default_charset= (char*) MYSQL_AUTODETECT_CHARSET_NAME;
5959
static uint opt_mysql_port= 0, opt_protocol= 0;
6060
static char * opt_mysql_unix_port=0;
6161
static longlong opt_ignore_lines= -1;
62-
static CHARSET_INFO *charset_info= &my_charset_latin1;
6362
#include <sslopt-vars.h>
6463

6564
#ifdef HAVE_SMEM
@@ -282,10 +281,6 @@ static int get_options(int *argc, char ***argv)
282281
fprintf(stderr, "You can't use --ignore (-i) and --replace (-r) at the same time.\n");
283282
return(1);
284283
}
285-
if (strcmp(default_charset, charset_info->csname) &&
286-
!(charset_info= get_charset_by_csname(default_charset,
287-
MY_CS_PRIMARY, MYF(MY_WME))))
288-
exit(1);
289284
if (*argc < 2)
290285
{
291286
usage();
@@ -440,6 +435,7 @@ static MYSQL *db_connect(char *host, char *database,
440435
if (shared_memory_base_name)
441436
mysql_options(mysql,MYSQL_SHARED_MEMORY_BASE_NAME,shared_memory_base_name);
442437
#endif
438+
mysql_options(mysql, MYSQL_SET_CHARSET_NAME, default_charset);
443439
if (!(mysql_real_connect(mysql,host,user,passwd,
444440
database,opt_mysql_port,opt_mysql_unix_port,
445441
0)))

client/mysqlshow.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ static my_bool tty_password= 0, opt_table_type= 0;
3232
static my_bool debug_info_flag= 0, debug_check_flag= 0;
3333
static uint my_end_arg= 0;
3434
static uint opt_verbose=0;
35-
static char *default_charset= (char*) MYSQL_DEFAULT_CHARSET_NAME;
35+
static char *default_charset= (char*) MYSQL_AUTODETECT_CHARSET_NAME;
3636

3737
#ifdef HAVE_SMEM
3838
static char *shared_memory_base_name=0;

configure.in

+2-1
Original file line numberDiff line numberDiff line change
@@ -2031,10 +2031,11 @@ AC_SUBST(MAKE_SHELL)
20312031
AC_CHECK_HEADERS(varargs.h stdarg.h dirent.h locale.h ndir.h sys/dir.h \
20322032
sys/file.h sys/ndir.h sys/ptem.h sys/pte.h sys/select.h sys/stream.h \
20332033
sys/mman.h curses.h termcap.h termio.h termbits.h asm/termbits.h grp.h \
2034-
paths.h semaphore.h)
2034+
paths.h semaphore.h langinfo.h)
20352035

20362036
# Already-done: strcasecmp
20372037
AC_CHECK_FUNCS(lstat putenv select setenv setlocale strcoll tcgetattr)
2038+
AC_CHECK_FUNCS(nl_langinfo)
20382039

20392040
AC_STAT_MACROS_BROKEN
20402041
MYSQL_SIGNAL_CHECK

include/mysql_com.h

+2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
#define NAME_LEN (NAME_CHAR_LEN*SYSTEM_CHARSET_MBMAXLEN)
2828
#define USERNAME_LENGTH (USERNAME_CHAR_LENGTH*SYSTEM_CHARSET_MBMAXLEN)
2929

30+
#define MYSQL_AUTODETECT_CHARSET_NAME "auto"
31+
3032
#define SERVER_VERSION_LENGTH 60
3133
#define SQLSTATE_LENGTH 5
3234

mysql-test/include/default_client.cnf

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#
2+
# We use default-character-set=latin1 to avoid character set auto-detection
3+
# when running tests - not to depend on the current machine localization.
4+
#
5+
6+
[mysql]
7+
default-character-set=latin1
8+
9+
[mysqlshow]
10+
default-character-set=latin1
11+
12+
[mysqlimport]
13+
default-character-set=latin1
14+
15+
[mysqlcheck]
16+
default-character-set=latin1
17+
18+
[mysql_upgrade]
19+
default-character-set=latin1

mysql-test/include/default_my.cnf

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# Use default setting for mysqld processes
22
!include default_mysqld.cnf
3+
!include default_client.cnf
34

45
[mysqld.1]
56

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
SET NAMES utf8;
2+
DROP DATABASE IF EXISTS `ó`;
3+
DROP DATABASE IF EXISTS `Ăł`;
4+
DROP DATABASE IF EXISTS `цЁ`;
5+
DROP DATABASE IF EXISTS `ó`;
6+
7+
ISO8859-1
8+
@@character_set_client
9+
latin1
10+
Database: ó
11+
+--------+
12+
| Tables |
13+
+--------+
14+
+--------+
15+
16+
ISO8859-2
17+
@@character_set_client
18+
latin2
19+
Database: ó
20+
+--------+
21+
| Tables |
22+
+--------+
23+
+--------+
24+
25+
KOI8-R
26+
@@character_set_client
27+
koi8r
28+
Database: ó
29+
+--------+
30+
| Tables |
31+
+--------+
32+
+--------+
33+
34+
UTF-8
35+
@@character_set_client
36+
utf8
37+
Database: ó
38+
+--------+
39+
| Tables |
40+
+--------+
41+
+--------+
42+
Database: ó
43+
+--------+
44+
| Tables |
45+
+--------+
46+
+--------+
47+
Database: Ăł
48+
+--------+
49+
| Tables |
50+
+--------+
51+
+--------+
52+
Database: цЁ
53+
+--------+
54+
| Tables |
55+
+--------+
56+
+--------+
57+
SHOW DATABASES LIKE 'ó';
58+
Database (ó)
59+
ó
60+
SHOW DATABASES LIKE 'Ăł';
61+
Database (Ăł)
62+
Ăł
63+
SHOW DATABASES LIKE 'цЁ';
64+
Database (цЁ)
65+
цЁ
66+
SHOW DATABASES LIKE 'ó';
67+
Database (ó)
68+
ó
69+
DROP DATABASE `ó`;
70+
DROP DATABASE `Ăł`;
71+
DROP DATABASE `цЁ`;
72+
DROP DATABASE `ó`;

mysql-test/suite/federated/my.cnf

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# Use default setting for mysqld processes
22
!include include/default_mysqld.cnf
3+
!include include/default_client.cnf
34

45
[mysqld.1]
56
log-bin= master-bin

mysql-test/suite/ndb/my.cnf

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
!include include/default_mysqld.cnf
22
!include include/default_ndbd.cnf
3+
!include include/default_client.cnf
34

45
[cluster_config.1]
56
NoOfReplicas= 2

mysql-test/suite/rpl/my.cnf

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Use settings from rpl_1slave_base.cnf
22
# add setting to connect the slave to the master by default
33
!include rpl_1slave_base.cnf
4+
!include include/default_client.cnf
45

56
[mysqld.2]
67
# Hardcode the host to 127.0.0.1 until running on more

mysql-test/suite/rpl/rpl_1slave_base.cnf

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# Use default setting for mysqld processes
22
!include include/default_mysqld.cnf
3+
!include include/default_client.cnf
34

45
[mysqld.1]
56

mysql-test/suite/rpl_ndb/my.cnf

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
!include include/default_mysqld.cnf
22
!include include/default_ndbd.cnf
3+
!include include/default_client.cnf
34

45
[cluster_config.1]
56
NoOfReplicas= 2

0 commit comments

Comments
 (0)