迁移ORACLE数据到myql中,经常遇到乱码问题,本文将根据实际讨论解决乱码问题。
一 通过SQL抽取数据从Oracle到MySQL中,可以按照以下步骤解决乱码问题:
- 确认源数据库(Oracle)和目标数据库(MySQL)的字符集是否一致。需要确保两者的字符集一致才能避免乱码问题。
- 在Oracle中执行语句,使用
NLS_CHARACTERSET
和NLS_NCHAR_CHARACTERSET
函数检查当前数据库字符集:
SELECT * FROM nls_database_parameters
WHERE parameter IN('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
- 在MySQL中执行语句,使用
SHOW VARIABLES
命令检查当前数据库字符集:
SHOW VARIABLES LIKE 'character_set_%';
- 如果两个数据库的字符集不一致,则需要在MySQL中修改字符集。可以使用以下SQL语句修改:
ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 然后在Oracle中执行SELECT语句,将数据导出为CSV格式文件。例如:
SELECT * FROM mytable INTO OUTFILE 'data.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY 'n';
- 假设在本地运行该命令,那么数据文件将被导出到Oracle服务器上,默认保存在服务器上的目录中。因此需要将其从服务器传输到本地。可以使用以下命令:
scp oracle@192.168.1.1:/path/to/data.csv /path/to/local
将上述命令中的/path/to/data.csv
和/path/to/local
修改为实际的路径和文件名。
- 数据文件可能仍然存在编码问题,需要使用
iconv
命令将其转换为MySQL支持的编码:
iconv -f GBK -t utf-8 -o data_utf8.csv data.csv
其中,GBK
表示源编码(Oracle的编码),utf-8
表示目标编码(MySQL的编码),-o
表示输出文件名。
- 最后,再将数据文件导入到MySQL中,可以使用以下命令:
LOAD DATA INFILE 'data_utf8.csv' INTO TABLE mytable CHARACTER SET utf8mb4 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY 'n';
在上述命令中,data_utf8.csv
表示已经转换为UTF-8
编码的数据文件名,mytable
表示要导入的MySQL数据库中的表名称,utf8mb4
表示要使用的字符集。
二 传送过程数据不放入文件,而是通过python程序直接用sql传递数据方式,如遇乱码问题可能是因为源数据库和目标数据库的字符集不一致所导致的。解决方法如下:
- 确保源数据库和目标数据库的字符集一致。可以使用SQL查询两个数据库的字符集,例如在Oracle中,查询
SELECT * FROM NLS_DATABASE_PARAMETERS;
在MySQL中查询
SHOW VARIABLES LIKE 'character_set_%' 或
SHOW VARIABLES LIKE 'collation%';
- 在读取Oracle数据库数据时,使用
NLS_LANG
参数指定字符集。
例如,在Python中使用
import os;
os.environ[‘LANG’] = ‘zh_CN.gbk’ - 在将数据插入到MySQL中时,通过设置MySQL的连接参数来指定字符集。
在connect()方法之中将charset参数的值设置为utf-8,代码如下
import MySQLdb
conn = MySQLdb.connect(host=’localhost’, user=’root’,passwd=’123′, db=’account’, charset=’utf8′)
还可以将当前python程序的字符编码用顶部注释的方法改成utf-8。 - 在数据传输过程中,可以使用一些数据转换工具,例如iconv和unix2dos等,将数据转换为目标字符集的格式再进行传输。
服务器租用托管,机房租用托管,主机租用托管,https://www.e1idc.com