waker问:“character_set_client 这个东西根据什么来的?”
版本:mysql5.6.35
先给答案:mysql命令行里,如果没有显示的指定,默认是latin1
使用gbd跟踪mysql的client,发现是:
2209 static int
2210 mysql_autodetect_character_set(MYSQL *mysql)
2211 {
2212 const char *csname= MYSQL_DEFAULT_CHARSET_NAME; --注意这里
2213
2214 #ifdef __WIN__
2215 char cpbuf[64];
2216 {
2217 my_snprintf(cpbuf, sizeof(cpbuf), "cp%d", (int) GetConsoleCP());
2218 csname= my_os_charset_to_mysql_charset(cpbuf);
2219 }
2220 #elif defined(HAVE_SETLOCALE) && defined(HAVE_NL_LANGINFO)
2221 {
2222 if (setlocale(LC_CTYPE, "") && (csname= nl_langinfo(CODESET)))
2223 csname= my_os_charset_to_mysql_charset(csname);
2224 }
2225 #endif
2226
2227 if (mysql->options.charset_name)
2228 my_free(mysql->options.charset_name);
2229 if (!(mysql->options.charset_name= my_strdup(csname, MYF(MY_WME))))
2230 return 1;
2231 return 0;
2232 }
在这个函数里设置的, sql-common/client.c 第2210行,
MYSQL_DEFAULT_CHARSET_NAME 是一个宏, 在include/config.h 552 行
551 /* Character sets and collations */
552 #define MYSQL_DEFAULT_CHARSET_NAME "latin1"
也就是说这个版本的mysql里默认的字符集就是 latin1, 是写死的。
8.0里是
/*
* Character sets
*/
#define MYSQL_DEFAULT_CHARSET_NAME "utf8mb4"
调用栈的情况:
(gdb) bt
#0 mysql_autodetect_character_set (mysql=0xa344c0) at /data/mysql-5.6.35/sql-common/client.c:2212
#1 0x000000000041d041 in mysql_init_character_set (mysql=0xa344c0)
at /data/mysql-5.6.35/sql-common/client.c:2278
#2 0x0000000000423a50 in mysql_set_character_set (mysql=0xa344c0, cs_name=0x5072da "auto")
at /data/mysql-5.6.35/sql-common/client.c:4784
#3 0x0000000000414d14 in sql_real_connect (host=0x0, database=0x0, user=0xa413d0 "root", password=0x0,
silent=0) at /data/mysql-5.6.35/client/mysql.cc:4775
#4 0x0000000000414f72 in sql_connect (host=0x0, database=0x0, user=0xa413d0 "root", password=0x0,
silent=0) at /data/mysql-5.6.35/client/mysql.cc:4889
#5 0x000000000040cbf5 in main (argc=3, argv=0xa412a0) at /data/mysql-5.6.35/client/mysql.cc:1287