mysql4.1 charset

手把手教你用CMake和GCC在Kylin Linux V10上编译MySQL 5.7 本文提供了一份在银河麒麟V10(Kylin Linux V10)操作系统上从源码编译安装MySQL 5.7的详细实战指南。文章深入解析了从GCC编译器、CMake构建系统的准备与配置,到MySQL源码编译、依赖处理及安装后初始化的完整流程,旨在帮助开发者和系统管理员在国产化平台上构建高性能、定制化的数据库服务。 阅读详情

A MySQL 4.1 Story

下面要写的是一篇非常无聊的东西,充斥了大量各式各样的编码、转换、客户端、服务器端、连接……呃,我自己都不愿意去看它,但想一想,写下来还是有点意义的,原因有四:

  1. MySQL 4.1 对多语言的支持有了很大变化 (这导致了问题的出现);
  2. 尽管大部分的地方 (包括个人使用和主机提供商),MySQL 3 仍然占主导地位;但 MySQL 4.1 是 MySQL 官方推荐的数据库,已经有主机提供商开始提供并将会越来越多;
  3. 许多 PHP 程序以 MySQL 作为默认的数据库管理软件,但它们一般不区分 MySQL 4.1 与 4.1 以下版本的区别,笼统地称“MySQL 3.xx.xx 以上版本”就满足安装需求了;
  4. 因为 latin1 在许多地方 (下边会详细描述具体是哪些地方) 作为默认的字符集,成功的蒙蔽了许多 PHP 程序的开发者和用户,掩盖了在中文等语言环境下会出现的问题;

简单的说,MySQL 自身的变化和使用 MySQL 的 PHP 程序对此忽略,导致了问题的出现和复杂化,而由于大部分用户使用的是英文,使这种问题不被重视。这里提到的 PHP 程序,主要就 WordPress 而言。

MySQL 4.1 字符集支持的原理

MySQL 4.1 对于字符集的指定可以细化到一台机器上安装的 MySQL,其中的一个数据库,其中的一张表,其中的一栏,应该用什么字符集。但是,传统的 Web 程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置,那么,默认的配置从何而来呢?

  1. 编译 MySQL 时,指定了一个默认的字符集,这个字符集是 latin1;
  2. 安装 MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;
  3. 启动 mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的;
  4. 此时 character_set_server 被设定为这个默认的字符集;
  5. 当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为 character_set_server;
  6. 当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;
  7. 在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;
  8. 当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;
  9. 这个字符集就是数据库中实际存储数据采用的字符集,mysqldump 出来的内容就是这个字符集下的;

简单的总结一下,如果什么地方都不修改,那么所有的数据库的所有表的所有栏位的都用 latin1 存储,不过我们如果安装 MySQL,一般都会选择多语言支持,也就是说,安装程序会自动在配置文件中把 default_character_set 设置为 UTF-8,这保证了缺省情况下,所有的数据库的所有表的所有栏位的都用 UTF-8 存储。

当一个 PHP 程序与 MySQL 建立连接后,这个程序发送给 MySQL 的数据采用的是什么字符集?MySQL 无从得知 (它最多只能猜测),所以 MySQL 4.1 要求客户端必须指定这个字符集,也就是 character_set_client,MySQL 的怪异之处在于,得到的这个字符集并不立即转换为存储在数据库中的那个字符集,而是先转换为 character_set_connection 变量指定的一个字符集;这个 connection 层究竟有什么用我不大明白,但转换为 character_set_connection 的这个字符集之后,还要转换为数据库默认的字符集,也就是说要经过两次转换;当这个数据被输出时,又要由数据库默认的字符集转换为 character_set_results 指定的字符集。

一个典型的环境

典型的环境以我自己的电脑上安装的 MySQL 4.1 为例,我自己的电脑上安装着 Apache 2,PHP 5 和 WordPress 1.5.1.3,MySQL 配置文件中指定了 default_character_set 为 utf8。于是问题出现了:

  1. WordPress 按照默认情况安装,所以所有的表都用 UTF-8 存储数据;
  2. WordPress 默认采用的浏览字符集是 UTF-8 (Options->Reading 中设置),因此所有 WP 页面的 meta 中会说明 charset 是 utf-8;
  3. 所以浏览器会以 utf-8 方式显示所有的 WP 页面;这样一来 Write 的所有 Post,和 Comment 都会以 UTF-8 格式从浏览器发送给 Apache,再由 Apache 交给 PHP;
  4. 所以 WP 从所有的表单中得到的数据都是 utf-8 编码的;WP 不加转换的直接把这些数据发送给 MySQL;
  5. MySQL 默认设置的 character_set_client 和 character_set_connection 都是 latin1,此时怪异的事情发生了,实际上是 utf-8 格式的数据,被“当作 latin1”转换成……居然还是转换成 latin1,然后再由这个 latin1 转换成 utf-8,这么两次转换,有一部分 utf-8 的字符就丢失了,变成 ??,最后输出的时候 character_set_results 默认是 latin1,也就输出为奇怪的东西了。

