Pac*_*cer 14 mysql unicode ubuntu collation utf-8
所有的表都在utf_unicode_ci.
我这样做是为了检查
SELECT table_schema, table_name, column_name, character_set_name, collation_name
FROM information_schema.columns
WHERE collation_name <> 'utf8_unicode_ci' AND table_schema LIKE 'my_database'
ORDER BY table_schema, table_name, ordinal_position;
Run Code Online (Sandbox Code Playgroud)
并转换每个表以防万一
ALTER TABLE `my_database`.`table_name` DEFAULT COLLATE utf8_unicode_ci;
ALTER TABLE `my_database`.`table_name` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Run Code Online (Sandbox Code Playgroud)我的数据库整理设置在utf8_unicode_ci.
charsets是
mysql> show variables like 'char%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.02 sec)
整理是
mysql> show variables like 'colla%'; +----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | utf8_unicode_ci | | collation_database | utf8_unicode_ci | | collation_server | utf8_unicode_ci | +----------------------+-----------------+ 3 rows in set (0.00 sec)
无论我是通过Web浏览器还是通过mysql bash客户端调用存储过程,都会触发错误.以防我的ubuntu/linux语言环境设置如下:
$ locale LANG=es_ES.UTF-8 LANGUAGE=es_ES.UTF-8 LC_CTYPE=es_ES.UTF-8 LC_NUMERIC="es_ES.UTF-8" LC_TIME="es_ES.UTF-8" LC_COLLATE=es_ES.UTF-8 LC_MONETARY="es_ES.UTF-8" LC_MESSAGES=es_ES.UTF-8 LC_PAPER="es_ES.UTF-8" LC_NAME="es_ES.UTF-8" LC_ADDRESS="es_ES.UTF-8" LC_TELEPHONE="es_ES.UTF-8" LC_MEASUREMENT="es_ES.UTF-8" LC_IDENTIFICATION="es_ES.UTF-8" LC_ALL=
我能够解决这个问题的唯一方法是convert在每个查询中使用导致错误(或COLLATE在查询中使用),但问题是存在很多非常复杂的存储过程,因此很难识别"糟糕的"查询并花费大量时间.
我想不知怎的,从我的系统(ubuntu:mysql客户端,浏览器)传递给存储过程的变量是在utf8_general_ci中发送的,所以它与我的数据库中的ut8_unicode_ci冲突.
即使mysql连接设置为utf_unicode_ci,似乎os正在使用utf8_general_ci.
Pac*_*cer 18
我解决了我的问题,并且由于迁移过程中的错误转换,我转换为utf_general_ci而不是utf8_unicode_ci,所以尽管mysql数据库结构正确,但源数据编码错误(utf8_general_ci)并插入mysql ddbb那样.
所以问题是你可以在你的mysql数据库中拥有正确的字符集和排序规则,并且仍然会出现"非法混合排序"错误,因为数据被另一个排序规则所包含.
希望这有助于未来的某些人.
| 归档时间: |
|
| 查看次数: |
40428 次 |
| 最近记录: |