PHP之mb_convert_variables使用

本文介绍了PHP函数mb_convert_variables的功能及用法,该函数用于转换一个或多个变量的字符编码,并附带示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mb_convert_variables

  • (PHP 4 >= 4.0.6, PHP 5, PHP 7)
  • mb_convert_variables — Convert character code in variable(s)
  • mb_convert_variables — 转换一个或多个变量的字符编码

Description

string mb_convert_variables ( string $to_encoding , mixed $from_encoding , mixed &$vars [, mixed &$... ] )
//Converts character encoding of variables vars in encoding from_encoding to encoding to_encoding.
//将变量 vars 的编码从 from_encoding 转换成编码 to_encoding。
//mb_convert_variables() join strings in Array or Object to detect encoding, since encoding detection tends to fail for short strings. Therefore, it is impossible to mix encoding in single array or object.
//mb_convert_variables() 会拼接变量数组或对象中的字符串来检测编码,因为短字符串的检测往往会失败。因此,不能在一个数组或对象中混合使用编码。

Parameters

to_encoding

  • The encoding that the string is being converted to.
  • 将 string 转换成这个编码。

from_encoding

  • from_encoding is specified as an array or comma separated string, it tries to detect encoding from from-coding. When from_encoding is omitted, detect_order is used.
  • from_encoding 可以指定为一个 array 或者逗号分隔的 string,它将尝试根据 from-coding 来检测编码。 当省略了 from_encoding,将使用 detect_order。

vars

  • vars is the reference to the variable being converted. String, Array and Object are accepted. mb_convert_variables() assumes all parameters have the same encoding.
  • vars 是要转换的变量的引用。 参数可以接受 String、Array 和 Object 的类型。 mb_convert_variables() 假设所有的参数都具有同样的编码。

...

  • Additional vars.
  • 额外的 vars。

Return Values

  • The character encoding before conversion for success, or FALSE for failure.
  • 成功时返回转换前的字符编码,失败时返回 FALSE。

Examples

<?php
/**
 * Created by PhpStorm.
 * User: zhang
 * Date: 2018/1/29
 * Time: 16:29
 */

/* 转换变量 $post1、$post2 编码为内部(internal)编码 */
$post1 = "hello";
$post2 = "中国";
echo $post2 . PHP_EOL;
$interenc = mb_internal_encoding();
echo $interenc.PHP_EOL;
$inputenc = mb_convert_variables( $interenc,
    "ASCII,UTF-8,SJIS-win",
    $post1,
    $post2 );
if ( $inputenc ) {
    echo $post1 . PHP_EOL;
    echo $post2 . PHP_EOL;
}

文章参考

转载注明出处

转载于:https://www.cnblogs.com/zhangrxiang/p/8387180.html