最神奇的还不是这个,如果 WordPress 中设置以 GB2312 格式阅读,那么 WP 发送给 MySQL 的 GB2312 编码的数据,被“当作 latin1”转换后,存进数据库的是一种奇怪的格式 (真的是奇怪的格式,mysqldump 出来就能发现,无论当作 utf-8 还是当作 gb2312 来读都是乱码),但如果这种格式以 latin1 输出出来,居然又能变回 GB2312!

这会导致什么现象呢?WP 如果使用 MySQL 4.1 数据库,把编码改用 GB2312 就正常了,可惜,这种正常只是貌似正常。

如何解决问题

如果你已经不耐烦了 (几乎是肯定的),google 一下,会发现绝大部分的解答是,query 之前先执行一下:SET NAMES 'utf8',没错,这是解决方案,但本文的目的是说明,这为什么是解决方案。

要保证结果正确,必须保证数据表采用的格式是正确的,也就是说,至少能够存放所有的汉字,那么我们只有两种选择,gbk 或者 utf-8,下面讨论 utf-8 的情况。

因为配置文件设置的 default_character_set 是 utf8,数据表默认采用的就是 utf-8 建立的。这也应该是所有采用 MySQL 4.1 的主机提供商应该采用的配置。所以我们要保证的只是客户端与 MySQL 交互之间指定编码的正确。

这只有两种可能,客户端以 gb2312 格式发送数据,或者以 utf-8 格式发送数据。

如果以 gb2312 格式发送:

SET character_set_client='gb2312'
SET character_set_connection='utf8' 或者 
SET character_set_connection='gb2312'

都是可以的,都能够保证数据在编码转换中不出现丢失,也就是保证存储入数据库的是正确的内容。

怎么保证取出的是正确的内容呢?考虑到绝大部分客户端 (包括 WP),发送数据的编码也就是它所希望收到数据的编码,所以:

SET character_set_results='gb2312'

可以保证取出给浏览器显示的格式就是 gb2312。

如果是第二种情况,客户端以 utf-8 格式发送 (WP 的默认情况),可以采用下述配置:

SET character_set_client='utf8'
SET character_set_connection='utf8'
SET character_set_results='utf8'

这个配置就等价于 SET NAMES 'utf8'。

WP 应该作什么修改

还是那句话,客户端要发给数据库什么编码的数据,数据库是不可能确切知道的,只能让客户端自己说明白,所以,WP 是必须发送正确的 SET... 给 MySQL 的。怎么发送最合适呢?台湾的 pLog 同仁给出了一些建议:

  1. 首先,测试服务器是否 >= 4.1,编译时是否加入了 UTF-8 支持;是则继续
  2. 然后测试数据库以什么格式存储 ($dbEncoding);
  3. SET NAMES $dbEncoding

对于第二点,WP 的情况是不同的,按照上面的典型配置,只要用 WP,肯定数据库是用 UTF-8 存储的,所以要根据用户设置的以 GB2312 还是 UTF-8 浏览来判断 (bloginfo('charset')),但这个值是要连接数据库以后才能得到的,所以效率最高的方式是连接数据库之后,根据这个配置设置一次 SET NAMES,而不必每次查询之前都设置一遍。

我的修改方式是这样的,在 wp_includes/wp-db.php 中增加:

function set_charset($charset)
{
    // check mysql version first.
    $serverVersion = mysql_get_server_info($this->dbh); 
    $version = explode('.', $serverVersion); 
    if ($version[0] < 4) return; 

    // check if utf8 support was compiled in 
    $result = mysql_query("SHOW CHARACTER SET like 'utf8'", 
                          $this->dbh); 
    if (mysql_num_rows($result) < = 0) return;

    if ($charset == 'utf-8' || $charset == 'UTF-8')
        $charset = 'utf8';
    @mysql_query("SET NAMES '$charset'", $this->dbh); 
}

