【发布时间】: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给出“inscriptiontext 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,第一个语句会发生什么?