编译MariaDB 10.5.19调试版后ASCII字符集缺失问题求助
我正在开发MariaDB专属插件,需使用10.5.19版本的调试模式,但插件依赖的ASCII字符集在通过./BUILD/compiling-pentium64-debug脚本编译调试版后消失——标准二进制版本执行show character set;能正常看到ASCII字符集,调试版则没有。
无调试选项环境执行结果
Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 3 Server version: 10.5.19-MariaDB-1:10.5.19+maria~ubu2004 mariadb.org binary distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> show character set; +----------+-----------------------------+---------------------+--------+ | Charset | Description | Default collation | Maxlen | +----------+-----------------------------+---------------------+--------+ | big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 | | dec8 | DEC West European | dec8_swedish_ci | 1 | | cp850 | DOS West European | cp850_general_ci | 1 | | hp8 | HP West European | hp8_english_ci | 1 | | koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 | | latin1 | cp1252 West European | latin1_swedish_ci | 1 | | latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 | | swe7 | 7bit Swedish | swe7_swedish_ci | 1 | | ascii | US ASCII | ascii_general_ci | 1 | | ujis | EUC-JP Japanese | ujis_japanese_ci | 3 | | sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 | | hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 | | tis620 | TIS620 Thai | tis620_thai_ci | 1 | | euckr | EUC-KR Korean | euckr_korean_ci | 2 | | koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 | | gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 | | greek | ISO 8859-7 Greek | greek_general_ci | 1 | | cp1250 | Windows Central European | cp1250_general_ci | 1 | | gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 | | latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 | | armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 | | utf8 | UTF-8 Unicode | utf8_general_ci | 3 | | ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 | | cp866 | DOS Russian | cp866_general_ci | 1 | | keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 | | macce | Mac Central European | macce_general_ci | 1 | | macroman | Mac West European | macroman_general_ci | 1 | | cp852 | DOS Central European | cp852_general_ci | 1 | | latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 | | utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 | | cp1251 | Windows Cyrillic | cp1251_general_ci | 1 | | utf16 | UTF-16 Unicode | utf16_general_ci | 4 | | utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 | | cp1256 | Windows Arabic | cp1256_general_ci | 1 | | cp1257 | Windows Baltic | cp1257_general_ci | 1 | | utf32 | UTF-32 Unicode | utf32_general_ci | 4 | | binary | Binary pseudo charset | binary | 1 | | geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 | | cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 | | eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 | +----------+-----------------------------+---------------------+--------+
带调试选项环境执行结果
Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 3 Server version: 10.5.19-MariaDB-debug Source distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> show character set; +---------+------------------+---------------------+--------+ | Charset | Description | Default collation | Maxlen | +---------+------------------+---------------------+--------+ | big5 | | big5_chinese_ci | 2 | | latin1 | | latin1_swedish_ci | 1 | | latin2 | | latin2_general_ci | 1 | | ujis | | ujis_japanese_ci | 3 | | sjis | | sjis_japanese_ci | 2 | | tis620 | | tis620_thai_ci | 1 | | euckr | | euckr_korean_ci | 2 | | gb2312 | | gb2312_chinese_ci | 2 | | cp1250 | | cp1250_general_ci | 1 | | gbk | | gbk_chinese_ci | 2 | | utf8 | | utf8_general_ci | 3 | | ucs2 | | ucs2_general_ci | 2 | | utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 | | utf16 | UTF-16 Unicode | utf16_general_ci | 4 | | utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 | | utf32 | UTF-32 Unicode | utf32_general_ci | 4 | | binary | | binary | 1 | | cp932 | | cp932_japanese_ci | 2 | | eucjpms | | eucjpms_japanese_ci | 3 | +---------+------------------+---------------------+--------+ 19 rows in set (0.003 sec)
试过该版本前后的其他版本,调试版均存在此问题,以下是可行的解决思路:
检查调试编译脚本的配置参数
打开./BUILD/compiling-pentium64-debug脚本,查看其中的cmake命令是否包含禁用ASCII字符集的参数,比如-DNO_ASCII=1或类似编译宏。如果有,直接移除该参数后重新执行编译脚本。手动添加ASCII字符集编译选项
若脚本中没有明确禁用,可手动在编译前指定启用ASCII字符集的cmake参数:cmake . -DWITH_DEBUG=1 -DDEFAULT_CHARSET=ascii -DDEFAULT_COLLATION=ascii_general_ci也可以直接修改编译脚本,将上述参数加入到cmake命令中,确保编译过程强制包含ASCII字符集。
验证字符集文件完整性
编译完成后,进入MariaDB安装目录的share/charsets文件夹,确认ascii.xml文件是否存在。如果缺失,从标准二进制版本的对应位置复制该文件过来,然后重启MariaDB服务,再执行show character set;验证是否加载成功。排查配置文件限制
检查调试版使用的my.cnf(或my.ini)配置文件,查看是否存在skip-character-set-client-handshake、character_set_server=latin1等可能限制ASCII字符集加载的配置,若有则注释掉相关项,重启服务后测试。调试字符集加载流程
若以上方法都无效,可直接跟踪源码调试:- 打开MariaDB源码中的
sql/charset.c文件,找到字符集初始化相关函数 - 使用gdb等调试工具设置断点,查看ASCII字符集是否在调试模式下被跳过初始化
- 检查源码中是否有条件编译分支(如
#ifdef DEBUG)导致ASCII字符集未被加载
- 打开MariaDB源码中的
内容的提问来源于stack exchange,提问作者techmojo974