在 wp-settings.php 的 require (ABSPATH . WPINC . '/vars.php'); 后增加:

$wpdb->set_charset(get_bloginfo('charset'));
手把手教你用Vivado的STARTUPE3原语驱动S25FL256S Flash(附完整Verilog代码) 本文详细介绍了如何利用Xilinx UltraScale+系列FPGA的STARTUPE3原语驱动S25FL256S SPI Flash,包括原语配置、SPI协议实现、状态机设计及调试技巧。通过完整的Verilog代码示例和性能优化建议,帮助开发者高效完成Flash通信解决方案的开发与集成。 阅读详情

相关推荐

鼎捷T100二次开发实战:如何给开窗功能加上权限锁(附完整代码)

本文详细解析了鼎捷T100二次开发中开窗功能权限锁的实现方法,提供了两种技术方案:开窗程序重构法和动态WHERE条件注入法,并附上完整代码示例。通过真实案例,帮助开发者解决数据权限细粒度控制的难题,提升ERP系统的安全性和实用性。

weixin_28454475的博客 442

深入Mysql字符集设置

· 作者:laruence(http://www.laruence.com/) · 本文地址: http://www.laruence.com/2008/01/05/12.html · 转载请注明出处 根据Chaos  Wang的PPT整理而成, 在此再次感谢Chaos Wang的此次TechTalk  基本概念• 字符(Character)是指人类语言中最小

雪候鸟的专栏 7764

【亲测有效】OpenClaw Gateway 出现 “(no output)“ 卡死问题完整解决指南:从手动重启到 systemd Watchdog 自动恢复

最近在使用 OpenClaw(自托管 AI 助手框架,前身 Clawdbot/Moltbot)时,遇到了一个非常常见的顽疾:TUI(终端界面)或 Telegram 等通道经常显示 "(no output)",消息发出去后机器人完全没反应,看起来像是卡死了。

hampeter的博客 8607

mysql 设置字符集

功能:让mysql数据库能够支持中文,必须设置系统字符集编码 输入命令: show variables like ‘char%’; 可以查看当前连接系统的情况 然后输入 set character_set_database=’gbk’; set character_set_server=’gbk’; 讲数据库和服务器的字符集均设为gbk(中文) 最后输入命令 sta...

周子博的博客 1万+

【Clickhouse从入门到精通】第60篇:ClickHouse生态总结与未来展望

ClickHouse系列收官总结 本文作为《ClickHouse从入门到精通》系列的第60篇收官之作,系统回顾了整个系列的知识体系。文章从基础概念到高级应用,全面梳理了ClickHouse的核心技术: 知识体系:完整回顾了60篇文章的知识图谱,包括列式存储原理、MergeTree引擎家族、分布式架构等核心内容 生态工具:详细盘点了ClickHouse的企业版工具、运维监控、数据集成和可视化方案 版本演进:分析了从21.x到24.x的主要版本特性升级 未来趋势:展望了向量化引擎、湖仓一体、AI集成等发展方向

xyghehehehe的专栏 438

AURIX-TC3xx-GTM详解六-DPLL(Digital PLL Module)-寄存器1-DPLL寄存器

主要有下图这些寄存器2、

m0_69929716的博客 438

修改mysql字符集为utf8mb4

修改mysql字符集为utf8mb4 要求MySQL版本&amp;amp;amp;gt;= 5.5.3 查看字符集 查看MYSQL数据库服务器和数据库字符集 方法一:show variables like '%character%'; 方法二:show variables like 'collation%'; 查看MYSQL所支持的字符集 show charset; 查看库的字符集 语法:show dat...

灯塔永不熄灭的博客 1万+

2025华为杯第二十二届中国研究生数学建模竞赛D题:低空湍流监测及最优航路规划 - 完整解题分析+完整MATLAB源码!(上篇)

🎓 本文收录于 《滚雪球学数学建模》专栏,本专栏专注于从零基础出发,带你循序渐进掌握数学建模的核心方法与思维路径。通过“滚雪球式”学习法,从最简单的生活化案例到经典建模工具,再到省赛、国赛真题实战演练,逐步积累知识与技能,帮助你搭建完整的建模体系。无论你是刚接触建模的新生,还是希望提升科研与竞赛能力的学者与工程师,本专栏都将为你提供一条清晰、高效、可实操的建模成长路线,助力你快速进阶,突破难点,迈向数学建模竞赛与实际应用的更高峰 🚀!

**My Coding Family** 2583

mysql字符编码原理,深入mysql字符集原理[转]

基本概念• 字符(Character)是指人类语言中最小的表义符号。例如’A’、’B’等;•给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encoding)。例如,我们给字符’A’赋予数值0,给字符’B’赋予数值1,则0就是字符’A’的编码;• 给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集(CharacterSet)。例如,给...

