php - utf8_decode 未解码 ×(黑色菱形 �)

标签 php mysql

我正在修复一个数据库(不是整个数据库,逐个表),将 latin1_swedish_ci 字段移动到 utf8_bin,因为它有很多特殊字符(德语和西类牙语) 。并非所有字符的格式都是错误的。因此,有些字段是 á,其他字段是 à

我正在尝试

  • 第 1 步:复制表格
  • 第 2 步:将排序规则更改为 utf8,将电机更改为 InnoDBand
  • 第 3 步:PhpScript 更新数据

问题

  • 黑钻石 (�) utf_解码一些特殊字符。

SQL 查询

旧表

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

CREATE TABLE IF NOT EXISTS `customers_old` (
    `id` int(11) NOT NULL,
    `last_name` varchar(50) DEFAULT NULL,
    `first_name` varchar(50) COLLATE utf8_bin DEFAULT NULL
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

INSERT INTO `customers_old` (`id`, `last_name`, `first_name`) VALUES
(1, 'áéíóú', 'Gruße');

ALTER TABLE `customers_old`
    ADD PRIMARY KEY (`id`);

ALTER TABLE `customers_old`
    MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=2;

新表

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

CREATE TABLE IF NOT EXISTS `customers_new` (
    `id` int(11) NOT NULL,
    `last_name` varchar(50) COLLATE utf8_bin DEFAULT NULL,
    `first_name` varchar(50) COLLATE utf8_bin DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

INSERT INTO `customers_new` (`id`, `last_name`, `first_name`) VALUES
(1, 'áéíóú', 'Gruße');

ALTER TABLE `customers_new`
    ADD PRIMARY KEY (`id`);

ALTER TABLE `customers_new`
    MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=2;

PHP 脚本

更新客户

<?
# Classes
    include_once( "../db_functions.php" );
    $dbf = new DbFunctions();

# Functions
    function CheckStrangeCharacters( $string )
    {
        if ( strpos( $string, 'ã' ) !== false || strpos( $string, 'Ã' ) !== false ) 
        {
            $string = utf8_decode( $string );
        }

        return $string;
    }

# Load old customers
    $query = "SELECT * FROM customers_old";
    $customers = $dbf->Select( $query );

# Each customer
    for ( $i = 0; $i < count( $customers ); $i++ ) 
    { 
        # Assign variables
            $nv["id"]                       = $customers[$i]["id"];
            $nv["last_name"]                = $customers[$i]["last_name"];
            $nv["first_name"]               = $customers[$i]["first_name"];

        # Remove strange characters if contains ã or Ã
            $nv["last_name"]                = CheckStrangeCharacters( $nv["last_name"] );
            $nv["first_name"]               = CheckStrangeCharacters( $nv["first_name"] );

        # Update Reg
            $query = "UPDATE customers SET last_name = '" . $nv["last_name"] . "',  first_name = '" . $nv["first_name"] . "' WHERE id = " . $nv["id"];
            $response = $dbf->Update( $query );
        }
    }
?>

结果

旧表数据

| id |   last_name | first_name |
|  1 | 'áéíóú' |  'Grüße' |

新表数据

| id | last_name | first_name |
|  1 |   'áéíóú' |      'Grü' |

预期新表数据

| id | last_name | first_name |
|  1 |   'áéíóú' |    'Grüße' |

如果您在utf8_decode处回显first_name,它将显示Grü�?e

最佳答案

感谢 @CD001 ( https://stackoverflow.com/users/886824/cd001 ) 让我转向另一种方式。

在 stackoverflow 中找到了解决方案(How to convert latin1_swedish_ci data into utf8_general_ci?):

INSERT INTO customers_new (customers_new.first_name)
SELECT convert(cast(convert(customers_old.first_name using latin1) as binary) using utf8)
    FROM customers_old
    WHERE customers_old.id = 1

关于php - utf8_decode 未解码 ×(黑色菱形 �),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44108615/

相关文章:

php - 我将如何检索不同页面上的数据?

php - HTML 选择最后选择的下拉值?

php - 拉维尔 : BadMethodCallException Method [find] does not exist

mysql - 组函数的无效使用(MySQL)

php - Ioc 容器和动态语言(第 2 课)

php - session 混淆 PHP

Mysql Distinct 返回所有重复行

php - 上一个/下一个记录按钮 php/mysql 的问题

php - 获取当前登录用户的用户 ID 并将其作为外键值添加到不同的表中返回 null - MySQL - CodeIgniter

php - Laravel 查询生成器中的 MySQL YEAR() 等效项