当前位置: 首页 > 编程日记 > 正文

服务器架设笔记——httpd插件支持mysql字符集选择

mysql数据库默认的字符集是latin1。默认情况下,我们编译的httpd插件是可以正常读取该类型的数据库,并且不会出现乱码。但是,如果我们的数据库变成其他格式,比如UTF8,那么默认读取出来的数据就是乱码,且无论我们怎么设置参数都不会起作用。(转载请指明出于breaksoftware的csdn博客)

我们看一个utf8类型数据库的例子,使用以下指令查看字符集

 SHOW VARIABLES LIKE 'character_set_%';

通过character_set_database的值,我们可以得知该数据库类型是utf8。这样我们在读取该数据库时,便需要指定utf8字符集。在其他语言中,我们一般如此设置

“charset=utf8"

我们尝试将这句话加入到连接数据库的参数中

status = apr_dbd_open(driver, pool_db, "host=localhost;user=user_name;pass=password;dbname=database_name;charset=utf8", &handle);

这句api可以执行成功,但是读取的结果还是乱码!这很不科学,于是我浏览了下apr数据库相关函数,发现没有一个特定的接口可以设定字符集。可以想象apr-util库只是对libmysql++-dev 复杂接口的封装。那么存在一种可能:apr-util实现还不全面。我们阅读apr_dbd_open的实现

    struct {const char *field;const char *value;} fields[] = {{"host", NULL},{"user", NULL},{"pass", NULL},{"dbname", NULL},{"port", NULL},{"sock", NULL},{"flags", NULL},{"fldsz", NULL},{"group", NULL},{"reconnect", NULL},{NULL, NULL}};unsigned int port = 0;apr_dbd_t *sql = apr_pcalloc(pool, sizeof(apr_dbd_t));sql->fldsz = FIELDSIZE;sql->conn = mysql_init(sql->conn);if ( sql->conn == NULL ) {return NULL;}for (ptr = strchr(params, '='); ptr; ptr = strchr(ptr, '=')) {/* don't dereference memory that may not belong to us */if (ptr == params) {++ptr;continue;}for (key = ptr-1; apr_isspace(*key); --key);klen = 0;while (apr_isalpha(*key)) {/* don't parse backwards off the start of the string */if (key == params) {--key;++klen;break;}--key;++klen;}++key;for (value = ptr+1; apr_isspace(*value); ++value);vlen = strcspn(value, delims);for (i = 0; fields[i].field != NULL; i++) {if (!strncasecmp(fields[i].field, key, klen)) {fields[i].value = apr_pstrndup(pool, value, vlen);break;}}ptr = value+vlen;}if (fields[4].value != NULL) {port = atoi(fields[4].value);}if (fields[6].value != NULL &&!strcmp(fields[6].value, "CLIENT_FOUND_ROWS")) {flags |= CLIENT_FOUND_ROWS; /* only option we know */}if (fields[7].value != NULL) {sql->fldsz = atol(fields[7].value);}if (fields[8].value != NULL) {mysql_options(sql->conn, MYSQL_READ_DEFAULT_GROUP, fields[8].value);}
#if MYSQL_VERSION_ID >= 50013if (fields[9].value != NULL) {do_reconnect = atoi(fields[9].value) ? 1 : 0;}
#endif#if MYSQL_VERSION_ID >= 50013/* the MySQL manual says this should be BEFORE mysql_real_connect */mysql_options(sql->conn, MYSQL_OPT_RECONNECT, &do_reconnect);
#endifreal_conn = mysql_real_connect(sql->conn, fields[0].value,fields[1].value, fields[2].value,fields[3].value, port,fields[5].value, flags);

粗略读了一下这段代码,可以得出以下几点判断:

  1. apr_dbd_open内部使用mysql_real_connect连接数据库
  2. apr_dbd_open可以解析的参数只有fields数组中定义的字段
  3. apr_dbd_open封装了mysql_options函数用于设置相关参数