weixin_29552815的博客 212

“华为杯”研究生数学建模竞赛2020年-【华为杯】D题:无人机集群协同对抗(附获奖论文和MATLAB代码实现)

1.问题重述摘 要:本文针对非线性约束条件下红蓝双方无人机集群协同对抗的最优规划问题,结合贪婪队形、非线性规划、内点法、蒙特卡洛方法和全联立正交配置有限元法,构建了无人机集群协同对抗推演模型。,构建了。我们综合考虑了,和。首先分析红方在集群约束下的贪婪队形和拦截策略,然后我们基于内点法联合MATLAB和AMPL编程求解蓝方突防的非线性规划解,最后基于蒙特卡洛法对整个蓝方突防过程进行推演,得到突防概率图。通过推演,我们提出了两块的区域作为所求区域,并对蓝方的最优突防策略进行分析。

getusushu的博客 1550

ICM20948 DMP代码详解(69)

ICM20948 DMP代码详解(69)

phmatthaus的专栏 614

MySql的编码问题

下面要写的是一篇非常无聊的东西,充斥了大量各式各样的编码、转换、客户端、服务器端、连接……呃,我自己都不愿意去看它,但想一想,写下来还是有点意义的,原因有四: MySQL 4.1 对多语言的支持有了很大变化 (这导致了问题的出现); 尽管大部分的地方 (包括个人使用和主机提供商),MySQL 3 仍然占主导地位;但 MySQL 4.1 是 MySQL 官方推荐的数据库,已经有主机提供商开始提供

alvino的专栏 948

Vue - 详细实现低代码平台,支持拖曳式可视化生成应用软件功能,用户通过拖拽元素、搭积木的方式创建应用(适合迭代的基础架构、低代码平台)

