相关疑难解决方法(0)

MSSQL到MySQL迁移 - 使用UCS-2代理对的char编码问题,如何从MSSQL数据库中删除这些?

我的任务是将Microsoft SQL Server 2005数据库迁移到MySQL 5.6(这些都是本地运行的数据库服务器),非常感谢一些帮助.

-MSSQL源数据库有latin1归类(所以ISO 8859-1字符集对吗?)但是没有任何char/varchar字段(任何字符串字段是nvarchar/nchar)所以所有这些数据都应该使用UCS-2字符组.

-MySQL目标数据库想要字符集UTF-8

我决定在最新版本的MySQL工作台中使用数据库迁移工具包.起初它工作正常,并按预期迁移一切.但是在遇到MSSQL数据库中的UCS-2代理对字符时,我完全被绊倒了.

迁移工具包copytable程序没有提供非常有用的错误消息:"在wstring的charset转换期间出错:没有错误".它也没有提供有关引起问题的数据的任何字段/行信息,并且会在100行的块内失败.因此,在最后一次成功插入后搜索了100行后,我发现问题似乎是由其中一个nvarchar字段中的两个UCS-2字符引起的.它们在UCS-2字符集中列为代理对.它们特别是字符DBC0和DC83(我通过查看字段的二进制数据并将字节对(little endian)与正在成功迁移的数据进行比较得到了这一点).

当从MSSQL数据库中删除此代理对时,该行已成功迁移到MySQL.

这是问题所在:

我试图在测试MSSQL表中搜索这些字符(这个chartest表只是各种测试字符串和nvarchar字段)来准备替换脚本并不断得到奇怪的结果......我必须做错误的事情.

正在寻找

SELECT * FROM chartest WHERE text LIKE NCHAR(0xdc83)
Run Code Online (Sandbox Code Playgroud)

将返回任何代理对字符(无论它是否使用DC83),但显然,只有它是该字段中唯一的字符(或对的一部分).这不是什么大问题,因为我想删除这些的任何实例(我不想删除这样的数据,但我认为我们可以负担得起).

正在寻找

SELECT * FROM chartest WHERE text LIKE '%' + (NCHAR(0xdc83))+ '%'
Run Code Online (Sandbox Code Playgroud)

将返回每一行!无论它是否在场中都有unicode字符,更不用说DC83字符了.有没有更好的方法来查找和替换这些字符?或者别的什么我应该尝试?

我也尝试将目标数据库,表格和字段字符集设置为UCS-2,但似乎没有什么区别.

我还要提一下,这次迁移是使用实时数据(~50GB数据库!),而其中一个提供它的网站是脱机的,因此任何解决方案都需要快速运行...

非常感谢任何建议!如果我遗漏了任何信息,请告诉我.

mysql sql-server migration character-encoding

5
推荐指数
1
解决办法
6437
查看次数

当使用Openfire在两个iOS设备之间聊天时(使用MySQL数据库),Emoji不在离线聊天中工作

我有Openfire的问题,特别是对表情符号字符的支持.我在互联网上搜索发现,为了支持表情符号,我必须将数据库和表的编码和校对更改为UTF-8 unicode(utf8mb4).我已经使用以下SQL命令完成了这项工作:

SET NAMES utf8mb4;  
ALTER DATABASE openfire CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;  
ALTER TABLE ofOffline CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;  
Run Code Online (Sandbox Code Playgroud)

所以在上面的语句中,我正在更改数据库和表的字符集和排序规则.接下来,我读到我应该更改JDBC驱动程序以支持unicode.我的系统属性中的"database.defaultProvider.serverURL"条目具有以下值(使用Openfire管理网页):

jdbc:mysql://localhost:3306/openfire?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8
Run Code Online (Sandbox Code Playgroud)

当我在两个在线用户之间用表情符号发送消息时,它可以完美无瑕.当邮件的收件人处于脱机状态时,邮件将存储到数据库中,这就是出错的地方:表情符号未正确存储在数据库中(它存储为两个问号).

我的CREATE TABLE发言如下:

