[MySQL 调试] 编译mysqld缺少gb2312的问题

最近在安装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改成大写就可以验证了。

 

 

原创文章,转载请注明: 转载自Simple Life

本文链接地址: [MySQL 调试] 编译mysqld缺少gb2312的问题

Post Footer automatically generated by wp-posturl plugin for wordpress.


Comments

Leave a Reply

Your email address will not be published. Name and email are required


Current month ye@r day *