Vue低代码平台-拖曳式拖拉拽可视化生成应用软件,拖拽式低代码数据可视化开发平台,vue实现拖拽,拖拽式Vue组件代码生成平台,基于vue的可视化拖拽代码生成工具,Vue实现可拖拽组件的方法,一个低代码平台的前端部分,靠拖拉拽生成页面。Vue技术栈从零实现低代码可视化搭建平台示例,低代码轮子,通过拖拽就可生成Vue代码的平台来了,vue低代码平台开发相关比低代码更强大的零代码开发平台,这款低代码SAAS数据可视化工具,拖拽生成大屏。vue实现拖拽效果,Vue自由拖拽缩放组件,自定义组件(文本、图片

🏆 前端领域优质创作者 1万+

charset和COLLATE

后缀_ci(Case Insensitive),即大小写无关,也就是说” B”和”b”在排序和比较的时候是一视同仁的。但凡是mysql中涉及到字符类型(VARCHAR,CHAR,TEXT)的排序、比较(ORDER BY语句的顺序,WHERE条件中大于小于号筛选出来的结果),都和collate有关。对于一些需要占据4bytes的文字,mysql的utf8就不支持了,要使用utf8mb4才行。mysql中有utf8和utf8mb4两种编码,在mysql中请大家忘记utf8,永远使用utf8mb4。

weixin_45275399的博客 1362

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

为MySQL Connector Net连接MySQL使用正确的连接字符串

在使用MyODBC或是MySQLDriverCS连接MySQL数据库时,我们只需要输入数据库主机地址、数据库名称、数据库访问账号和数据库的访问密码就可以正常使用了。但MySQL Connector Net却不是这样。在使用"host=localhost;database=test;uid=root;pwd=;"这个字符串连接MySQL时,保存到数据库中的中文字符总是变成类似???的那美克星文。不解

AdNT的专栏 2196

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

mysql里的like问题

方法一:解决方法是对于包含中文的字段加上"binary"属性,使之作为二进制比较,例如将"name char(10)"改成"name char(10)binary"。方法二:如果你使用源码编译MySQL,可以编译MySQL时使用--with--charset=gbk 参数,这样MySQL就会直接支持中文查找和排序了。方法三:可以使用 Mysql 的 locate 函数来判断。以上述问题为例,使用方

hs123的专栏 1090

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

mysql设置所有都为utf8_mysql解决乱码1:全部设置为utf8的编码。

看了很多文档还是一头雾水。mysql在4.1后就支持多语言。+--------------------------+----------------------------+| Variable_name | Value |+--------------------------+----------------------------...

weixin_30700123的博客 316

bcscale php,【PHP开发】bcscale timezone charset的设定说明

本文主要讲述的是在PHP开发中的bcscale timezone charset的设定,即将用到这几个函数的朋友一定要了解一下哦!关于php的开发,有几个细节设定,需要知悉下:在项目的init.php 或 index.php 或 api.php1. bcscale(18);表示bc函数,默认小数点位数。没有设定的话,默认为0,表示整数结果处理。会出现bcadd ,bcsub 等 截取值为整数。之...

weixin_39610724的博客 78

修改mysql默认字符集为latin1_关于utf 8:mysql将默认字符集latin1更改为utf8

我有PHP 5.5.9和MySQL 5.5.43 Innodb。这是在Kubuntu LTS /etc/mysql/my.cnf中printf("当前字符集:%s n",mysqli_character_set_name($ conn));当前字符集:latin1我试过了默认字符集= utf8首先但是然后我的mysql服务器没有重启然后我尝试了字符集服务器= utf8然后我的mysql shel...

weixin_39844267的博客 571

python utf8mb4_使用Python将UTF-8字符串写入MySQL

如@ marr75所建议,请确保已设置charset='utf8'连接。设置字符集暗示了设置use_unicode=True不是严格必需的。然后确保将unicode对象传递给数据库连接,因为它将使用传递给游标的字符集对其进行编码。如果要传递utf8编码的字符串,则在到达数据库时将对其进行双重编码。因此,类似:conn = MySQLdb.connect(host="localhost", user...

weixin_39607090的博客 1671

python处理json数据 乱码报错_python操作mysql中文显示乱码的解决方法

本文实例展示了一个脚本python用来转化表配置数据xml并生成相应的解析代码。但是在中文编码上出现了乱码,现将解决方法分享出来供大家参考。具体方法如下:1. Python文件设置编码 utf-8 (文件前面加上 #encoding=utf-8)2. MySQL数据库charset=utf-83. Python连接MySQL是加上参数 charset=utf84. 设置Python的默认编码为 u...

weixin_35723352的博客 289

CodeIgniter 2.1.0 的白屏错误调试

今天在配置一个CodeIgniter 2.1.0时,遇到白屏,系统报500错误,但是Apache的错误日志中看不到任何错误信息输出。 经过简单的定位后,发现是由于在autoload中配置了自动加载database造成的,但是之前的版本用着都没问题呀,这个版本出这个问题,甚是奇怪。 系统的一些相关信息: OS:Cent OS 5.4 Apache:2.2.4 PHP:5.2.17 Mys...

weixin_34112030的博客 136

django,mysql存储emoji表情,utf8mb4

django使用mysql存储emoji表情,utf8mb4格式。

行之 1万+

J2EE1.4+MySQL5.1乱码

找到my.ini文件把default-character-set=latin1改为default-character-set=gbk有两处的都要改。我的安装路径在D:/Program Files/MySQL/MySQL Server 5.1/my.ini

256

使用hibernate读写mysql中文乱码问题(变?号)~

这几天做毕设,从java通过hibernate读写数据库, 出现读mysql中文字符正常,但是写的时候,出现中文变成”?”的问题,很是烦躁。在网上查了一下,主要有以下几个方面需要注意:   1.表的charset都设置成了utf8 ,collation设置成了utf8_general_ci; 2.表中每个column的charset和collation要跟1一致; 3.myeclipse

laibo850517的专栏 685

web写入mysql出现中文乱码_MySQL数据库中文乱码问题(在我开发web时,往数据库中插入数据时出现了中文乱码)...

想要用什么样的字符集都是要根据要求来的,那如果你安装数据库时,默认的字符集是uft-8,但是现在我们需要用的字符集市gbk,那怎么办?OK,有办法,首先,找到MySQL安装目录下的my.ini文件打开,里面有两处需要你改动字符集的地方(需要你自己细心去找,改成gbk)然后打开data文件夹,进入你想要进入的数据库,打开db.opt文件,改变成为统一的字符集(gbk),在然后,CREATE TABL...

weixin_34219634的博客 149
上一篇: MSXML. xmlhttp 的应用参考
下一篇: JavaScript数值问题
xiaocon
博客等级 码龄26年 4粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值