我正在修复一个数据库(不是整个数据库,逐个表),将 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/