编译MySQL缺少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改成大写就可以验证了。

转载于:https://my.oschina.net/sansom/blog/171310

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值