【问题标题】:Select unicode character u2028 in mysql 5.1在mysql 5.1中选择unicode字符u2028
【发布时间】:2014-02-09 14:34:16
【问题描述】:

我正在尝试在 MySQL 5.1 中选择 unicdode 字符 /u2028。 MySQL 5.1 确实支持 utf8 和 ucs2。

在较新版本的 MySQL 中,我可以选择使用 utf16 或 utf32 排序规则的字符:

SELECT char(0x2028 using utf16);
SELECT char(0x00002028 using utf32);

但是 MySQL 5.1 不支持 utf16 和 utf32。那我怎么能选择unicode字符呢?

也许是关于我的用例的几句话:我有一个第三方应用程序,它将数据存储在 mysql 数据库中并使用 JavaScript 作为用户界面。应用程序不处理问题 unicode 字符 /u2028 和 /u2029 是有效的 JSON,但会破坏 JavaScript 代码。 (详情见http://timelessrepo.com/json-isnt-a-javascript-subset)所以我想知道有多少数据受到这个问题的影响,也许可以在MySQL上使用replace来修复它。


演示问题:

CREATE TABLE IF NOT EXISTS `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `string` varchar(100) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

INSERT INTO `test` (`id`, `string`) VALUES
(1, 'without U+2028'),
(2, 'with U+2028 at this "
    "point');

SELECT * FROM test WHERE string LIKE CONCAT("%", char(0x2028 using utf16), "%");
// returns row 2 as expected

SELECT * FROM test WHERE string LIKE CONCAT("%", char(??? using utf8), "%");
// U+2028 in utf8 is 0xE2 0x80 0xA8 isn't it?
// But how to parse this to char function?

【问题讨论】:

  • 不太确定是什么问题。 U+2028 是 MySQL 中 utf8 编码完美支持的字符。但是,CHAR 函数及其参数有些不同。为什么您想将文字 0x2028 转换为 UTF-8 编码的 U+2028 Unicode 字符?这真的是您要解决的问题吗?
  • U+2028 LINE SEPARATOR 很少使用。你确定你需要处理它吗?它可能会导致 JavaScript 出现问题,但这与 MySQL 有什么关系?
  • @JukkaK.Korpela 正如我在用例中所写的那样,我必须处理 U+2028 和 U+2029 只是因为它们在 JavaScript 中引起的问题。由于前端的 JavaScript 问题,我需要删除第三方应用程序的 MySQL 数据库的这些字符。
  • @deceze:我在问题中添加了问题的演示。最后,我喜欢为所有 U+2028 和 U+2029 字符编写一个查找和替换查询。
  • 2028 年我或多或少有同样的问题。对任何解决方案都感兴趣。

标签: mysql unicode utf-8


【解决方案1】:

Unicode 字符 U+2028 可以用 UTF-8 编码为十六进制 e280a8。所以答案是使用MySQL中的UNHEX函数来查找。

SELECT * FROM test WHERE string LIKE CONCAT("%", UNHEX('e280a8'), "%");

MySQL 5.1 只能处理 UTF-8 中最多三个字节长的字符。因此使用 UNHEX 搜索 U+2028 可以,但搜索 U+1F600 不会,因为它占用四个字节。

使用 UNHEX('e280a9') 搜索 U+2029。

要查找其他字符,请访问https://fileformat.info/info/unicode/char/2028/index.htm,将“2028”替换为您要查找的字符。在“UTF-8 (hex)”行中查找括号中的数字。

【讨论】:

  • 你从哪里得到/计算 U+2028 和 e280a8 之间的映射?我还有其他角色需要处理。
  • @Robert 我已经更新了答案以解释如何获取其他字符的映射。
猜你喜欢
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
相关资源
最近更新 更多