我们从mysql的开发文档(http://dev.mysql.com/doc/refman/5.7/en/mysql-real-connect.html)中可以查阅到如下一句话

The user and passwd parameters use whatever character set has been configured for the MYSQL object. By default, this is latin1, but can be changed by calling mysql_options(mysql, MYSQL_SET_CHARSET_NAME, "charset_name") prior to connecting.

可以见得我们需要使用mysql_options,传递MYSQL_SET_CHARSET_NAME来设置字符集。但是通过对apr-util库的通篇搜索,mysql_options只是在apr_dbd_open中被使用了,且还搜索不到MYSQL_SET_CHARSET_NAME。那么我们可以认定apr-util还没实现”字符集选择“的功能。我们需要自己手工修改代码(/usr/src/apr-util-1.5.4/dbd/apr_dbd_mysql.c)

    struct {const char *field;const char *value;} fields[] = {{"host", NULL},{"user", NULL},{"pass", NULL},{"dbname", NULL},{"port", NULL},{"sock", NULL},{"flags", NULL},{"fldsz", NULL},{"group", NULL},{"reconnect", NULL},{"charset", NULL},{NULL, NULL}};

先设定好需要解析的字段,再在mysql_real_connect之前插入

    if (fields[10].value != NULL) {mysql_options(sql->conn, MYSQL_SET_CHARSET_NAME, fields[10].value);}

如此,重新编译apr-util和httpd库,我们的插件便可以支持数据库字符集的选择了。

相关文章:

只需3行代码自动生成高性能模型,支持4项任务,亚马逊发布开源库AutoGluon

作者 | KYLE WIGGERS编译 | AI科技大本营(ID:rgznai100)构建涉及图像、文本和表格数据集的机器学习应用并不容易。它需要特征工程或使用数据领域知识来创建使AI算法起作用的特征,还需要进行大量数据预处理,以确保训练模型时不会出…

在客户端(IE中)无法登录Citrix MetaFrame server的原因

当在IE中登录服务器时如果出现这面的错误提示: ERROR: The Citrix MetaFrame servers cannot process your request at this time. The Citrix XML Service object was not found. [404 Not Found] 我的原因是IE使用了8080端口,而我的Citrix XML servic…

虚拟化--015 配置VMware View Event database失败:

015 配置VMware View Event database失败:参考链接http://url.cn/VTq4zN 转载于:https://blog.51cto.com/williamliuwen/1686536

以金山界面库(openkui)为例思考和分析界面库的设计和实现——代码结构(完)

三年前,准备将金山界面库做一个全面的剖析。后来由于种种原因,这个系列被中断而一直没有更新。时过境迁,现在在windows上从事开发的人员越来越少,关注这块的技术的朋友也很少了。本以为这系列也随着技术的没落而不再被人所关注&am…

一包烟钱买到电动剃须刀,小米有品告诉你什么叫性价比

男人身上长得最快的是什么?答案是胡须。一名健康男性的胡须每天都要生长超过 0.4mm,比咱们头发的生长速度还快,这也是男人隔三差五就要剃须的原因之一。男人的一生是与胡子战斗一生,也是被剃须刀拖累的一生。出差办事儿&#xff0…

Label控件属性AssociatedControlID

可以使用Label控件来标注一个HTML表单字段。Label控件拥有属性AssociatedControlID,可以设置此属性来指向表示表单字段的ASP.NET控件。 例如,代码清单2-3中的页面含有一个简单的表单,表单包含两个字段用于输入名和姓。Label控件用于标注这两个TextBox控件。 Code<% Page Lan…

2015_8_21作业——有自翻译有复制他人的英语太差

date作用&#xff1a;打印或设置系统日期和时间格式:date [OPTION]...[FORMAT]date [u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]|是或 多选一的选项 ...代表同类内容可多次选项&#xff1a;注意短选项后不可加号-d,--dateSTRING显示时间字符串但不是立即&#xff1a;如date…

WMI技术介绍和应用——接收事件

时隔两三年&#xff0c;再次更新WMI系列博文。好在功能在三年前就已经实现了&#xff0c;现在只要补充些实例即可。 之前介绍的基本都是查询静态数据&#xff0c;而本文将要介绍非常有意思的事件接收功能。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 监控…

WML标签速查手册

WML标签速查手册 结构相关标签语法及属性<wml><wml xml:lang"lang" >    content</wml> WML元素的共有属性主要有3个&#xff0c;即id、class和xml:lang属性。WML的所有元素都有两个核心属性&#xff0c;即标识(id)和类(class)属性。它们主要用…

Python 三十大实践、建议和技巧

所有参与投票的 CSDN 用户都参加抽奖活动群内公布奖项&#xff0c;还有更多福利赠送作者 | Erik-Jan van Baaren译者 | 凯隐编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】2020年&#xff0c;你又立了什么新的 Flag&#xff1f;新一年…

点击通知栏后打开Activity,并传参

为什么80%的码农都做不了架构师&#xff1f;>>> Reciver中intent new Intent(context, MessageDetailsaActivity_.class);intent.putExtra("freshMessageId", String.valueOf(push.getObid()));intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Inten…

WMI技术介绍和应用——执行方法

在之前的博文中&#xff0c;我们主要介绍了如何使用WMI查询信息和接收事件。本文将介绍WMI的另一种用法——执行方法。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 这块的内容在msdn中有详细的介绍&#xff0c;如果想看原版的可以参阅《Example: Calling a…

动态指定超链接参数的几种方法(Passing a JavaScript variable into href of )

情景&#xff1a;有些环境下我们需要根据页面中JavaScript变量的值来确定某个&#xff08;某些&#xff09;超链接的参数&#xff0c;如“http://www.bla.com/test.aspx?var1”中&#xff0c;究竟var1等于多少&#xff0c;要根据JavaScript变量来判定 方法一&#xff1a;很简单…

知乎「致知计划之科学季」颁奖,创作者分享80万元奖金

1月11日&#xff0c;「致知计划之科学季」颁奖典礼在北京798艺术中心举行&#xff0c;近500名创作者到场参加。 为了激励创作者&#xff0c;推动优质内容持续产出&#xff0c;知乎的「致知计划」从四个方面对创作者进行了扶持。一是流量扶持&#xff0c;让专业、优质的内容获得…

Inno Setup制作应用程序安装包

我最近写了一个MFC应用程序&#xff0c;想发给其他的小伙伴玩一玩&#xff0c;直接发了个exe文件过去&#xff0c;结果发现小伙伴那边打不开。原来这个exe文件虽然是MFC静态编译的&#xff0c;但是还依赖了其他几个.dll文件&#xff0c;需要把这几个dll文件和exe文件放在同一个…

WMI技术介绍和应用——事件通知

在《WMI技术介绍和应用——WMI概述》中&#xff0c;我们使用了下图介绍WMI构架&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 我们之前介绍的使用WMI查询系统、硬件等信息的功能&#xff0c;是通过查询WMI静态数据的空间实现的。这个功能的核心是在上图中2&a…

OpenWebSpider 安装使用

OpenWebSpider 是一个很好用的网络爬虫,也可以叫做“网络蜘蛛”. 安装&#xff1a; 1.使用Vs.net 2003 编译&#xff0c; 记得要copy libmysql.dll到工程里 2.配置文件openwebspider.conf 将已经启动了的 mysql数据库用户名&#xff0c;密码填写好 3.数据库建立 执行 sql_struc…

杂谈 | 当前知识蒸馏与迁移学习有哪些可用的开源工具?

所有参与投票的 CSDN 用户都参加抽奖活动群内公布奖项&#xff0c;还有更多福利赠送作者&编辑 | 言有三来源 | 有三AI&#xff08;ID:yanyousan_ai&#xff09;【导读】知识蒸馏与迁移学习不仅仅属于模型优化的重要技术之一&#xff0c;也是提升模型跨领域泛化能力的重要技…

对 Thinking in java 4th Edition I/O DirList.java的疑问

2019独角兽企业重金招聘Python工程师标准>>> 以下原文代码&#xff1a; //: io/DirList.java // Display a directory listing using regular expressions. // {Args: "D.*\.java"} import java.util.regex.*; import java.io.*; import java.util.*; pub…

WMI技术介绍和应用——Instance/Method Provider

在《WMI技术介绍和应用——事件通知》一文中&#xff0c;我们提到了提供者&#xff08;Provider&#xff09;这个概念。我们还是要引入WMI的结构图&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 我们在1这层的Native C/C里可以看到若干Provider&#xff0c;这…

SSH 组建轻量级架构 附录 -- 遇到的问题和解答

action: nulljava.lang.ClassNotFoundException: org.springframework.web.struts.ContextLoaderPlugIn解决方法&#xff1a;加载 spring.jar 包 报 无法初始化at org.apache.struts.action.ActionServlet.initModulePlugIns(解决方法&#xff1a;删除 asm-2.2.3.jar springda…

TIOBE 1月编程语言排行榜:C语言再度「C 位」出道,Python惜败

整理 | 屠敏来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;【导读】在 2020 年初雪来临之际&#xff0c;TIOBE 官方在最新发布的 1 月编程语言榜单中为我们最终揭开了「 2019 年度编程语言」的神秘面纱&#xff0c;然意料之外情理之中&#xff0c;获此殊荣的并非是…

my项目的总结2015.8.26编

这已经是上上个星期的事了&#xff0c;现在回顾一下&#xff1a; 负责的模块是"my"&#xff0c;更精准的说应该是my里面的个人信息管理 由于项目分域&#xff0c;模块已经分好了&#xff0c;涉及到的只是在现有的基础上解决分域后遗留的历史问题 上点图吧&#xff1a…

WMI技术介绍和应用——Event Provider

在《WMI技术介绍和应用——Instance/Method Provider》一文中&#xff0c;我们介绍了Instance和Method Provider的编写方法。本文我们将介绍更有意思的“事件提供者”。在《WMI技术介绍和应用——事件通知》中&#xff0c;我们曾经提到事件是分为两种&#xff1a;intrinsic eve…

Windows server 2003 IP路由配置

1、静态路由&#xff1a;在静态路由中必须明确指出从源到目标所经过的路径2、默认路由&#xff1a;默认路由是一种特殊的静态路由&#xff0c;为那些在路由表中没有找到明确匹配的路由信息的数据包指定下一步跳地址。在Windows server 2003的计算机上配置默认网关时就为该计算机…

人工智能的下一个前沿:识别“零”和“无”

所有参与投票的 CSDN 用户都参加抽奖活动群内公布奖项&#xff0c;还有更多福利赠送作者 | Max Versace译者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;声明&#xff1a;本文为客座文章&#xff0c;仅是为作者的观点&#xff0c;不代表 IEEE Spectrum 或 …

File Operations In Java

2019独角兽企业重金招聘Python工程师标准>>> The “File” class in Java defines many useful methods, here is a program which demonstrates some of these methods. import java.io.*;public class streams {public static void main(String []args){File f1ne…

Cascade RPN,结构的艺术带来极致提升 | NeurIPS 2019

作者 | VincentLee来源 | 晓飞的算法工程笔记&#xff08;ID: gh_084c810bc839&#xff09;导读&#xff1a;论文提出Cascade RPN算法来提升RPN模块的性能&#xff0c;该算法重点解决了RPN在迭代时anchor和feature不对齐的问题&#xff0c;论文创新点足&#xff0c;效果也很惊艳…

IIS+PHP+MySQL+Zend Optimizer+GD库+phpMyAdmin安装配置[完整修正实用版]

IISPHPMySQLZend OptimizerGD库phpMyAdmin安装配置[完整修正实用版]IISPHPMySQLZend OptimizerGD库phpMyAdmin安装配置[完整修正实用版][补充]关于参照本贴配置这使用中使用的相关问题请参考关于WIN主机下配置PHP的若干问题解决方案总结这个帖子尽量自行解决,谢谢[url]http://b…

WMI技术介绍和应用——Event Consumer Provider

在《WMI技术介绍和应用——Event Provider》和《WMI技术介绍和应用——接收事件》中&#xff0c;我们展现了如何处理和事件相关的WMI知识。而《WMI技术介绍和应用——接收事件》一文则主要讲解了如何查询事件&#xff0c;这种查询是在我们进程存在时发生的&#xff0c;一旦我们…