【问题标题】:Replace specific character MySQL search on utf8mb4_unicode_ci替换 utf8mb4_unicode_ci 上的特定字符 MySQL 搜索
【发布时间】:2019-03-10 07:53:54
【问题描述】:

我想在我的数据库中搜索字符 İ - “拉丁大写字母 i,上面带点 (U+0130)” - 并将其替换为常规 I (U+0049)。

例如,我想将“SİNG”转换为“SING”。

数据库排序规则是utf8mb4_unicode_ci。

我可以使用COLLATE utf8mb4_bin找到字符

SELECT *  FROM `benches` WHERE `inscription` LIKE '%İ%' COLLATE utf8mb4_bin

但我无法替换它。

UPDATE `benches` SET inscription = REPLACE(inscription, 'İ', 'I') WHERE  INSTR(inscription, 'İ') > 0 COLLATE utf8mb4_bin

我得到了错误

#1253 - COLLATION 'utf8mb4_bin' is not valid for CHARACTER SET 'latin1'

这很奇怪,因为数据库和列肯定是utf8mb4_unicode_ci

那么,我需要什么魔法调用来从字符串中搜索和替换特定的 Unicode 字符?

【问题讨论】:

  • 很可能您的表的字符集被定义为 latin1。请分享SHOW CREATE TABLE语句结果
  • SHOW CREATE TABLE benches 给出“inscription text COLLATE utf8mb4_unicode_ci NOT NULL”SHOW TABLE STATUS 给出所有表的utf8mb4_unicode_ci
  • 这听起来很明显,但是这个命令是从代码文件发出的吗?您在其中编写代码的文件是 UTF8 格式还是 ASCII/ANSI?它需要是UTF8。或者,也许您正在使用 Putty,这可能适用? thegreyblog.blogspot.com/2009/08/…。告诉我们更多关于您的环境的信息。
  • 我正在使用 PHPmyAdmin。
  • 你为什么使用两个不同的WHERE 子句?如果您使用WHERE inscription LIKE '%İ%' COLLATE utf8mb4_bin,第二个语句会发生什么,如果您使用WHERE INSTR(inscription, 'İ') > 0 COLLATE utf8mb4_bin,第一个语句会发生什么?

标签: mysql unicode


【解决方案1】:

快速修复可能是

UPDATE `benches`
    SET inscription = REPLACE(inscription, _utf8mb4'İ' COLLATE utf8mb4_bin, 'I')
    WHERE  INSTR(inscription, _utf8mb4'İ' COLLATE utf8mb4_bin) > 0

更好的解决方法可能是在连接后执行此操作:

SET NAMES utf8mb4;

如果这些都不起作用,请提供一个包含创建和填充表的测试用例,以及UPDATE。可能需要进行一些实验才能想出另一个潜在的解决方案。

【讨论】:

    【解决方案2】:

    我已经成功完成了如下查询:

    UPDATE `benches` 
    SET inscription = REPLACE(inscription, 'İ', 'I') 
    WHERE  inscription LIKE '%İ%' COLLATE utf8mb4_bin;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 2011-04-13
      • 2019-09-18
      • 2017-03-15
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      相关资源
      最近更新 更多