<think>我们正在处理MySQL字符集转换问题,特别是从GBK到UTF-8的转换。根据引用内容,我们可以总结以下关键点:1.MySQL允许在客户端连接时指定字符集(引用1)。2.直接导入时如果源文件编码和目标数据库字符集设置不一致会导致乱码(引用2)。3.在导入前需要修改导出的SQL文件,加入设置字符集的语句,并修改表定义中的字符集(引用2)。4.使用mysqldump导出数据时,可以指定默认字符集(引用3)。因此,转换过程需要以下步骤:步骤1:备份原始数据(非常重要)步骤2:修改数据库、表和字段的字符集为UTF8步骤3:确保客户端连接使用正确的字符集步骤4:在导出和导入时指定正确的字符集具体操作如下:###1.备份数据库在进行任何转换操作前,请务必备份数据库。```bashmysqldump-uroot-p--default-character-set=gbk--databasesyour_database>backup_gbk.sql```###2.修改数据库默认字符集```sqlALTERDATABASEyour_databaseCHARACTERSETutf8COLLATEutf8_general_ci;```###3.修改表的字符集对于每张表,执行:```sqlALTERTABLEyour_tableCONVERTTOCHARACTERSETutf8COLLATEutf8_general_ci;```注意:这将同时转换表中所有字符类型字段的字符集。###4.导出数据(如果需要在转换后重新导入)如果在转换过程中需要导出数据再导入,则导出时应指定字符集为gbk(因为原始数据是gbk编码),然后在导入时指定utf8。导出(使用gbk字符集导出,以避免导出过程中乱码):```bashmysqldump-uroot-p--default-character-set=gbkyour_database>data_gbk.sql```###5.修改导出的SQL文件打开导出的SQL文件,进行以下修改:-在文件开头添加:`SETNAMESutf8;`-将文件中所有的`CHARSET=gbk`(或`CHARSET=latin1`)替换为`CHARSET=utf8`###6.导入数据导入修改后的SQL文件:```bashmysql-uroot-p--default-character-set=utf8your_database<data_gbk_modified.sql```###7.检查数据导入后,检查数据是否正常,没有乱码。###注意事项-如果原始数据已经是乱码(可能是由于之前错误的字符集设置导致),那么转换可能无法修复已经损坏的数据。-在转换之前,最好先在一个测试数据库上进行试验。-确保应用程序连接数据库时也使用UTF-8字符集(在连接字符串中指定,如PHP中的`mysqli_set_charset($con,"utf8")`)。###另一种方法:直接转换而不导出导入如果数据库不大,可以直接使用SQL语句转换整个数据库:```sqlALTERDATABASEyour_databaseCHARACTERSETutf8COLLATEutf8_general_ci;```然后对每张表执行:```sqlALTERTABLEyour_tableCONVERTTOCHARACTERSETutf8COLLATEutf8_general_ci;```这种方法会直接修改表和字段的字符集,并重新编码数据(前提是MySQL能够正确识别原始编码为GBK)。但这种方法在数据量很大时可能会很慢。###总结根据引用内容,关键是在转换过程中保持数据编码的一致性,并在导入导出时正确指定字符集。同时,修改SQL文件中的字符集定义和设置`SETNAMES`也是必要的步骤。§§相关问题§§1.如何检查MySQL数据库当前的字符集配置?2.在转换字符集时,如何避免数据丢失或乱码?3.MySQL中字符集和校对规则(collation)有什么区别?4.如果转换后出现乱码,应该如何排查和修复?</think>### MySQL GBK 转 UTF-8 完整解决方案 #### 核心原理 MySQL 字符集转换需同时处理**存储编码**(数据库/表/字段级)和**连接编码**(客户端/服务端通信)。GBK 到 UTF-8 的转换需确保: 1. 存储层正确转换数据编码 2. 连接层统一使用 UTF-8 通信 3. 应用程序同步适配 --- ### 完整操作流程 #### 一、预处理(关键步骤) 1. **备份数据库** ```bash mysqldump -u root -p --default-character-set=gbk --hex-blob --databases your_db > backup_gbk.sql ``` *参数说明:* - `--default-character-set=gbk`:按原始编码导出 - `--hex-blob`:避免二进制数据损坏 2. **检查当前字符集** ```sql SHOW VARIABLES LIKE 'character_set%'; SHOW CREATE DATABASE your_db; ``` #### 二、转换操作 **方法1:直接修改数据库(推荐)** ```sql -- 修改数据库默认字符集 ALTER DATABASE your_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 逐表转换(生成批量语句) SELECT CONCAT('ALTER TABLE ', table_name, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') FROM information_schema.tables WHERE table_schema = 'your_db'; ``` *执行生成的 ALTER 语句* **方法2:通过 SQL 文件转换** 1. 编辑备份文件: ```diff + SET NAMES utf8mb4; - CHARSET=gbk + CHARSET=utf8mb4 ``` 2. 重新导入: ```bash mysql -u root -p --default-character-set=utf8mb4 your_db < backup_modified.sql ``` #### 三、连接层配置 1. **MySQL 配置文件** (`my.cnf`): ```ini [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci ``` 2. **应用程序连接**(示例): ```php // PHP mysqli_set_charset($conn, "utf8mb4"); // JDBC jdbc:mysql://host/db?useUnicode=true&characterEncoding=UTF-8 ``` #### 四、验证转换结果 ```sql -- 检查实际存储数据 SELECT HEX(column_name) FROM table_name LIMIT 1; -- GBK "中" 字:HEX=D6D0 -- UTF-8 "中" 字:HEX=E4B8AD -- 查看元数据 SHOW CREATE TABLE your_table; ``` --- ### 关键注意事项 1. **编码范围问题** UTF-8 完全兼容 GBK,但需注意: - 使用 `utf8mb4`(非 `utf8`)支持 emoji 等 4 字节字符 - 排序规则选 `utf8mb4_unicode_ci` 更通用 2. **乱码修复原则** - 如果转换后乱码:检查连接字符集是否统一 - 如原始数据已损坏:需先用 `CAST() BINARY` 中转修复 3. **性能影响** 大表转换建议: - 在业务低峰期操作 - 使用 `pt-online-schema-change` 在线修改 --- ### 常见问题解决 **Q:转换后部分文字变成问号(?)** **原因**:连接层字符集不匹配 **解决方案**: ```sql SET NAMES utf8mb4; -- 立即生效 ``` **Q:导入 SQL 文件时报错 1366** **原因**:插入数据与目标字符集冲突 **修复步骤**: 1. 导出时添加 `--skip-set-charset` 2. 导入前执行 `SET NAMES gbk;` 3. 导入后再用 `ALTER TABLE` 转换 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值