我正在使用Adminer转储数据库并将其移至新数据库。两个数据库都在同一MySQL服务器5.5.5-10.1.41-MariaDB-0 + deb9u1上。两个数据库都使用latin1_swedish_ci
归类,如Adminer中所示。
这些随机字符串出现在数据库表中,即bs00fgcb
代表名称,hgaibbsf@example.org
代表电子邮件等。
当然,这些数据在导出数据库之前在应用程序前端正常显示,但是在导入到其他数据库并与其他应用程序一起查看后,在上方显示为垃圾。
在我导入新数据库之前,使用文本编辑器使用UTF-8进行查看时,此垃圾数据会出现在数据库转储中。没有其他数据似乎已损坏。
如果在文本编辑器中查看数据库转储之前先导入它,则会得到相同的垃圾数据。我已尝试多次导出和导入数据库。
这是导出文件头:
-- MySQL dump 10.15 Distrib 10.0.36-MariaDB, for debian-linux-gnu (x86_64)
--
-- Host: localhost Database: example_sql
-- ------------------------------------------------------
-- Server version 10.0.36-MariaDB-0ubuntu0.16.04.1
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
这似乎在导入时为每个表集调用一个字符:
DROP TABLE IF EXISTS `example_table`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
为什么在导出或导入时获得此车库数据?发生在哪里?
在导出之前,我不想尝试转换活动应用程序正在使用的数据库表排序规则。
我在一个导入的表上使用了select convert(binary convert(field_name using latin1) using utf8) from table_name
,但是它什么也没做。
答案 0 :(得分:0)
最后,我不确定是什么问题:导出和/或导入时为管理员;或者,表排序规则为double
,即使两个数据库使用相同的排序规则;甚至是服务器上非常老的linux版本和较新的MySQL版本之间的冲突。
但是我在强制UTF的同时通过SSH使用mysqldump导出,然后在导入数据库上将表排序规则更改为utf8_unicode_ci,并且有效。
因此,在强制utf8的同时直接使用mysqldump从MySQL导出:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Greetings mGreetings = new Greetings();
private TextView mTVgreetings;
private Button BTNmLights, BTNmGarage, mBTNsort;
private LightsFragment lightsFragment = new LightsFragment();
private GarageFragment garageFragment = new GarageFragment();
private Fragment currentFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initFunctions();
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.BTNlights:
if (!(currentFragment instanceof LightsFragment)) {
showLightsFragment();
}
break;
case R.id.BTNgarage:
if (!(currentFragment instanceof GarageFragment)) {
showGarageFragment();
}
showGarageFragment();
break;
case R.id.BTNsort:
openSortFragment();
break;
}
}
public void initFunctions() {
showLightsFragment();
showGreetings();
}
public void showLightsFragment() {
getSupportFragmentManager().beginTransaction().replace(R.id.main_fragment_container, this.lightsFragment)
.commit();
}
public void showGarageFragment() {
getSupportFragmentManager().beginTransaction().replace(R.id.main_fragment_container, this.garageFragment)
.commit();
}
public void showGreetings() {
mTVgreetings.setText(mGreetings.getGreetings());
}
public void initView() {
currentFragment = getSupportFragmentManager().findFragmentById(R.id.main_fragment_container);
mTVgreetings = findViewById(R.id.TVgreetings);
BTNmLights = findViewById(R.id.BTNlights);
BTNmGarage = findViewById(R.id.BTNgarage);
mBTNsort = findViewById(R.id.BTNsort);
BTNmLights.setOnClickListener(this);
BTNmGarage.setOnClickListener(this);
mBTNsort.setOnClickListener(this);
}
public void openSortFragment() {
getSupportFragmentManager().beginTransaction()
.setCustomAnimations(R.anim.enter_right_to_left, R.anim.exit_left_to_right)
.replace(R.id.sort_fragment_container, new SortFragment())
.commit();
}
}
或根据需要使用gzip:
for column in foo.columns:
df = df[~df[c].str.contains('DDD')]
然后,我将数据库上的表排序规则设置为latin1_swedish_ci
,并使用Adminer导入数据库。