PHP全角拉丁字符存入MySQL显示异常,求适配字符集方案
解决全角英文存入MySQL后的乱码问题
这个乱码我之前处理过,看起来是UTF-8字符被错误地以Latin1(ISO-8859-1)编码解码导致的——你看到的NETWORK,本质是全角字符的UTF-8字节被当作Latin1解析后,再转成UTF-8的结果。结合你的情况,推荐用utf8mb4字符集来解决,具体步骤如下:
1. 调整数据库、表和字段的字符集
MySQL默认的utf8其实是utf8mb3,只支持Unicode的一部分字符,而utf8mb4是完整的UTF-8实现,能覆盖包括全角英文在内的所有Unicode字符。
- 修改数据库字符集:
ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 修改目标表的字符集(会自动同步字段的字符集,除非字段单独设置过):
ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 如果字段有单独设置字符集,也可以单独修改:
ALTER TABLE your_table_name MODIFY COLUMN your_column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2. 确保PHP与MySQL连接时的字符集设置
PHP代码里打印正常,说明PHP本身处理字符是对的,但连接数据库时如果字符集不匹配,就会导致存库时转码错误。
- 如果你用PDO:
$pdo = new PDO( 'mysql:host=localhost;dbname=your_database;charset=utf8mb4', 'your_username', 'your_password' ); - 如果你用mysqli:
$conn = mysqli_connect('localhost', 'your_username', 'your_password', 'your_database'); mysqli_set_charset($conn, 'utf8mb4'); // 关键一步
3. 确认页面输出编码(可选)
你说PHP打印正常,这一步可能没问题,但还是确认下页面的Content-Type头是UTF-8:
header('Content-Type: text/html; charset=utf-8');
为什么之前的字符集没用?
你试的big5、gb2312是中文区域编码,ujis、sjis是日文编码,这些编码都不包含全角英文的Unicode码点,所以存入后自然会乱码。而utf8mb4是唯一能完整支持所有Unicode字符的MySQL字符集,所以能解决这个问题。
内容的提问来源于stack exchange,提问作者Die Minecrafter LP
相关产品推荐
相关产品推荐