CREATE TABLE `ofMessageArchive` (
  `messageID` bigint(20) DEFAULT NULL,
  `conversationID` bigint(20) NOT NULL,
  `fromJID` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `fromJIDResource` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `toJID` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `toJIDResource` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `sentDate` bigint(20) NOT NULL,
  `stanza` mediumtext COLLATE utf8mb4_unicode_ci,
  `body` mediumtext COLLATE utf8mb4_unicode_ci, …
Run Code Online (Sandbox Code Playgroud)

mysql unicode xmpp openfire emoji

5
推荐指数
1
解决办法
1076
查看次数

删除4个字节的UTF8字符

我想从字符串中删除以\ xF0(带有ASCII代码0xF0的字符)开头的4字节UTF8字符并尝试

sText = Regex.Replace (sText, "\xF0...", "");
Run Code Online (Sandbox Code Playgroud)

这不起作用.使用两个反斜杠也不起作用.

确切的输入是https://de.wikipedia.org/w/index.php?title=Spezial:Exportieren&action=submit&pages=Unicode的内容4字节字符是文本"[[Violinschlüssel]]"之后的字符,十六进制表示法:.. 0x65 0x6c 0x5d 0x5d 0x20 0xf0 0x9d 0x84 0x9e 0x20 ..预期输出为0x65 0x6c 0x5d 0x5d 0x20 0x20 ..

怎么了?

c# regex utf-8

4
推荐指数
1
解决办法
1222
查看次数

LOAD DATA INFILE:无效的 ut8mb4 字符串

我正在使用 LOAD DATA INFILE 导入一些大表(iTunes EPF)。

\n\n

但是,导入失败并出现以下错误:

\n\n
string(52) "Invalid utf8mb4 character string: \'\xd7\x90\xd7\x9c \xd7\xa0\xd7\x90 \xd7\xaa\xd7\x9c\xd7\x9a\'"\n
Run Code Online (Sandbox Code Playgroud)\n\n

该表是这样创建的:

\n\n
CREATE TABLE `song-tmp` (\n  `song_id` int(11) NOT NULL DEFAULT \'0\',\n  `name` varchar(1000) DEFAULT NULL,\n  `title_version` varchar(1000) DEFAULT NULL,\n  `artist_display_name` varchar(1000) DEFAULT NULL,\n  PRIMARY KEY (`song_id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我正在使用的导入查询:

\n\n
LOAD DATA LOCAL INFILE \'/path/to/file\' INTO TABLE `song-tmp`\n  CHARACTER SET utf8mb4\n  FIELDS TERMINATED BY X\'01\' \n  LINES TERMINATED BY X\'020a\'\n  (@export_date, song_id, name, title_version, @search_terms, @parental_advisory_id, artist_display_name, @collection_display_name, @view_url, …
Run Code Online (Sandbox Code Playgroud)

mysql mariadb load-data-infile

4
推荐指数
1
解决办法
5466
查看次数

通过表单将表情符号添加到数据库时,错误的字符串错误

我可以使用终端使用mysql成功地将表情符号(即utf8mb4数据)添加到表中.

当我的Python Flask网站尝试将表情符号发送到同一个数据库表和字段时,数据库返回以下错误的字符串错误:

(1366,"错误的字符串值:'\ xF0\x9F\x98\x8E'用于第1行的'p_description'列")

UPDATE

  • 我读了建议的线程,并没有看到如何阻止服务器覆盖我的本地字符集服务器设置.
  • 添加了SET NAMES utf8mb4; INSERT INTO之前,但没有效果
  • 我按照评论中的建议进行了检查(谢谢!),是的,我的所有数据库字符设置都显示了utf8mb4.这是我从mysql获得的:

mysql> SHOW VARIABLES WHERE Variable_name LIKE'character_set_%'或Variable_name LIKE'collat​​ion%';

=>

| Variable_name | 价值|

| character_set_client | utf8mb4 |

| character_set_connection | utf8mb4 |

| character_set_database | utf8mb4 |

| character_set_filesystem | 二进制|

| character_set_results | utf8mb4 |

| character_set_server | utf8mb4 |

| character_set_system | utf8 |

| collat​​ion_connection | utf8mb4_unicode_ci |

| collat​​ion_database | utf8mb4_unicode_ci |

| collat​​ion_server | utf8mb4_unicode_ci |

10行(0.00秒)

我使用html表单,jQuery,AJAX和Python Flask将数据发送到数据库.Python调用下面的SQL存储过程.

存储过程:

CREATE DEFINER=`root`@`localhost` …
Run Code Online (Sandbox Code Playgroud)

python mysql forms sql-server stored-procedures

3
推荐指数
1
解决办法
2003
查看次数

com.mysql.jdbc.MysqlDataTruncation:数据截断:第1行的'aboutMeText'列数据太长

我正在尝试使用Spring-JPA更新列的值,值是emoji / smilies。但是收到错误消息说java.sql.BatchUpdateException:不正确的字符串值:'\ xF0 \ x9F \ x98 \ x84 \ xF0 \ x9F ...'

这是连接网址-

jdbc.url=jdbc:mysql:localhost:3306/woo?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&connectionCollation=utf8mb4_unicode_ci&characterSetResults=UTF-8
Run Code Online (Sandbox Code Playgroud)

这是调用代码

userProfile.setAboutMeText("\uD83D\uDE04\uD83D\uDC68\u200D\u2764\uFE0F\u200D\uD83D\uDC8B\u200D\uD83D\uDC68\uD83D\uDE02\uD83D\uDE20");
Run Code Online (Sandbox Code Playgroud)

这是实体

 @Entity
public class UserProfile implements Serializable {

    @Column(length = 1000)
private String aboutMeText;
@Id
private Long id;
public Long getId() {
    return id;
}

public void seId(Long id) {
    this.id = id;
}


public String getAboutMeText() {
   return JsonEscape.unescapeJson(aboutMeText);


}
 public void setAboutMeText(String aboutMeText) {
   this.aboutMeText = JsonEscape.escapeJson(aboutMeText);


}
Run Code Online (Sandbox Code Playgroud)

这是完整的错误:

HTTP Status 500 - Request processing failed; nested exception …
Run Code Online (Sandbox Code Playgroud)

spring hibernate jpa spring-mvc spring-data-jpa

3
推荐指数
1
解决办法
4157
查看次数