这看起来不是字符集,而是与排序规则相关。排序规则定义了 MySQL 在排序或比较时如何处理“几乎相等”的字符。
例如,iso-8859-15 默认排序规则将处理ü = u
您可以做的是将您的字段视为 bin 排序规则。二进制排序规则不会将相似字符视为相等。
选择正确的二进制排序规则
SELECT CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLLATIONS WHERE COLLATION_NAME LIKE '%bin%';
然后像这样执行更新:
UPDATE TABLE SET columnx = REPLACE( columnx COLLATE latin1_bin, '–', '-' );
更正:
替换比较总是使用二进制排序规则完成
编辑:
如果您仍然更新了 0 行,您可能没有替换正确的字符。将包含该字符的字符串转换为十六进制并发布十六进制值,以便我们可以找出我们正在谈论的字符
例如
SELECT HEX( columnx ) LIMIT 1;
编辑2:
刚刚看到,您实际上说您得到\u0096
了一个控制字符,称为START OF GUARDED AREA .. 这个字符创建的程序是什么.. 在十六进制中,这是0xC2 0x96
. 在您的示例查询中,您正在替换一个名为EN DASH的字符
很难通过粘贴来替换控制字符,转换可能会破坏它。相反,您可以使用UNHEX( hexval )告诉 MySQL 您指的是哪个字符
UPDATE TABLE SET columnx = REPLACE( columnx UNHEX( 'C296' ), '-' );
或者为了更清楚(甚至更令人困惑:)),这也将“正常”连字符作为十六进制值传递
UPDATE TABLE SET columnx = REPLACE( columnx UNHEX( 'C296' ), UNHEX( '2D' ) );