最近在安装Percona5.5.18版本MySQL时,发现字符集不全,编译参数如下
CFLAGS=”-O3 -g -fno-exceptions -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing”
CXX=gcc
CXXFLAGS=”-O3 -g -fno-exceptions -fno-rtti -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing”
export CFLAGS CXX CXXFLAGS
cmake . \
-DCMAKE_BUILD_TYPE:STRING=Release \
-DSYSCONFDIR:PATH=%{_prefix} \
-DCMAKE_INSTALL_PREFIX:PATH=%{_prefix} \
-DENABLED_PROFILING:BOOL=ON \
-DENABLE_DEBUG_SYNC:BOOL=OFF \
-DMYSQL_DATADIR:PATH=%{_prefix}/data \
-DMYSQL_MAINTAINER_MODE:BOOL=OFF \
-DWITH_EXTRA_CHARSETS:STRING=all \
-DWITH_BIG_TABLES:BOOL=ON \
-DWITH_FAST_MUTEXES:BOOL=ON \
-DENABLE-PROFILING:BOOL=ON \
-DWITH_SSL:STRING=bundled \
-DWITH_UNIT_TESTS:BOOL=OFF \
-DWITH_ZLIB:STRING=bundled \
-DWITH_PARTITION_STORAGE_ENGINE:BOOL=ON \
-DWITH_PLUGINS=heap,csv,partition,innodb_plugin,myisam \
-DDEFAULT_CHARSET=gbk -DDEFAULT_COLLATION=gbk_chinese_ci -DWITH_EXTRA_CHARSETS=ALL \
-DENABLED_ASSEMBLER:BOOL=ON \
-DENABLED_LOCAL_INFILE:BOOL=ON \
-DENABLED_THREAD_SAFE_CLIENT:BOOL=ON \
-DENABLED_EMBEDDED_SERVER:BOOL=OFF \
-DWITH_CLIENT_LDFLAGS:STRING=all-static \
-DINSTALL_LAYOUT:STRING=STANDALONE \
-DCOMMUNITY_BUILD:BOOL=ON;
字符集只包含28个,而我们常用的gb2312并不在其中
在上述编译选项中,-DWITH_EXTRA_CHARSETS被定义了两次,这显然是当初设定编译参数的失误:
-DWITH_EXTRA_CHARSETS:STRING=all 和 -DWITH_EXTRA_CHARSETS=ALL
尝试把第二个-DWITH_EXTRA_CHARSETS=ALL去掉,这次包含全部字符集,有39个字符集
尝试把第二个修改为-DWITH_EXTRA_CHARSETS=all,同样为39个
怀疑跟大小写有关,于是把第二个去掉,把第一个修改为-DWITH_EXTRA_CHARSETS:STRING=ALL,这时候只剩下28个字符集了。
因此可以验证,在编译Percona5.5.18时,需要指定-DWITH_EXTRA_CHARSETS:STRING为小写的all,才能编译所有的字符集。
那么为什么会出现这种情况呢?因为在cmake文件里,编译时只匹配了complex和all两个变量,都是小写的。
字符集的编译定义在文件 cmake/character_sets.cmake中
IF(WITH_EXTRA_CHARSETS MATCHES “complex”)
SET(CHARSETS ${CHARSETS} ${CHARSETS_COMPLEX})
ELSEIF(WITH_EXTRA_CHARSETS MATCHES “all”)
SET(CHARSETS ${CHARSETS} ${CHARSETS_AVAILABLE})
ENDIF()
也就是说,只有当匹配all时,才会包含${CHARSETS_AVAILABLE}里定义的所有字符集
证明也很简单,把上面cmake文件中的小写all改成大写就可以验证了。